Mercurial > hg > release > icedtea8-forest-3.0 > nashorn
changeset 756:dcbcd41734d6
8031715: Indexed access to java package not working
Reviewed-by: lagergren, hannesw
author | sundar |
---|---|
date | Wed, 15 Jan 2014 14:51:49 +0530 |
parents | 9fe1f5e5db35 |
children | 6d0808f127bd |
files | src/jdk/nashorn/internal/objects/NativeJavaImporter.java src/jdk/nashorn/internal/runtime/NativeJavaPackage.java src/jdk/nashorn/internal/runtime/ScriptObject.java test/script/basic/JDK-8031715.js test/script/basic/JDK-8031715.js.EXPECTED |
diffstat | 5 files changed, 95 insertions(+), 18 deletions(-) [+] |
line wrap: on
line diff
--- a/src/jdk/nashorn/internal/objects/NativeJavaImporter.java Mon Jan 13 18:13:55 2014 +0530 +++ b/src/jdk/nashorn/internal/objects/NativeJavaImporter.java Wed Jan 15 14:51:49 2014 +0530 @@ -134,6 +134,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/src/jdk/nashorn/internal/runtime/NativeJavaPackage.java Mon Jan 13 18:13:55 2014 +0530 +++ b/src/jdk/nashorn/internal/runtime/NativeJavaPackage.java Wed Jan 15 14:51:49 2014 +0530 @@ -198,24 +198,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 @@ -226,4 +215,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/src/jdk/nashorn/internal/runtime/ScriptObject.java Mon Jan 13 18:13:55 2014 +0530 +++ b/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/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/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]