| 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 1237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1248 obj.length = 0; | 1248 obj.length = 0; |
| 1249 } else { | 1249 } else { |
| 1250 %Fix(obj); | 1250 %Fix(obj); |
| 1251 } | 1251 } |
| 1252 ObjectDefineProperties(obj, props); | 1252 ObjectDefineProperties(obj, props); |
| 1253 } | 1253 } |
| 1254 | 1254 |
| 1255 | 1255 |
| 1256 // ES5 section 15.2.3.8. | 1256 // ES5 section 15.2.3.8. |
| 1257 function ObjectSealJS(obj) { | 1257 function ObjectSealJS(obj) { |
| 1258 if (!IS_SPEC_OBJECT(obj)) return obj; | 1258 if (!IS_SPEC_OBJECT(obj)) { |
| 1259 throw MakeTypeError(kCalledOnNonObject, "Object.seal"); |
| 1260 } |
| 1259 var isProxy = %_IsJSProxy(obj); | 1261 var isProxy = %_IsJSProxy(obj); |
| 1260 if (isProxy || %HasSloppyArgumentsElements(obj) || %IsObserved(obj)) { | 1262 if (isProxy || %HasSloppyArgumentsElements(obj) || %IsObserved(obj)) { |
| 1261 if (isProxy) { | 1263 if (isProxy) { |
| 1262 ProxyFix(obj); | 1264 ProxyFix(obj); |
| 1263 } | 1265 } |
| 1264 var names = ObjectGetOwnPropertyNames(obj); | 1266 var names = ObjectGetOwnPropertyNames(obj); |
| 1265 for (var i = 0; i < names.length; i++) { | 1267 for (var i = 0; i < names.length; i++) { |
| 1266 var name = names[i]; | 1268 var name = names[i]; |
| 1267 var desc = GetOwnPropertyJS(obj, name); | 1269 var desc = GetOwnPropertyJS(obj, name); |
| 1268 if (desc.isConfigurable()) { | 1270 if (desc.isConfigurable()) { |
| 1269 desc.setConfigurable(false); | 1271 desc.setConfigurable(false); |
| 1270 DefineOwnProperty(obj, name, desc, true); | 1272 DefineOwnProperty(obj, name, desc, true); |
| 1271 } | 1273 } |
| 1272 } | 1274 } |
| 1273 %PreventExtensions(obj); | 1275 %PreventExtensions(obj); |
| 1274 } else { | 1276 } else { |
| 1275 // TODO(adamk): Is it worth going to this fast path if the | 1277 // TODO(adamk): Is it worth going to this fast path if the |
| 1276 // object's properties are already in dictionary mode? | 1278 // object's properties are already in dictionary mode? |
| 1277 %ObjectSeal(obj); | 1279 %ObjectSeal(obj); |
| 1278 } | 1280 } |
| 1279 return obj; | 1281 return obj; |
| 1280 } | 1282 } |
| 1281 | 1283 |
| 1282 | 1284 |
| 1283 // ES5 section 15.2.3.9. | 1285 // ES5 section 15.2.3.9. |
| 1284 function ObjectFreezeJS(obj) { | 1286 function ObjectFreezeJS(obj) { |
| 1285 if (!IS_SPEC_OBJECT(obj)) return obj; | 1287 if (!IS_SPEC_OBJECT(obj)) { |
| 1288 throw MakeTypeError(kCalledOnNonObject, "Object.freeze"); |
| 1289 } |
| 1286 var isProxy = %_IsJSProxy(obj); | 1290 var isProxy = %_IsJSProxy(obj); |
| 1287 if (isProxy || %HasSloppyArgumentsElements(obj) || %IsObserved(obj)) { | 1291 if (isProxy || %HasSloppyArgumentsElements(obj) || %IsObserved(obj)) { |
| 1288 if (isProxy) { | 1292 if (isProxy) { |
| 1289 ProxyFix(obj); | 1293 ProxyFix(obj); |
| 1290 } | 1294 } |
| 1291 var names = ObjectGetOwnPropertyNames(obj); | 1295 var names = ObjectGetOwnPropertyNames(obj); |
| 1292 for (var i = 0; i < names.length; i++) { | 1296 for (var i = 0; i < names.length; i++) { |
| 1293 var name = names[i]; | 1297 var name = names[i]; |
| 1294 var desc = GetOwnPropertyJS(obj, name); | 1298 var desc = GetOwnPropertyJS(obj, name); |
| 1295 if (desc.isWritable() || desc.isConfigurable()) { | 1299 if (desc.isWritable() || desc.isConfigurable()) { |
| 1296 if (IsDataDescriptor(desc)) desc.setWritable(false); | 1300 if (IsDataDescriptor(desc)) desc.setWritable(false); |
| 1297 desc.setConfigurable(false); | 1301 desc.setConfigurable(false); |
| 1298 DefineOwnProperty(obj, name, desc, true); | 1302 DefineOwnProperty(obj, name, desc, true); |
| 1299 } | 1303 } |
| 1300 } | 1304 } |
| 1301 %PreventExtensions(obj); | 1305 %PreventExtensions(obj); |
| 1302 } else { | 1306 } else { |
| 1303 // TODO(adamk): Is it worth going to this fast path if the | 1307 // TODO(adamk): Is it worth going to this fast path if the |
| 1304 // object's properties are already in dictionary mode? | 1308 // object's properties are already in dictionary mode? |
| 1305 %ObjectFreeze(obj); | 1309 %ObjectFreeze(obj); |
| 1306 } | 1310 } |
| 1307 return obj; | 1311 return obj; |
| 1308 } | 1312 } |
| 1309 | 1313 |
| 1310 | 1314 |
| 1311 // ES5 section 15.2.3.10 | 1315 // ES5 section 15.2.3.10 |
| 1312 function ObjectPreventExtension(obj) { | 1316 function ObjectPreventExtension(obj) { |
| 1313 if (!IS_SPEC_OBJECT(obj)) return obj; | 1317 if (!IS_SPEC_OBJECT(obj)) { |
| 1318 throw MakeTypeError(kCalledOnNonObject, "Object.preventExtension"); |
| 1319 } |
| 1314 if (%_IsJSProxy(obj)) { | 1320 if (%_IsJSProxy(obj)) { |
| 1315 ProxyFix(obj); | 1321 ProxyFix(obj); |
| 1316 } | 1322 } |
| 1317 %PreventExtensions(obj); | 1323 %PreventExtensions(obj); |
| 1318 return obj; | 1324 return obj; |
| 1319 } | 1325 } |
| 1320 | 1326 |
| 1321 | 1327 |
| 1322 // ES5 section 15.2.3.11 | 1328 // ES5 section 15.2.3.11 |
| 1323 function ObjectIsSealed(obj) { | 1329 function ObjectIsSealed(obj) { |
| 1324 if (!IS_SPEC_OBJECT(obj)) return true; | 1330 if (!IS_SPEC_OBJECT(obj)) { |
| 1331 throw MakeTypeError(kCalledOnNonObject, "Object.isSealed"); |
| 1332 } |
| 1325 if (%_IsJSProxy(obj)) { | 1333 if (%_IsJSProxy(obj)) { |
| 1326 return false; | 1334 return false; |
| 1327 } | 1335 } |
| 1328 if (%IsExtensible(obj)) { | 1336 if (%IsExtensible(obj)) { |
| 1329 return false; | 1337 return false; |
| 1330 } | 1338 } |
| 1331 var names = ObjectGetOwnPropertyNames(obj); | 1339 var names = ObjectGetOwnPropertyNames(obj); |
| 1332 for (var i = 0; i < names.length; i++) { | 1340 for (var i = 0; i < names.length; i++) { |
| 1333 var name = names[i]; | 1341 var name = names[i]; |
| 1334 var desc = GetOwnPropertyJS(obj, name); | 1342 var desc = GetOwnPropertyJS(obj, name); |
| 1335 if (desc.isConfigurable()) { | 1343 if (desc.isConfigurable()) { |
| 1336 return false; | 1344 return false; |
| 1337 } | 1345 } |
| 1338 } | 1346 } |
| 1339 return true; | 1347 return true; |
| 1340 } | 1348 } |
| 1341 | 1349 |
| 1342 | 1350 |
| 1343 // ES5 section 15.2.3.12 | 1351 // ES5 section 15.2.3.12 |
| 1344 function ObjectIsFrozen(obj) { | 1352 function ObjectIsFrozen(obj) { |
| 1345 if (!IS_SPEC_OBJECT(obj)) return true; | 1353 if (!IS_SPEC_OBJECT(obj)) { |
| 1354 throw MakeTypeError(kCalledOnNonObject, "Object.isFrozen"); |
| 1355 } |
| 1346 if (%_IsJSProxy(obj)) { | 1356 if (%_IsJSProxy(obj)) { |
| 1347 return false; | 1357 return false; |
| 1348 } | 1358 } |
| 1349 if (%IsExtensible(obj)) { | 1359 if (%IsExtensible(obj)) { |
| 1350 return false; | 1360 return false; |
| 1351 } | 1361 } |
| 1352 var names = ObjectGetOwnPropertyNames(obj); | 1362 var names = ObjectGetOwnPropertyNames(obj); |
| 1353 for (var i = 0; i < names.length; i++) { | 1363 for (var i = 0; i < names.length; i++) { |
| 1354 var name = names[i]; | 1364 var name = names[i]; |
| 1355 var desc = GetOwnPropertyJS(obj, name); | 1365 var desc = GetOwnPropertyJS(obj, name); |
| 1356 if (IsDataDescriptor(desc) && desc.isWritable()) return false; | 1366 if (IsDataDescriptor(desc) && desc.isWritable()) return false; |
| 1357 if (desc.isConfigurable()) return false; | 1367 if (desc.isConfigurable()) return false; |
| 1358 } | 1368 } |
| 1359 return true; | 1369 return true; |
| 1360 } | 1370 } |
| 1361 | 1371 |
| 1362 | 1372 |
| 1363 // ES5 section 15.2.3.13 | 1373 // ES5 section 15.2.3.13 |
| 1364 function ObjectIsExtensible(obj) { | 1374 function ObjectIsExtensible(obj) { |
| 1365 if (!IS_SPEC_OBJECT(obj)) return false; | 1375 if (!IS_SPEC_OBJECT(obj)) { |
| 1376 throw MakeTypeError(kCalledOnNonObject, "Object.isExtensible"); |
| 1377 } |
| 1366 if (%_IsJSProxy(obj)) { | 1378 if (%_IsJSProxy(obj)) { |
| 1367 return true; | 1379 return true; |
| 1368 } | 1380 } |
| 1369 return %IsExtensible(obj); | 1381 return %IsExtensible(obj); |
| 1370 } | 1382 } |
| 1371 | 1383 |
| 1372 | 1384 |
| 1373 // ECMA-262, Edition 6, section 19.1.2.10 | 1385 // ECMA-262, Edition 6, section 19.1.2.10 |
| 1374 function ObjectIs(obj1, obj2) { | 1386 function ObjectIs(obj1, obj2) { |
| 1375 return SameValue(obj1, obj2); | 1387 return SameValue(obj1, obj2); |
| (...skipping 522 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1898 } | 1910 } |
| 1899 if (!IS_SPEC_FUNCTION(method)) { | 1911 if (!IS_SPEC_FUNCTION(method)) { |
| 1900 throw MakeTypeError(kNotIterable, obj); | 1912 throw MakeTypeError(kNotIterable, obj); |
| 1901 } | 1913 } |
| 1902 var iterator = %_CallFunction(obj, method); | 1914 var iterator = %_CallFunction(obj, method); |
| 1903 if (!IS_SPEC_OBJECT(iterator)) { | 1915 if (!IS_SPEC_OBJECT(iterator)) { |
| 1904 throw MakeTypeError(kNotAnIterator, iterator); | 1916 throw MakeTypeError(kNotAnIterator, iterator); |
| 1905 } | 1917 } |
| 1906 return iterator; | 1918 return iterator; |
| 1907 } | 1919 } |
| OLD | NEW |