1// Copyright 2012 the V8 project authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5(function(global, utils) { 6 7%CheckIsBootstrapping(); 8 9// ---------------------------------------------------------------------------- 10// Imports 11 12var GlobalNumber = global.Number; 13var GlobalObject = global.Object; 14var iteratorSymbol = utils.ImportNow("iterator_symbol"); 15var NaN = %GetRootNaN(); 16var ObjectToString = utils.ImportNow("object_to_string"); 17 18// ---------------------------------------------------------------------------- 19 20 21// Set up global object. 22var attributes = DONT_ENUM | DONT_DELETE | READ_ONLY; 23 24utils.InstallConstants(global, [ 25 // ES6 18.1.1 26 "Infinity", INFINITY, 27 // ES6 18.1.2 28 "NaN", NaN, 29 // ES6 18.1.3 30 "undefined", UNDEFINED, 31]); 32 33 34// ---------------------------------------------------------------------------- 35// Object 36 37// ES6 19.1.3.5 Object.prototype.toLocaleString([reserved1 [,reserved2]]) 38function ObjectToLocaleString() { 39 CHECK_OBJECT_COERCIBLE(this, "Object.prototype.toLocaleString"); 40 return this.toString(); 41} 42 43 44// ES6 19.1.3.7 Object.prototype.valueOf() 45function ObjectValueOf() { 46 return TO_OBJECT(this); 47} 48 49 50// ES6 19.1.3.3 Object.prototype.isPrototypeOf(V) 51function ObjectIsPrototypeOf(V) { 52 if (!IS_RECEIVER(V)) return false; 53 var O = TO_OBJECT(this); 54 return %HasInPrototypeChain(V, O); 55} 56 57 58// ES6 7.3.9 59function GetMethod(obj, p) { 60 var func = obj[p]; 61 if (IS_NULL_OR_UNDEFINED(func)) return UNDEFINED; 62 if (IS_CALLABLE(func)) return func; 63 throw %make_type_error(kCalledNonCallable, typeof func); 64} 65 66// ES6 19.1.1.1 67function ObjectConstructor(x) { 68 if (GlobalObject != new.target && !IS_UNDEFINED(new.target)) { 69 return this; 70 } 71 if (IS_NULL(x) || IS_UNDEFINED(x)) return {}; 72 return TO_OBJECT(x); 73} 74 75 76// ---------------------------------------------------------------------------- 77// Object 78 79%SetNativeFlag(GlobalObject); 80%SetCode(GlobalObject, ObjectConstructor); 81 82%AddNamedProperty(GlobalObject.prototype, "constructor", GlobalObject, 83 DONT_ENUM); 84 85// Set up non-enumerable functions on the Object.prototype object. 86utils.InstallFunctions(GlobalObject.prototype, DONT_ENUM, [ 87 "toString", ObjectToString, 88 "toLocaleString", ObjectToLocaleString, 89 "valueOf", ObjectValueOf, 90 "isPrototypeOf", ObjectIsPrototypeOf, 91 // propertyIsEnumerable is added in bootstrapper.cc. 92 // __defineGetter__ is added in bootstrapper.cc. 93 // __lookupGetter__ is added in bootstrapper.cc. 94 // __defineSetter__ is added in bootstrapper.cc. 95 // __lookupSetter__ is added in bootstrapper.cc. 96]); 97 98 99// ---------------------------------------------------------------------------- 100// Number 101 102utils.InstallConstants(GlobalNumber, [ 103 // ECMA-262 section 15.7.3.1. 104 "MAX_VALUE", 1.7976931348623157e+308, 105 // ECMA-262 section 15.7.3.2. 106 "MIN_VALUE", 5e-324, 107 // ECMA-262 section 15.7.3.3. 108 "NaN", NaN, 109 // ECMA-262 section 15.7.3.4. 110 "NEGATIVE_INFINITY", -INFINITY, 111 // ECMA-262 section 15.7.3.5. 112 "POSITIVE_INFINITY", INFINITY, 113 114 // --- Harmony constants (no spec refs until settled.) 115 116 "MAX_SAFE_INTEGER", 9007199254740991, 117 "MIN_SAFE_INTEGER", -9007199254740991, 118 "EPSILON", 2.220446049250313e-16, 119]); 120 121 122// ---------------------------------------------------------------------------- 123// Iterator related spec functions. 124 125// ES6 7.4.1 GetIterator(obj, method) 126function GetIterator(obj, method) { 127 if (IS_UNDEFINED(method)) { 128 method = obj[iteratorSymbol]; 129 } 130 if (!IS_CALLABLE(method)) { 131 throw %make_type_error(kNotIterable, obj); 132 } 133 var iterator = %_Call(method, obj); 134 if (!IS_RECEIVER(iterator)) { 135 throw %make_type_error(kNotAnIterator, iterator); 136 } 137 return iterator; 138} 139 140// ---------------------------------------------------------------------------- 141// Exports 142 143utils.Export(function(to) { 144 to.GetIterator = GetIterator; 145 to.GetMethod = GetMethod; 146 to.ObjectHasOwnProperty = GlobalObject.prototype.hasOwnProperty; 147}); 148 149%InstallToContext([ 150 "object_value_of", ObjectValueOf, 151]); 152 153}) 154