diff options
Diffstat (limited to 'src/jdk/nashorn/internal/objects/NativeObject.java')
-rw-r--r-- | src/jdk/nashorn/internal/objects/NativeObject.java | 26 |
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; |