diff options
Diffstat (limited to 'src/jdk/nashorn/internal/runtime/NativeJavaPackage.java')
-rw-r--r-- | src/jdk/nashorn/internal/runtime/NativeJavaPackage.java | 47 |
1 files changed, 42 insertions, 5 deletions
diff --git a/src/jdk/nashorn/internal/runtime/NativeJavaPackage.java b/src/jdk/nashorn/internal/runtime/NativeJavaPackage.java index fbca1c34..2d110e08 100644 --- a/src/jdk/nashorn/internal/runtime/NativeJavaPackage.java +++ b/src/jdk/nashorn/internal/runtime/NativeJavaPackage.java @@ -25,10 +25,14 @@ package jdk.nashorn.internal.runtime; +import static jdk.nashorn.internal.runtime.ECMAErrors.typeError; +import static jdk.nashorn.internal.runtime.UnwarrantedOptimismException.isValid; + import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodType; import jdk.internal.dynalink.CallSiteDescriptor; +import jdk.internal.dynalink.beans.BeansLinker; import jdk.internal.dynalink.beans.StaticClass; import jdk.internal.dynalink.linker.GuardedInvocation; import jdk.internal.dynalink.linker.LinkRequest; @@ -135,12 +139,12 @@ public final class NativeJavaPackage extends ScriptObject { } @Override - protected GuardedInvocation findNewMethod(CallSiteDescriptor desc) { + protected GuardedInvocation findNewMethod(final CallSiteDescriptor desc, final LinkRequest request) { return createClassNotFoundInvocation(desc); } @Override - protected GuardedInvocation findCallMethod(CallSiteDescriptor desc, LinkRequest request) { + protected GuardedInvocation findCallMethod(final CallSiteDescriptor desc, final LinkRequest request) { return createClassNotFoundInvocation(desc); } @@ -202,8 +206,12 @@ public final class NativeJavaPackage extends ScriptObject { } @Override - protected Object invokeNoSuchProperty(final String name) { - return createProperty(name); + protected Object invokeNoSuchProperty(final String key, final int programPoint) { + final Object retval = createProperty(key); + if (isValid(programPoint)) { + throw new UnwarrantedOptimismException(retval, programPoint); + } + return retval; } @Override @@ -226,6 +234,35 @@ public final class NativeJavaPackage extends ScriptObject { //ignored } + // Check for explicit constructor signature use + // Example: new (java.awt["Color(int, int,int)"])(2, 3, 4); + final int openBrace = propertyName.indexOf('('); + final int closeBrace = propertyName.lastIndexOf(')'); + if (openBrace != -1 || closeBrace != -1) { + final int lastChar = propertyName.length() - 1; + if (openBrace == -1 || closeBrace != lastChar) { + throw typeError("improper.constructor.signature", propertyName); + } + + // get the class name and try to load it + final String className = name + "." + propertyName.substring(0, openBrace); + try { + javaClass = context.findClass(className); + } catch (final NoClassDefFoundError | ClassNotFoundException e) { + throw typeError(e, "no.such.java.class", className); + } + + // try to find a matching constructor + final Object constructor = BeansLinker.getConstructorMethod( + javaClass, propertyName.substring(openBrace + 1, lastChar)); + if (constructor != null) { + set(propertyName, constructor, 0); + return constructor; + } + // we didn't find a matching constructor! + throw typeError("no.such.java.constructor", propertyName); + } + final Object propertyValue; if (javaClass == null) { propertyValue = new NativeJavaPackage(fullName, getProto()); @@ -233,7 +270,7 @@ public final class NativeJavaPackage extends ScriptObject { propertyValue = StaticClass.forClass(javaClass); } - set(propertyName, propertyValue, false); + set(propertyName, propertyValue, 0); return propertyValue; } } |