Merge
This commit is contained in:
commit
e77bdad89b
@ -133,6 +133,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);
|
||||
|
@ -196,26 +196,15 @@ 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;
|
||||
|
||||
final Context context = Context.getContextTrusted();
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
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);
|
||||
@ -224,4 +213,26 @@ public final class NativeJavaPackage extends ScriptObject {
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
@ -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) {
|
||||
|
49
nashorn/test/script/basic/JDK-8031715.js
Normal file
49
nashorn/test/script/basic/JDK-8031715.js
Normal file
@ -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]);
|
11
nashorn/test/script/basic/JDK-8031715.js.EXPECTED
Normal file
11
nashorn/test/script/basic/JDK-8031715.js.EXPECTED
Normal file
@ -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]
|
Loading…
x
Reference in New Issue
Block a user