aboutsummaryrefslogtreecommitdiff
path: root/src/jdk/nashorn/internal/objects/NativeObject.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/jdk/nashorn/internal/objects/NativeObject.java')
-rw-r--r--src/jdk/nashorn/internal/objects/NativeObject.java26
1 files changed, 23 insertions, 3 deletions
diff --git a/src/jdk/nashorn/internal/objects/NativeObject.java b/src/jdk/nashorn/internal/objects/NativeObject.java
index 65904053..537ae1ff 100644
--- a/src/jdk/nashorn/internal/objects/NativeObject.java
+++ b/src/jdk/nashorn/internal/objects/NativeObject.java
@@ -36,6 +36,7 @@ import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
+import java.util.concurrent.Callable;
import jdk.internal.dynalink.beans.BeansLinker;
import jdk.internal.dynalink.beans.StaticClass;
import jdk.internal.dynalink.linker.GuardedInvocation;
@@ -70,7 +71,18 @@ import jdk.nashorn.internal.runtime.linker.InvokeByName;
*/
@ScriptClass("Object")
public final class NativeObject {
- private static final InvokeByName TO_STRING = new InvokeByName("toString", ScriptObject.class);
+ private static final Object TO_STRING = new Object();
+
+ private static InvokeByName getTO_STRING() {
+ return Global.instance().getInvokeByName(TO_STRING,
+ new Callable<InvokeByName>() {
+ @Override
+ public InvokeByName call() {
+ return new InvokeByName("toString", ScriptObject.class);
+ }
+ });
+ }
+
private static final MethodType MIRROR_GETTER_TYPE = MethodType.methodType(Object.class, ScriptObjectMirror.class);
private static final MethodType MIRROR_SETTER_TYPE = MethodType.methodType(Object.class, ScriptObjectMirror.class, Object.class);
@@ -101,6 +113,13 @@ public final class NativeObject {
} else if (obj instanceof ScriptObjectMirror) {
return ((ScriptObjectMirror)obj).getProto();
} else {
+ final JSType type = JSType.of(obj);
+ if (type == JSType.OBJECT) {
+ // host (Java) objects have null __proto__
+ return null;
+ }
+
+ // must be some JS primitive
throw notAnObject(obj);
}
}
@@ -402,12 +421,13 @@ public final class NativeObject {
public static Object toLocaleString(final Object self) {
final Object obj = JSType.toScriptObject(self);
if (obj instanceof ScriptObject) {
+ final InvokeByName toStringInvoker = getTO_STRING();
final ScriptObject sobj = (ScriptObject)self;
try {
- final Object toString = TO_STRING.getGetter().invokeExact(sobj);
+ final Object toString = toStringInvoker.getGetter().invokeExact(sobj);
if (Bootstrap.isCallable(toString)) {
- return TO_STRING.getInvoker().invokeExact(toString, sobj);
+ return toStringInvoker.getInvoker().invokeExact(toString, sobj);
}
} catch (final RuntimeException | Error e) {
throw e;