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 |