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

Print this page




1889         // Function.prototype === Object.getPrototypeOf(Function) ===
1890         // <anon-function>
1891         builtinFunction.setInitialProto(anon);
1892         builtinFunction.setPrototype(anon);
1893         anon.set("constructor", builtinFunction, false);
1894         anon.deleteOwnProperty(anon.getMap().findProperty("prototype"));
1895 
1896         // use "getter" so that [[ThrowTypeError]] function's arity is 0 - as specified in step 10 of section 13.2.3
1897         this.typeErrorThrower = new ScriptFunctionImpl("TypeErrorThrower", Lookup.TYPE_ERROR_THROWER_GETTER, null, null, 0);
1898         typeErrorThrower.setPrototype(UNDEFINED);
1899         // Non-constructor built-in functions do not have "prototype" property
1900         typeErrorThrower.deleteOwnProperty(typeErrorThrower.getMap().findProperty("prototype"));
1901         typeErrorThrower.preventExtensions();
1902 
1903         // now initialize Object
1904         this.builtinObject = (ScriptFunction)initConstructor("Object");
1905         final ScriptObject ObjectPrototype = getObjectPrototype();
1906         // Object.getPrototypeOf(Function.prototype) === Object.prototype
1907         anon.setInitialProto(ObjectPrototype);
1908 







1909         // Function valued properties of Function.prototype were not properly
1910         // initialized. Because, these were created before global.function and
1911         // global.object were not initialized.
1912         jdk.nashorn.internal.runtime.Property[] properties = getFunctionPrototype().getMap().getProperties();
1913         for (final jdk.nashorn.internal.runtime.Property property : properties) {
1914             final Object key = property.getKey();
1915             final Object value = builtinFunction.get(key);
1916 
1917             if (value instanceof ScriptFunction && value != anon) {
1918                 final ScriptFunction func = (ScriptFunction)value;
1919                 func.setInitialProto(getFunctionPrototype());
1920                 final ScriptObject prototype = ScriptFunction.getPrototype(func);
1921                 if (prototype != null) {
1922                     prototype.setInitialProto(ObjectPrototype);
1923                 }
1924             }
1925         }
1926 
1927         // For function valued properties of Object and Object.prototype, make
1928         // sure prototype's proto chain ends with Object.prototype




1889         // Function.prototype === Object.getPrototypeOf(Function) ===
1890         // <anon-function>
1891         builtinFunction.setInitialProto(anon);
1892         builtinFunction.setPrototype(anon);
1893         anon.set("constructor", builtinFunction, false);
1894         anon.deleteOwnProperty(anon.getMap().findProperty("prototype"));
1895 
1896         // use "getter" so that [[ThrowTypeError]] function's arity is 0 - as specified in step 10 of section 13.2.3
1897         this.typeErrorThrower = new ScriptFunctionImpl("TypeErrorThrower", Lookup.TYPE_ERROR_THROWER_GETTER, null, null, 0);
1898         typeErrorThrower.setPrototype(UNDEFINED);
1899         // Non-constructor built-in functions do not have "prototype" property
1900         typeErrorThrower.deleteOwnProperty(typeErrorThrower.getMap().findProperty("prototype"));
1901         typeErrorThrower.preventExtensions();
1902 
1903         // now initialize Object
1904         this.builtinObject = (ScriptFunction)initConstructor("Object");
1905         final ScriptObject ObjectPrototype = getObjectPrototype();
1906         // Object.getPrototypeOf(Function.prototype) === Object.prototype
1907         anon.setInitialProto(ObjectPrototype);
1908 
1909         // ES6 draft compliant __proto__ property of Object.prototype
1910         // accessors on Object.prototype for "__proto__"
1911         final ScriptFunction getProto = ScriptFunctionImpl.makeFunction("getProto", ScriptObject.GETPROTO);
1912         final ScriptFunction setProto = ScriptFunctionImpl.makeFunction("setProto", ScriptObject.SETPROTOCHECK);
1913         ObjectPrototype.addOwnProperty("__proto__", Attribute.NOT_ENUMERABLE, getProto, setProto);
1914 
1915 
1916         // Function valued properties of Function.prototype were not properly
1917         // initialized. Because, these were created before global.function and
1918         // global.object were not initialized.
1919         jdk.nashorn.internal.runtime.Property[] properties = getFunctionPrototype().getMap().getProperties();
1920         for (final jdk.nashorn.internal.runtime.Property property : properties) {
1921             final Object key = property.getKey();
1922             final Object value = builtinFunction.get(key);
1923 
1924             if (value instanceof ScriptFunction && value != anon) {
1925                 final ScriptFunction func = (ScriptFunction)value;
1926                 func.setInitialProto(getFunctionPrototype());
1927                 final ScriptObject prototype = ScriptFunction.getPrototype(func);
1928                 if (prototype != null) {
1929                     prototype.setInitialProto(ObjectPrototype);
1930                 }
1931             }
1932         }
1933 
1934         // For function valued properties of Object and Object.prototype, make
1935         // sure prototype's proto chain ends with Object.prototype