src/jdk/nashorn/internal/objects/NativeObject.java

Print this page

        

*** 23,32 **** --- 23,33 ---- * questions. */ package jdk.nashorn.internal.objects; + import static jdk.nashorn.internal.lookup.Lookup.MH; import static jdk.nashorn.internal.runtime.ECMAErrors.typeError; import static jdk.nashorn.internal.runtime.ScriptRuntime.UNDEFINED; import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles;
*** 72,81 **** --- 73,85 ---- * this class to generate prototype and constructor for "Object". * */ @ScriptClass("Object") public final class NativeObject { + public static final MethodHandle GET__PROTO__ = findOwnMH("get__proto__", ScriptObject.class, Object.class); + public static final MethodHandle SET__PROTO__ = findOwnMH("set__proto__", Object.class, Object.class, Object.class); + private static final Object TO_STRING = new Object(); private static InvokeByName getTO_STRING() { return Global.instance().getInvokeByName(TO_STRING, new Callable<InvokeByName>() {
*** 84,93 **** --- 88,126 ---- return new InvokeByName("toString", ScriptObject.class); } }); } + @SuppressWarnings("unused") + private static ScriptObject get__proto__(final Object self) { + // See ES6 draft spec: B.2.2.1.1 get Object.prototype.__proto__ + // Step 1 Let O be the result of calling ToObject passing the this. + final Object obj = Global.toObject(self); + Global.checkObject(obj); + final ScriptObject sobj = (ScriptObject)obj; + return sobj.getProto(); + } + + @SuppressWarnings("unused") + private static Object set__proto__(final Object self, final Object proto) { + // See ES6 draft spec: B.2.2.1.2 set Object.prototype.__proto__ + // Step 1 + Global.checkObjectCoercible(self); + // Step 4 + if (! (self instanceof ScriptObject)) { + return UNDEFINED; + } + + final ScriptObject sobj = (ScriptObject)self; + // __proto__ assignment ignores non-nulls and non-objects + // step 3: If Type(proto) is neither Object nor Null, then return undefined. + if (proto == null || proto instanceof ScriptObject) { + sobj.setPrototypeOf(proto); + } + return UNDEFINED; + } + 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); // initialized by nasgen @SuppressWarnings("unused")
*** 158,168 **** * @return object whose prototype is set */ @Function(attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR) public static Object setPrototypeOf(final Object self, final Object obj, final Object proto) { if (obj instanceof ScriptObject) { ! ((ScriptObject)obj).setProtoCheck(proto); return obj; } else if (obj instanceof ScriptObjectMirror) { ((ScriptObjectMirror)obj).setProto(proto); return obj; } --- 191,201 ---- * @return object whose prototype is set */ @Function(attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR) public static Object setPrototypeOf(final Object self, final Object obj, final Object proto) { if (obj instanceof ScriptObject) { ! ((ScriptObject)obj).setPrototypeOf(proto); return obj; } else if (obj instanceof ScriptObjectMirror) { ((ScriptObjectMirror)obj).setProto(proto); return obj; }
*** 775,780 **** --- 808,817 ---- private static LinkRequest createLinkRequest(String operation, MethodType methodType, Object source) { return new LinkRequestImpl(CallSiteDescriptorFactory.create(MethodHandles.publicLookup(), operation, methodType), false, source); } + + private static MethodHandle findOwnMH(final String name, final Class<?> rtype, final Class<?>... types) { + return MH.findStatic(MethodHandles.lookup(), NativeObject.class, name, MH.type(rtype, types)); + } }