This commit is contained in:
Abhijit Saha 2014-01-15 10:24:42 -08:00
commit e77bdad89b
5 changed files with 95 additions and 18 deletions

View File

@ -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);

View File

@ -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;
}
}

View File

@ -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) {

View 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]);

View 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]