aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsundar <none@none>2014-01-15 14:51:49 +0530
committersundar <none@none>2014-01-15 14:51:49 +0530
commit5242e4b41b9d12ffe45c17f479ad6719992c08ad (patch)
tree203bf298fa7b98662e0cabfc3d2d0b170a7a2948
parent5feb4d2de6980be6646ccda376595f93a9211024 (diff)
downloadnashorn-5242e4b41b9d12ffe45c17f479ad6719992c08ad.tar.gz
8031715: Indexed access to java package not working
Reviewed-by: lagergren, hannesw
-rw-r--r--src/jdk/nashorn/internal/objects/NativeJavaImporter.java5
-rw-r--r--src/jdk/nashorn/internal/runtime/NativeJavaPackage.java37
-rw-r--r--src/jdk/nashorn/internal/runtime/ScriptObject.java3
-rw-r--r--test/script/basic/JDK-8031715.js49
-rw-r--r--test/script/basic/JDK-8031715.js.EXPECTED11
5 files changed, 91 insertions, 14 deletions
diff --git a/src/jdk/nashorn/internal/objects/NativeJavaImporter.java b/src/jdk/nashorn/internal/objects/NativeJavaImporter.java
index 3e46a2c7..56baf66d 100644
--- a/src/jdk/nashorn/internal/objects/NativeJavaImporter.java
+++ b/src/jdk/nashorn/internal/objects/NativeJavaImporter.java
@@ -134,6 +134,11 @@ public final class NativeJavaImporter extends ScriptObject {
return createAndSetProperty(desc) ? super.lookup(desc, request) : super.noSuchMethod(desc, request);
}
+ @Override
+ protected Object invokeNoSuchProperty(final String name) {
+ return createProperty(name);
+ }
+
private boolean createAndSetProperty(final CallSiteDescriptor desc) {
final String name = desc.getNameToken(CallSiteDescriptor.NAME_OPERAND);
final Object value = createProperty(name);
diff --git a/src/jdk/nashorn/internal/runtime/NativeJavaPackage.java b/src/jdk/nashorn/internal/runtime/NativeJavaPackage.java
index 534d495c..591fd327 100644
--- a/src/jdk/nashorn/internal/runtime/NativeJavaPackage.java
+++ b/src/jdk/nashorn/internal/runtime/NativeJavaPackage.java
@@ -198,8 +198,26 @@ public final class NativeJavaPackage extends ScriptObject {
@Override
public GuardedInvocation noSuchProperty(final CallSiteDescriptor desc, final LinkRequest request) {
final String propertyName = desc.getNameToken(2);
- final String fullName = name.isEmpty() ? propertyName : name + "." + propertyName;
+ createProperty(propertyName);
+ return super.lookup(desc, request);
+ }
+
+ @Override
+ protected Object invokeNoSuchProperty(final String name) {
+ return createProperty(name);
+ }
+
+ @Override
+ public GuardedInvocation noSuchMethod(final CallSiteDescriptor desc, final LinkRequest request) {
+ return noSuchProperty(desc, request);
+ }
+
+ private static MethodHandle findOwnMH(final String name, final Class<?> rtype, final Class<?>... types) {
+ return MH.findStatic(MethodHandles.lookup(), NativeJavaPackage.class, name, MH.type(rtype, types));
+ }
+ private Object createProperty(final String propertyName) {
+ final String fullName = name.isEmpty() ? propertyName : name + "." + propertyName;
final Context context = Context.getContextTrusted();
Class<?> javaClass = null;
@@ -209,21 +227,14 @@ public final class NativeJavaPackage extends ScriptObject {
//ignored
}
+ final Object propertyValue;
if (javaClass == null) {
- set(propertyName, new NativeJavaPackage(fullName, getProto()), false);
+ propertyValue = new NativeJavaPackage(fullName, getProto());
} else {
- set(propertyName, StaticClass.forClass(javaClass), false);
+ propertyValue = StaticClass.forClass(javaClass);
}
- return super.lookup(desc, request);
- }
-
- @Override
- public GuardedInvocation noSuchMethod(final CallSiteDescriptor desc, final LinkRequest request) {
- return noSuchProperty(desc, request);
- }
-
- private static MethodHandle findOwnMH(final String name, final Class<?> rtype, final Class<?>... types) {
- return MH.findStatic(MethodHandles.lookup(), NativeJavaPackage.class, name, MH.type(rtype, types));
+ set(propertyName, propertyValue, false);
+ return propertyValue;
}
}
diff --git a/src/jdk/nashorn/internal/runtime/ScriptObject.java b/src/jdk/nashorn/internal/runtime/ScriptObject.java
index 152681a6..4b85ed4e 100644
--- a/src/jdk/nashorn/internal/runtime/ScriptObject.java
+++ b/src/jdk/nashorn/internal/runtime/ScriptObject.java
@@ -2093,12 +2093,13 @@ public abstract class ScriptObject extends PropertyListenerManager implements Pr
return createEmptyGetter(desc, name);
}
+
/**
* Invoke fall back if a property is not found.
* @param name Name of property.
* @return Result from call.
*/
- private Object invokeNoSuchProperty(final String name) {
+ protected Object invokeNoSuchProperty(final String name) {
final FindProperty find = findProperty(NO_SUCH_PROPERTY_NAME, true);
if (find != null) {
diff --git a/test/script/basic/JDK-8031715.js b/test/script/basic/JDK-8031715.js
new file mode 100644
index 00000000..19994f51
--- /dev/null
+++ b/test/script/basic/JDK-8031715.js
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * JDK-8031715: Indexed access to java package not working
+ * @test
+ * @run
+ */
+
+print(java["net"]);
+print(java["net"]["URL"]);
+print(java["net"].URL);
+print(java.net["URL"]);
+
+var is = "InputStream";
+var io = "io";
+
+print(java.io[is]);
+print(java[io]);
+print(java[io][is]);
+
+var ji = new JavaImporter(java.util, java.io);
+print(ji["InputStream"]);
+print(ji['Vector']);
+
+var hash = "Hashtable";
+var printStream = "PrintStream";
+print(ji[hash]);
+print(ji[printStream]);
diff --git a/test/script/basic/JDK-8031715.js.EXPECTED b/test/script/basic/JDK-8031715.js.EXPECTED
new file mode 100644
index 00000000..1a71de34
--- /dev/null
+++ b/test/script/basic/JDK-8031715.js.EXPECTED
@@ -0,0 +1,11 @@
+[JavaPackage java.net]
+[JavaClass java.net.URL]
+[JavaClass java.net.URL]
+[JavaClass java.net.URL]
+[JavaClass java.io.InputStream]
+[JavaPackage java.io]
+[JavaClass java.io.InputStream]
+[JavaClass java.io.InputStream]
+[JavaClass java.util.Vector]
+[JavaClass java.util.Hashtable]
+[JavaClass java.io.PrintStream]