8031715: Indexed access to java package not working
Reviewed-by: lagergren, hannesw
--- a/nashorn/src/jdk/nashorn/internal/objects/NativeJavaImporter.java Tue Jan 14 14:18:24 2014 +0530
+++ b/nashorn/src/jdk/nashorn/internal/objects/NativeJavaImporter.java Wed Jan 15 14:51:49 2014 +0530
@@ -133,6 +133,11 @@
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);
--- a/nashorn/src/jdk/nashorn/internal/runtime/NativeJavaPackage.java Tue Jan 14 14:18:24 2014 +0530
+++ b/nashorn/src/jdk/nashorn/internal/runtime/NativeJavaPackage.java Wed Jan 15 14:51:49 2014 +0530
@@ -196,24 +196,13 @@
@Override
public GuardedInvocation noSuchProperty(final CallSiteDescriptor desc, final LinkRequest request) {
final String propertyName = desc.getNameToken(2);
- final String fullName = name.isEmpty() ? propertyName : name + "." + propertyName;
-
- final Context context = Context.getContextTrusted();
+ createProperty(propertyName);
+ return super.lookup(desc, request);
+ }
- Class<?> javaClass = null;
- try {
- javaClass = context.findClass(fullName);
- } catch (final NoClassDefFoundError | ClassNotFoundException e) {
- //ignored
- }
-
- if (javaClass == null) {
- set(propertyName, new NativeJavaPackage(fullName, getProto()), false);
- } else {
- set(propertyName, StaticClass.forClass(javaClass), false);
- }
-
- return super.lookup(desc, request);
+ @Override
+ protected Object invokeNoSuchProperty(final String name) {
+ return createProperty(name);
}
@Override
@@ -224,4 +213,26 @@
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;
+ try {
+ javaClass = context.findClass(fullName);
+ } catch (final NoClassDefFoundError | ClassNotFoundException e) {
+ //ignored
+ }
+
+ final Object propertyValue;
+ if (javaClass == null) {
+ propertyValue = new NativeJavaPackage(fullName, getProto());
+ } else {
+ propertyValue = StaticClass.forClass(javaClass);
+ }
+
+ set(propertyName, propertyValue, false);
+ return propertyValue;
+ }
}
--- a/nashorn/src/jdk/nashorn/internal/runtime/ScriptObject.java Tue Jan 14 14:18:24 2014 +0530
+++ b/nashorn/src/jdk/nashorn/internal/runtime/ScriptObject.java Wed Jan 15 14:51:49 2014 +0530
@@ -2093,12 +2093,13 @@
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) {
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/basic/JDK-8031715.js Wed Jan 15 14:51:49 2014 +0530
@@ -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]);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/basic/JDK-8031715.js.EXPECTED Wed Jan 15 14:51:49 2014 +0530
@@ -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]