| 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 // This file relies on the fact that the following declarations have been made | 5 // This file relies on the fact that the following declarations have been made |
| 6 // in runtime.js: | 6 // in runtime.js: |
| 7 // var $Object = global.Object; | 7 // var $Object = global.Object; |
| 8 // var $Boolean = global.Boolean; | 8 // var $Boolean = global.Boolean; |
| 9 // var $Number = global.Number; | 9 // var $Number = global.Number; |
| 10 // var $Function = global.Function; | 10 // var $Function = global.Function; |
| (...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 237 | 237 |
| 238 // ECMA-262 - 15.2.4.5 | 238 // ECMA-262 - 15.2.4.5 |
| 239 function ObjectHasOwnProperty(V) { | 239 function ObjectHasOwnProperty(V) { |
| 240 if (%IsJSProxy(this)) { | 240 if (%IsJSProxy(this)) { |
| 241 // TODO(rossberg): adjust once there is a story for symbols vs proxies. | 241 // TODO(rossberg): adjust once there is a story for symbols vs proxies. |
| 242 if (IS_SYMBOL(V)) return false; | 242 if (IS_SYMBOL(V)) return false; |
| 243 | 243 |
| 244 var handler = %GetHandler(this); | 244 var handler = %GetHandler(this); |
| 245 return CallTrap1(handler, "hasOwn", DerivedHasOwnTrap, ToName(V)); | 245 return CallTrap1(handler, "hasOwn", DerivedHasOwnTrap, ToName(V)); |
| 246 } | 246 } |
| 247 return %HasLocalProperty(TO_OBJECT_INLINE(this), ToName(V)); | 247 return %HasOwnProperty(TO_OBJECT_INLINE(this), ToName(V)); |
| 248 } | 248 } |
| 249 | 249 |
| 250 | 250 |
| 251 // ECMA-262 - 15.2.4.6 | 251 // ECMA-262 - 15.2.4.6 |
| 252 function ObjectIsPrototypeOf(V) { | 252 function ObjectIsPrototypeOf(V) { |
| 253 CHECK_OBJECT_COERCIBLE(this, "Object.prototype.isPrototypeOf"); | 253 CHECK_OBJECT_COERCIBLE(this, "Object.prototype.isPrototypeOf"); |
| 254 if (!IS_SPEC_OBJECT(V)) return false; | 254 if (!IS_SPEC_OBJECT(V)) return false; |
| 255 return %IsInPrototypeChain(this, V); | 255 return %IsInPrototypeChain(this, V); |
| 256 } | 256 } |
| 257 | 257 |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 325 | 325 |
| 326 function ObjectKeys(obj) { | 326 function ObjectKeys(obj) { |
| 327 if (!IS_SPEC_OBJECT(obj)) { | 327 if (!IS_SPEC_OBJECT(obj)) { |
| 328 throw MakeTypeError("called_on_non_object", ["Object.keys"]); | 328 throw MakeTypeError("called_on_non_object", ["Object.keys"]); |
| 329 } | 329 } |
| 330 if (%IsJSProxy(obj)) { | 330 if (%IsJSProxy(obj)) { |
| 331 var handler = %GetHandler(obj); | 331 var handler = %GetHandler(obj); |
| 332 var names = CallTrap0(handler, "keys", DerivedKeysTrap); | 332 var names = CallTrap0(handler, "keys", DerivedKeysTrap); |
| 333 return ToNameArray(names, "keys", false); | 333 return ToNameArray(names, "keys", false); |
| 334 } | 334 } |
| 335 return %LocalKeys(obj); | 335 return %OwnKeys(obj); |
| 336 } | 336 } |
| 337 | 337 |
| 338 | 338 |
| 339 // ES5 8.10.1. | 339 // ES5 8.10.1. |
| 340 function IsAccessorDescriptor(desc) { | 340 function IsAccessorDescriptor(desc) { |
| 341 if (IS_UNDEFINED(desc)) return false; | 341 if (IS_UNDEFINED(desc)) return false; |
| 342 return desc.hasGetter() || desc.hasSetter(); | 342 return desc.hasGetter() || desc.hasSetter(); |
| 343 } | 343 } |
| 344 | 344 |
| 345 | 345 |
| (...skipping 672 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1018 throw MakeTypeError("proxy_non_object_prop_names", [obj, trap]); | 1018 throw MakeTypeError("proxy_non_object_prop_names", [obj, trap]); |
| 1019 } | 1019 } |
| 1020 var n = ToUint32(obj.length); | 1020 var n = ToUint32(obj.length); |
| 1021 var array = new $Array(n); | 1021 var array = new $Array(n); |
| 1022 var realLength = 0; | 1022 var realLength = 0; |
| 1023 var names = { __proto__: null }; // TODO(rossberg): use sets once ready. | 1023 var names = { __proto__: null }; // TODO(rossberg): use sets once ready. |
| 1024 for (var index = 0; index < n; index++) { | 1024 for (var index = 0; index < n; index++) { |
| 1025 var s = ToName(obj[index]); | 1025 var s = ToName(obj[index]); |
| 1026 // TODO(rossberg): adjust once there is a story for symbols vs proxies. | 1026 // TODO(rossberg): adjust once there is a story for symbols vs proxies. |
| 1027 if (IS_SYMBOL(s) && !includeSymbols) continue; | 1027 if (IS_SYMBOL(s) && !includeSymbols) continue; |
| 1028 if (%HasLocalProperty(names, s)) { | 1028 if (%HasOwnProperty(names, s)) { |
| 1029 throw MakeTypeError("proxy_repeated_prop_name", [obj, trap, s]); | 1029 throw MakeTypeError("proxy_repeated_prop_name", [obj, trap, s]); |
| 1030 } | 1030 } |
| 1031 array[index] = s; | 1031 array[index] = s; |
| 1032 ++realLength; | 1032 ++realLength; |
| 1033 names[s] = 0; | 1033 names[s] = 0; |
| 1034 } | 1034 } |
| 1035 array.length = realLength; | 1035 array.length = realLength; |
| 1036 return array; | 1036 return array; |
| 1037 } | 1037 } |
| 1038 | 1038 |
| 1039 | 1039 |
| 1040 function ObjectGetOwnPropertyKeys(obj, symbolsOnly) { | 1040 function ObjectGetOwnPropertyKeys(obj, symbolsOnly) { |
| 1041 var nameArrays = new InternalArray(); | 1041 var nameArrays = new InternalArray(); |
| 1042 var filter = symbolsOnly ? | 1042 var filter = symbolsOnly ? |
| 1043 PROPERTY_ATTRIBUTES_STRING | PROPERTY_ATTRIBUTES_PRIVATE_SYMBOL : | 1043 PROPERTY_ATTRIBUTES_STRING | PROPERTY_ATTRIBUTES_PRIVATE_SYMBOL : |
| 1044 PROPERTY_ATTRIBUTES_SYMBOLIC; | 1044 PROPERTY_ATTRIBUTES_SYMBOLIC; |
| 1045 | 1045 |
| 1046 // Find all the indexed properties. | 1046 // Find all the indexed properties. |
| 1047 | 1047 |
| 1048 // Only get the local element names if we want to include string keys. | 1048 // Only get own element names if we want to include string keys. |
| 1049 if (!symbolsOnly) { | 1049 if (!symbolsOnly) { |
| 1050 var localElementNames = %GetLocalElementNames(obj); | 1050 var ownElementNames = %GetOwnElementNames(obj); |
| 1051 for (var i = 0; i < localElementNames.length; ++i) { | 1051 for (var i = 0; i < ownElementNames.length; ++i) { |
| 1052 localElementNames[i] = %_NumberToString(localElementNames[i]); | 1052 ownElementNames[i] = %_NumberToString(ownElementNames[i]); |
| 1053 } | 1053 } |
| 1054 nameArrays.push(localElementNames); | 1054 nameArrays.push(ownElementNames); |
| 1055 | 1055 |
| 1056 // Get names for indexed interceptor properties. | 1056 // Get names for indexed interceptor properties. |
| 1057 var interceptorInfo = %GetInterceptorInfo(obj); | 1057 var interceptorInfo = %GetInterceptorInfo(obj); |
| 1058 if ((interceptorInfo & 1) != 0) { | 1058 if ((interceptorInfo & 1) != 0) { |
| 1059 var indexedInterceptorNames = %GetIndexedInterceptorElementNames(obj); | 1059 var indexedInterceptorNames = %GetIndexedInterceptorElementNames(obj); |
| 1060 if (!IS_UNDEFINED(indexedInterceptorNames)) { | 1060 if (!IS_UNDEFINED(indexedInterceptorNames)) { |
| 1061 nameArrays.push(indexedInterceptorNames); | 1061 nameArrays.push(indexedInterceptorNames); |
| 1062 } | 1062 } |
| 1063 } | 1063 } |
| 1064 } | 1064 } |
| 1065 | 1065 |
| 1066 // Find all the named properties. | 1066 // Find all the named properties. |
| 1067 | 1067 |
| 1068 // Get the local property names. | 1068 // Get own property names. |
| 1069 nameArrays.push(%GetLocalPropertyNames(obj, filter)); | 1069 nameArrays.push(%GetOwnPropertyNames(obj, filter)); |
| 1070 | 1070 |
| 1071 // Get names for named interceptor properties if any. | 1071 // Get names for named interceptor properties if any. |
| 1072 if ((interceptorInfo & 2) != 0) { | 1072 if ((interceptorInfo & 2) != 0) { |
| 1073 var namedInterceptorNames = | 1073 var namedInterceptorNames = |
| 1074 %GetNamedInterceptorPropertyNames(obj); | 1074 %GetNamedInterceptorPropertyNames(obj); |
| 1075 if (!IS_UNDEFINED(namedInterceptorNames)) { | 1075 if (!IS_UNDEFINED(namedInterceptorNames)) { |
| 1076 nameArrays.push(namedInterceptorNames); | 1076 nameArrays.push(namedInterceptorNames); |
| 1077 } | 1077 } |
| 1078 } | 1078 } |
| 1079 | 1079 |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1149 DefineProxyProperty(obj, name, attributesClone, true); | 1149 DefineProxyProperty(obj, name, attributesClone, true); |
| 1150 // The following would implement the spec as in the current proposal, | 1150 // The following would implement the spec as in the current proposal, |
| 1151 // but after recent comments on es-discuss, is most likely obsolete. | 1151 // but after recent comments on es-discuss, is most likely obsolete. |
| 1152 /* | 1152 /* |
| 1153 var defineObj = FromGenericPropertyDescriptor(desc); | 1153 var defineObj = FromGenericPropertyDescriptor(desc); |
| 1154 var names = ObjectGetOwnPropertyNames(attributes); | 1154 var names = ObjectGetOwnPropertyNames(attributes); |
| 1155 var standardNames = | 1155 var standardNames = |
| 1156 {value: 0, writable: 0, get: 0, set: 0, enumerable: 0, configurable: 0}; | 1156 {value: 0, writable: 0, get: 0, set: 0, enumerable: 0, configurable: 0}; |
| 1157 for (var i = 0; i < names.length; i++) { | 1157 for (var i = 0; i < names.length; i++) { |
| 1158 var N = names[i]; | 1158 var N = names[i]; |
| 1159 if (!(%HasLocalProperty(standardNames, N))) { | 1159 if (!(%HasOwnProperty(standardNames, N))) { |
| 1160 var attr = GetOwnPropertyJS(attributes, N); | 1160 var attr = GetOwnPropertyJS(attributes, N); |
| 1161 DefineOwnProperty(descObj, N, attr, true); | 1161 DefineOwnProperty(descObj, N, attr, true); |
| 1162 } | 1162 } |
| 1163 } | 1163 } |
| 1164 // This is really confusing the types, but it is what the proxies spec | 1164 // This is really confusing the types, but it is what the proxies spec |
| 1165 // currently requires: | 1165 // currently requires: |
| 1166 desc = descObj; | 1166 desc = descObj; |
| 1167 */ | 1167 */ |
| 1168 } else { | 1168 } else { |
| 1169 var desc = ToPropertyDescriptor(attributes); | 1169 var desc = ToPropertyDescriptor(attributes); |
| 1170 DefineOwnProperty(obj, name, desc, true); | 1170 DefineOwnProperty(obj, name, desc, true); |
| 1171 } | 1171 } |
| 1172 return obj; | 1172 return obj; |
| 1173 } | 1173 } |
| 1174 | 1174 |
| 1175 | 1175 |
| 1176 function GetOwnEnumerablePropertyNames(properties) { | 1176 function GetOwnEnumerablePropertyNames(properties) { |
| 1177 var names = new InternalArray(); | 1177 var names = new InternalArray(); |
| 1178 for (var key in properties) { | 1178 for (var key in properties) { |
| 1179 if (%HasLocalProperty(properties, key)) { | 1179 if (%HasOwnProperty(properties, key)) { |
| 1180 names.push(key); | 1180 names.push(key); |
| 1181 } | 1181 } |
| 1182 } | 1182 } |
| 1183 return names; | 1183 return names; |
| 1184 } | 1184 } |
| 1185 | 1185 |
| 1186 | 1186 |
| 1187 // ES5 section 15.2.3.7. | 1187 // ES5 section 15.2.3.7. |
| 1188 function ObjectDefineProperties(obj, properties) { | 1188 function ObjectDefineProperties(obj, properties) { |
| 1189 if (!IS_SPEC_OBJECT(obj)) { | 1189 if (!IS_SPEC_OBJECT(obj)) { |
| (...skipping 665 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1855 %SetCode($Function, FunctionConstructor); | 1855 %SetCode($Function, FunctionConstructor); |
| 1856 %SetProperty($Function.prototype, "constructor", $Function, DONT_ENUM); | 1856 %SetProperty($Function.prototype, "constructor", $Function, DONT_ENUM); |
| 1857 | 1857 |
| 1858 InstallFunctions($Function.prototype, DONT_ENUM, $Array( | 1858 InstallFunctions($Function.prototype, DONT_ENUM, $Array( |
| 1859 "bind", FunctionBind, | 1859 "bind", FunctionBind, |
| 1860 "toString", FunctionToString | 1860 "toString", FunctionToString |
| 1861 )); | 1861 )); |
| 1862 } | 1862 } |
| 1863 | 1863 |
| 1864 SetUpFunction(); | 1864 SetUpFunction(); |
| OLD | NEW |