aboutsummaryrefslogtreecommitdiff
path: root/src/jdk/nashorn/internal/runtime/NativeJavaPackage.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/jdk/nashorn/internal/runtime/NativeJavaPackage.java')
-rw-r--r--src/jdk/nashorn/internal/runtime/NativeJavaPackage.java47
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;
}
}