| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 (function(global, utils) { | 5 (function(global, utils) { |
| 6 | 6 |
| 7 %CheckIsBootstrapping(); | 7 %CheckIsBootstrapping(); |
| 8 | 8 |
| 9 // ---------------------------------------------------------------------------- | 9 // ---------------------------------------------------------------------------- |
| 10 // Imports | 10 // Imports |
| (...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 169 | 169 |
| 170 | 170 |
| 171 // ECMA-262 - 15.2.4.4 | 171 // ECMA-262 - 15.2.4.4 |
| 172 function ObjectValueOf() { | 172 function ObjectValueOf() { |
| 173 return TO_OBJECT(this); | 173 return TO_OBJECT(this); |
| 174 } | 174 } |
| 175 | 175 |
| 176 | 176 |
| 177 // ECMA-262 - 15.2.4.5 | 177 // ECMA-262 - 15.2.4.5 |
| 178 function ObjectHasOwnProperty(value) { | 178 function ObjectHasOwnProperty(value) { |
| 179 var name = $toName(value); | 179 var name = TO_NAME(value); |
| 180 var object = TO_OBJECT(this); | 180 var object = TO_OBJECT(this); |
| 181 | 181 |
| 182 if (%_IsJSProxy(object)) { | 182 if (%_IsJSProxy(object)) { |
| 183 // TODO(rossberg): adjust once there is a story for symbols vs proxies. | 183 // TODO(rossberg): adjust once there is a story for symbols vs proxies. |
| 184 if (IS_SYMBOL(value)) return false; | 184 if (IS_SYMBOL(value)) return false; |
| 185 | 185 |
| 186 var handler = %GetHandler(object); | 186 var handler = %GetHandler(object); |
| 187 return CallTrap1(handler, "hasOwn", ProxyDerivedHasOwnTrap, name); | 187 return CallTrap1(handler, "hasOwn", ProxyDerivedHasOwnTrap, name); |
| 188 } | 188 } |
| 189 return %HasOwnProperty(object, name); | 189 return %HasOwnProperty(object, name); |
| 190 } | 190 } |
| 191 | 191 |
| 192 | 192 |
| 193 // ECMA-262 - 15.2.4.6 | 193 // ECMA-262 - 15.2.4.6 |
| 194 function ObjectIsPrototypeOf(V) { | 194 function ObjectIsPrototypeOf(V) { |
| 195 if (!IS_SPEC_OBJECT(V)) return false; | 195 if (!IS_SPEC_OBJECT(V)) return false; |
| 196 var O = TO_OBJECT(this); | 196 var O = TO_OBJECT(this); |
| 197 return %_HasInPrototypeChain(V, O); | 197 return %_HasInPrototypeChain(V, O); |
| 198 } | 198 } |
| 199 | 199 |
| 200 | 200 |
| 201 // ECMA-262 - 15.2.4.6 | 201 // ECMA-262 - 15.2.4.6 |
| 202 function ObjectPropertyIsEnumerable(V) { | 202 function ObjectPropertyIsEnumerable(V) { |
| 203 var P = $toName(V); | 203 var P = TO_NAME(V); |
| 204 if (%_IsJSProxy(this)) { | 204 if (%_IsJSProxy(this)) { |
| 205 // TODO(rossberg): adjust once there is a story for symbols vs proxies. | 205 // TODO(rossberg): adjust once there is a story for symbols vs proxies. |
| 206 if (IS_SYMBOL(V)) return false; | 206 if (IS_SYMBOL(V)) return false; |
| 207 | 207 |
| 208 var desc = GetOwnPropertyJS(this, P); | 208 var desc = GetOwnPropertyJS(this, P); |
| 209 return IS_UNDEFINED(desc) ? false : desc.isEnumerable(); | 209 return IS_UNDEFINED(desc) ? false : desc.isEnumerable(); |
| 210 } | 210 } |
| 211 return %IsPropertyEnumerable(TO_OBJECT(this), P); | 211 return %IsPropertyEnumerable(TO_OBJECT(this), P); |
| 212 } | 212 } |
| 213 | 213 |
| 214 | 214 |
| 215 // Extensions for providing property getters and setters. | 215 // Extensions for providing property getters and setters. |
| 216 function ObjectDefineGetter(name, fun) { | 216 function ObjectDefineGetter(name, fun) { |
| 217 var receiver = this; | 217 var receiver = this; |
| 218 if (IS_NULL(receiver) || IS_UNDEFINED(receiver)) { | 218 if (IS_NULL(receiver) || IS_UNDEFINED(receiver)) { |
| 219 receiver = %GlobalProxy(ObjectDefineGetter); | 219 receiver = %GlobalProxy(ObjectDefineGetter); |
| 220 } | 220 } |
| 221 if (!IS_SPEC_FUNCTION(fun)) { | 221 if (!IS_SPEC_FUNCTION(fun)) { |
| 222 throw MakeTypeError(kObjectGetterExpectingFunction); | 222 throw MakeTypeError(kObjectGetterExpectingFunction); |
| 223 } | 223 } |
| 224 var desc = new PropertyDescriptor(); | 224 var desc = new PropertyDescriptor(); |
| 225 desc.setGet(fun); | 225 desc.setGet(fun); |
| 226 desc.setEnumerable(true); | 226 desc.setEnumerable(true); |
| 227 desc.setConfigurable(true); | 227 desc.setConfigurable(true); |
| 228 DefineOwnProperty(TO_OBJECT(receiver), $toName(name), desc, false); | 228 DefineOwnProperty(TO_OBJECT(receiver), TO_NAME(name), desc, false); |
| 229 } | 229 } |
| 230 | 230 |
| 231 | 231 |
| 232 function ObjectLookupGetter(name) { | 232 function ObjectLookupGetter(name) { |
| 233 var receiver = this; | 233 var receiver = this; |
| 234 if (IS_NULL(receiver) || IS_UNDEFINED(receiver)) { | 234 if (IS_NULL(receiver) || IS_UNDEFINED(receiver)) { |
| 235 receiver = %GlobalProxy(ObjectLookupGetter); | 235 receiver = %GlobalProxy(ObjectLookupGetter); |
| 236 } | 236 } |
| 237 return %LookupAccessor(TO_OBJECT(receiver), $toName(name), GETTER); | 237 return %LookupAccessor(TO_OBJECT(receiver), TO_NAME(name), GETTER); |
| 238 } | 238 } |
| 239 | 239 |
| 240 | 240 |
| 241 function ObjectDefineSetter(name, fun) { | 241 function ObjectDefineSetter(name, fun) { |
| 242 var receiver = this; | 242 var receiver = this; |
| 243 if (IS_NULL(receiver) || IS_UNDEFINED(receiver)) { | 243 if (IS_NULL(receiver) || IS_UNDEFINED(receiver)) { |
| 244 receiver = %GlobalProxy(ObjectDefineSetter); | 244 receiver = %GlobalProxy(ObjectDefineSetter); |
| 245 } | 245 } |
| 246 if (!IS_SPEC_FUNCTION(fun)) { | 246 if (!IS_SPEC_FUNCTION(fun)) { |
| 247 throw MakeTypeError(kObjectSetterExpectingFunction); | 247 throw MakeTypeError(kObjectSetterExpectingFunction); |
| 248 } | 248 } |
| 249 var desc = new PropertyDescriptor(); | 249 var desc = new PropertyDescriptor(); |
| 250 desc.setSet(fun); | 250 desc.setSet(fun); |
| 251 desc.setEnumerable(true); | 251 desc.setEnumerable(true); |
| 252 desc.setConfigurable(true); | 252 desc.setConfigurable(true); |
| 253 DefineOwnProperty(TO_OBJECT(receiver), $toName(name), desc, false); | 253 DefineOwnProperty(TO_OBJECT(receiver), TO_NAME(name), desc, false); |
| 254 } | 254 } |
| 255 | 255 |
| 256 | 256 |
| 257 function ObjectLookupSetter(name) { | 257 function ObjectLookupSetter(name) { |
| 258 var receiver = this; | 258 var receiver = this; |
| 259 if (IS_NULL(receiver) || IS_UNDEFINED(receiver)) { | 259 if (IS_NULL(receiver) || IS_UNDEFINED(receiver)) { |
| 260 receiver = %GlobalProxy(ObjectLookupSetter); | 260 receiver = %GlobalProxy(ObjectLookupSetter); |
| 261 } | 261 } |
| 262 return %LookupAccessor(TO_OBJECT(receiver), $toName(name), SETTER); | 262 return %LookupAccessor(TO_OBJECT(receiver), TO_NAME(name), SETTER); |
| 263 } | 263 } |
| 264 | 264 |
| 265 | 265 |
| 266 function ObjectKeys(obj) { | 266 function ObjectKeys(obj) { |
| 267 obj = TO_OBJECT(obj); | 267 obj = TO_OBJECT(obj); |
| 268 if (%_IsJSProxy(obj)) { | 268 if (%_IsJSProxy(obj)) { |
| 269 var handler = %GetHandler(obj); | 269 var handler = %GetHandler(obj); |
| 270 var names = CallTrap0(handler, "keys", ProxyDerivedKeysTrap); | 270 var names = CallTrap0(handler, "keys", ProxyDerivedKeysTrap); |
| 271 return ToNameArray(names, "keys", false); | 271 return ToNameArray(names, "keys", false); |
| 272 } | 272 } |
| (...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 554 } | 554 } |
| 555 | 555 |
| 556 | 556 |
| 557 function CallTrap2(handler, name, defaultTrap, x, y) { | 557 function CallTrap2(handler, name, defaultTrap, x, y) { |
| 558 return %_CallFunction(handler, x, y, GetTrap(handler, name, defaultTrap)); | 558 return %_CallFunction(handler, x, y, GetTrap(handler, name, defaultTrap)); |
| 559 } | 559 } |
| 560 | 560 |
| 561 | 561 |
| 562 // ES5 section 8.12.1. | 562 // ES5 section 8.12.1. |
| 563 function GetOwnPropertyJS(obj, v) { | 563 function GetOwnPropertyJS(obj, v) { |
| 564 var p = $toName(v); | 564 var p = TO_NAME(v); |
| 565 if (%_IsJSProxy(obj)) { | 565 if (%_IsJSProxy(obj)) { |
| 566 // TODO(rossberg): adjust once there is a story for symbols vs proxies. | 566 // TODO(rossberg): adjust once there is a story for symbols vs proxies. |
| 567 if (IS_SYMBOL(v)) return UNDEFINED; | 567 if (IS_SYMBOL(v)) return UNDEFINED; |
| 568 | 568 |
| 569 var handler = %GetHandler(obj); | 569 var handler = %GetHandler(obj); |
| 570 var descriptor = CallTrap1( | 570 var descriptor = CallTrap1( |
| 571 handler, "getOwnPropertyDescriptor", UNDEFINED, p); | 571 handler, "getOwnPropertyDescriptor", UNDEFINED, p); |
| 572 if (IS_UNDEFINED(descriptor)) return descriptor; | 572 if (IS_UNDEFINED(descriptor)) return descriptor; |
| 573 var desc = ToCompletePropertyDescriptor(descriptor); | 573 var desc = ToCompletePropertyDescriptor(descriptor); |
| 574 if (!desc.isConfigurable()) { | 574 if (!desc.isConfigurable()) { |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 625 } else { | 625 } else { |
| 626 return false; | 626 return false; |
| 627 } | 627 } |
| 628 } | 628 } |
| 629 return true; | 629 return true; |
| 630 } | 630 } |
| 631 | 631 |
| 632 | 632 |
| 633 // ES5 8.12.9. | 633 // ES5 8.12.9. |
| 634 function DefineObjectProperty(obj, p, desc, should_throw) { | 634 function DefineObjectProperty(obj, p, desc, should_throw) { |
| 635 var current_array = %GetOwnProperty(obj, $toName(p)); | 635 var current_array = %GetOwnProperty(obj, TO_NAME(p)); |
| 636 var current = ConvertDescriptorArrayToDescriptor(current_array); | 636 var current = ConvertDescriptorArrayToDescriptor(current_array); |
| 637 var extensible = %IsExtensible(obj); | 637 var extensible = %IsExtensible(obj); |
| 638 | 638 |
| 639 // Error handling according to spec. | 639 // Error handling according to spec. |
| 640 // Step 3 | 640 // Step 3 |
| 641 if (IS_UNDEFINED(current) && !extensible) { | 641 if (IS_UNDEFINED(current) && !extensible) { |
| 642 if (should_throw) { | 642 if (should_throw) { |
| 643 throw MakeTypeError(kDefineDisallowed, p); | 643 throw MakeTypeError(kDefineDisallowed, p); |
| 644 } else { | 644 } else { |
| 645 return false; | 645 return false; |
| (...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 899 // For Harmony proxies | 899 // For Harmony proxies |
| 900 function ToNameArray(obj, trap, includeSymbols) { | 900 function ToNameArray(obj, trap, includeSymbols) { |
| 901 if (!IS_SPEC_OBJECT(obj)) { | 901 if (!IS_SPEC_OBJECT(obj)) { |
| 902 throw MakeTypeError(kProxyNonObjectPropNames, trap, obj); | 902 throw MakeTypeError(kProxyNonObjectPropNames, trap, obj); |
| 903 } | 903 } |
| 904 var n = TO_UINT32(obj.length); | 904 var n = TO_UINT32(obj.length); |
| 905 var array = new GlobalArray(n); | 905 var array = new GlobalArray(n); |
| 906 var realLength = 0; | 906 var realLength = 0; |
| 907 var names = { __proto__: null }; // TODO(rossberg): use sets once ready. | 907 var names = { __proto__: null }; // TODO(rossberg): use sets once ready. |
| 908 for (var index = 0; index < n; index++) { | 908 for (var index = 0; index < n; index++) { |
| 909 var s = $toName(obj[index]); | 909 var s = TO_NAME(obj[index]); |
| 910 // TODO(rossberg): adjust once there is a story for symbols vs proxies. | 910 // TODO(rossberg): adjust once there is a story for symbols vs proxies. |
| 911 if (IS_SYMBOL(s) && !includeSymbols) continue; | 911 if (IS_SYMBOL(s) && !includeSymbols) continue; |
| 912 if (%HasOwnProperty(names, s)) { | 912 if (%HasOwnProperty(names, s)) { |
| 913 throw MakeTypeError(kProxyRepeatedPropName, trap, s); | 913 throw MakeTypeError(kProxyRepeatedPropName, trap, s); |
| 914 } | 914 } |
| 915 array[realLength] = s; | 915 array[realLength] = s; |
| 916 ++realLength; | 916 ++realLength; |
| 917 names[s] = 0; | 917 names[s] = 0; |
| 918 } | 918 } |
| 919 array.length = realLength; | 919 array.length = realLength; |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1025 if (!IS_UNDEFINED(properties)) ObjectDefineProperties(obj, properties); | 1025 if (!IS_UNDEFINED(properties)) ObjectDefineProperties(obj, properties); |
| 1026 return obj; | 1026 return obj; |
| 1027 } | 1027 } |
| 1028 | 1028 |
| 1029 | 1029 |
| 1030 // ES5 section 15.2.3.6. | 1030 // ES5 section 15.2.3.6. |
| 1031 function ObjectDefineProperty(obj, p, attributes) { | 1031 function ObjectDefineProperty(obj, p, attributes) { |
| 1032 if (!IS_SPEC_OBJECT(obj)) { | 1032 if (!IS_SPEC_OBJECT(obj)) { |
| 1033 throw MakeTypeError(kCalledOnNonObject, "Object.defineProperty"); | 1033 throw MakeTypeError(kCalledOnNonObject, "Object.defineProperty"); |
| 1034 } | 1034 } |
| 1035 var name = $toName(p); | 1035 var name = TO_NAME(p); |
| 1036 if (%_IsJSProxy(obj)) { | 1036 if (%_IsJSProxy(obj)) { |
| 1037 // Clone the attributes object for protection. | 1037 // Clone the attributes object for protection. |
| 1038 // TODO(rossberg): not spec'ed yet, so not sure if this should involve | 1038 // TODO(rossberg): not spec'ed yet, so not sure if this should involve |
| 1039 // non-own properties as it does (or non-enumerable ones, as it doesn't?). | 1039 // non-own properties as it does (or non-enumerable ones, as it doesn't?). |
| 1040 var attributesClone = { __proto__: null }; | 1040 var attributesClone = { __proto__: null }; |
| 1041 for (var a in attributes) { | 1041 for (var a in attributes) { |
| 1042 attributesClone[a] = attributes[a]; | 1042 attributesClone[a] = attributes[a]; |
| 1043 } | 1043 } |
| 1044 DefineProxyProperty(obj, name, attributesClone, true); | 1044 DefineProxyProperty(obj, name, attributesClone, true); |
| 1045 // The following would implement the spec as in the current proposal, | 1045 // The following would implement the spec as in the current proposal, |
| (...skipping 764 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1810 }); | 1810 }); |
| 1811 | 1811 |
| 1812 %InstallToContext([ | 1812 %InstallToContext([ |
| 1813 "global_eval_fun", GlobalEval, | 1813 "global_eval_fun", GlobalEval, |
| 1814 "object_define_own_property", DefineOwnPropertyFromAPI, | 1814 "object_define_own_property", DefineOwnPropertyFromAPI, |
| 1815 "object_get_own_property_descriptor", ObjectGetOwnPropertyDescriptor, | 1815 "object_get_own_property_descriptor", ObjectGetOwnPropertyDescriptor, |
| 1816 "to_complete_property_descriptor", ToCompletePropertyDescriptor, | 1816 "to_complete_property_descriptor", ToCompletePropertyDescriptor, |
| 1817 ]); | 1817 ]); |
| 1818 | 1818 |
| 1819 }) | 1819 }) |
| OLD | NEW |