OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
54 var f = functions[i + 1]; | 54 var f = functions[i + 1]; |
55 %FunctionSetName(f, key); | 55 %FunctionSetName(f, key); |
56 %FunctionRemovePrototype(f); | 56 %FunctionRemovePrototype(f); |
57 %SetProperty(object, key, f, attributes); | 57 %SetProperty(object, key, f, attributes); |
58 %SetNativeFlag(f); | 58 %SetNativeFlag(f); |
59 } | 59 } |
60 %ToFastProperties(object); | 60 %ToFastProperties(object); |
61 } | 61 } |
62 | 62 |
63 | 63 |
64 // Helper function to install a getter only property. | 64 // Helper function to install a getter-only accessor property. |
65 function InstallGetter(object, name, getter) { | 65 function InstallGetter(object, name, getter) { |
66 %FunctionSetName(getter, name); | 66 %FunctionSetName(getter, name); |
67 %FunctionRemovePrototype(getter); | 67 %FunctionRemovePrototype(getter); |
68 %DefineOrRedefineAccessorProperty(object, name, getter, null, DONT_ENUM); | 68 %DefineOrRedefineAccessorProperty(object, name, getter, null, DONT_ENUM); |
69 %SetNativeFlag(getter); | 69 %SetNativeFlag(getter); |
70 } | 70 } |
71 | 71 |
72 | 72 |
| 73 // Helper function to install a getter/setter accessor property. |
| 74 function InstallGetterSetter(object, name, getter, setter) { |
| 75 %FunctionSetName(getter, name); |
| 76 %FunctionSetName(setter, name); |
| 77 %FunctionRemovePrototype(getter); |
| 78 %FunctionRemovePrototype(setter); |
| 79 %DefineOrRedefineAccessorProperty(object, name, getter, setter, DONT_ENUM); |
| 80 %SetNativeFlag(getter); |
| 81 %SetNativeFlag(setter); |
| 82 } |
| 83 |
| 84 |
73 // Prevents changes to the prototype of a built-in function. | 85 // Prevents changes to the prototype of a built-in function. |
74 // The "prototype" property of the function object is made non-configurable, | 86 // The "prototype" property of the function object is made non-configurable, |
75 // and the prototype object is made non-extensible. The latter prevents | 87 // and the prototype object is made non-extensible. The latter prevents |
76 // changing the __proto__ property. | 88 // changing the __proto__ property. |
77 function SetUpLockedPrototype(constructor, fields, methods) { | 89 function SetUpLockedPrototype(constructor, fields, methods) { |
78 %CheckIsBootstrapping(); | 90 %CheckIsBootstrapping(); |
79 var prototype = constructor.prototype; | 91 var prototype = constructor.prototype; |
80 // Install functions first, because this function is used to initialize | 92 // Install functions first, because this function is used to initialize |
81 // PropertyDescriptor itself. | 93 // PropertyDescriptor itself. |
82 var property_count = (methods.length >> 1) + (fields ? fields.length : 0); | 94 var property_count = (methods.length >> 1) + (fields ? fields.length : 0); |
(...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
388 if (IS_UNDEFINED(desc)) return desc; | 400 if (IS_UNDEFINED(desc)) return desc; |
389 | 401 |
390 if (IsDataDescriptor(desc)) { | 402 if (IsDataDescriptor(desc)) { |
391 return { value: desc.getValue(), | 403 return { value: desc.getValue(), |
392 writable: desc.isWritable(), | 404 writable: desc.isWritable(), |
393 enumerable: desc.isEnumerable(), | 405 enumerable: desc.isEnumerable(), |
394 configurable: desc.isConfigurable() }; | 406 configurable: desc.isConfigurable() }; |
395 } | 407 } |
396 // Must be an AccessorDescriptor then. We never return a generic descriptor. | 408 // Must be an AccessorDescriptor then. We never return a generic descriptor. |
397 return { get: desc.getGet(), | 409 return { get: desc.getGet(), |
398 set: desc.getSet(), | 410 set: desc.getSet() === ObjectSetProto ? ObjectPoisonProto |
| 411 : desc.getSet(), |
399 enumerable: desc.isEnumerable(), | 412 enumerable: desc.isEnumerable(), |
400 configurable: desc.isConfigurable() }; | 413 configurable: desc.isConfigurable() }; |
401 } | 414 } |
402 | 415 |
403 | 416 |
404 // Harmony Proxies | 417 // Harmony Proxies |
405 function FromGenericPropertyDescriptor(desc) { | 418 function FromGenericPropertyDescriptor(desc) { |
406 if (IS_UNDEFINED(desc)) return desc; | 419 if (IS_UNDEFINED(desc)) return desc; |
407 var obj = new $Object(); | 420 var obj = new $Object(); |
408 | 421 |
(...skipping 910 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1319 // Harmony egal. | 1332 // Harmony egal. |
1320 function ObjectIs(obj1, obj2) { | 1333 function ObjectIs(obj1, obj2) { |
1321 if (obj1 === obj2) { | 1334 if (obj1 === obj2) { |
1322 return (obj1 !== 0) || (1 / obj1 === 1 / obj2); | 1335 return (obj1 !== 0) || (1 / obj1 === 1 / obj2); |
1323 } else { | 1336 } else { |
1324 return (obj1 !== obj1) && (obj2 !== obj2); | 1337 return (obj1 !== obj1) && (obj2 !== obj2); |
1325 } | 1338 } |
1326 } | 1339 } |
1327 | 1340 |
1328 | 1341 |
| 1342 // Harmony __proto__ getter. |
| 1343 function ObjectGetProto() { |
| 1344 return %GetPrototype(this); |
| 1345 } |
| 1346 |
| 1347 |
| 1348 // Harmony __proto__ setter. |
| 1349 function ObjectSetProto(obj) { |
| 1350 return %SetPrototype(this, obj); |
| 1351 } |
| 1352 |
| 1353 |
| 1354 // Harmony __proto__ poison pill. |
| 1355 function ObjectPoisonProto(obj) { |
| 1356 throw MakeTypeError("proto_poison_pill", []); |
| 1357 } |
| 1358 |
| 1359 |
1329 %SetCode($Object, function(x) { | 1360 %SetCode($Object, function(x) { |
1330 if (%_IsConstructCall()) { | 1361 if (%_IsConstructCall()) { |
1331 if (x == null) return this; | 1362 if (x == null) return this; |
1332 return ToObject(x); | 1363 return ToObject(x); |
1333 } else { | 1364 } else { |
1334 if (x == null) return { }; | 1365 if (x == null) return { }; |
1335 return ToObject(x); | 1366 return ToObject(x); |
1336 } | 1367 } |
1337 }); | 1368 }); |
1338 | 1369 |
1339 %SetExpectedNumberOfProperties($Object, 4); | |
1340 | 1370 |
1341 // ---------------------------------------------------------------------------- | 1371 // ---------------------------------------------------------------------------- |
1342 // Object | 1372 // Object |
1343 | 1373 |
1344 function SetUpObject() { | 1374 function SetUpObject() { |
1345 %CheckIsBootstrapping(); | 1375 %CheckIsBootstrapping(); |
1346 // Set Up non-enumerable functions on the Object.prototype object. | 1376 |
| 1377 %FunctionSetName(ObjectPoisonProto, "__proto__"); |
| 1378 %FunctionRemovePrototype(ObjectPoisonProto); |
| 1379 %SetExpectedNumberOfProperties($Object, 4); |
| 1380 |
| 1381 // Set up non-enumerable functions on the Object.prototype object. |
1347 InstallFunctions($Object.prototype, DONT_ENUM, $Array( | 1382 InstallFunctions($Object.prototype, DONT_ENUM, $Array( |
1348 "toString", ObjectToString, | 1383 "toString", ObjectToString, |
1349 "toLocaleString", ObjectToLocaleString, | 1384 "toLocaleString", ObjectToLocaleString, |
1350 "valueOf", ObjectValueOf, | 1385 "valueOf", ObjectValueOf, |
1351 "hasOwnProperty", ObjectHasOwnProperty, | 1386 "hasOwnProperty", ObjectHasOwnProperty, |
1352 "isPrototypeOf", ObjectIsPrototypeOf, | 1387 "isPrototypeOf", ObjectIsPrototypeOf, |
1353 "propertyIsEnumerable", ObjectPropertyIsEnumerable, | 1388 "propertyIsEnumerable", ObjectPropertyIsEnumerable, |
1354 "__defineGetter__", ObjectDefineGetter, | 1389 "__defineGetter__", ObjectDefineGetter, |
1355 "__lookupGetter__", ObjectLookupGetter, | 1390 "__lookupGetter__", ObjectLookupGetter, |
1356 "__defineSetter__", ObjectDefineSetter, | 1391 "__defineSetter__", ObjectDefineSetter, |
1357 "__lookupSetter__", ObjectLookupSetter | 1392 "__lookupSetter__", ObjectLookupSetter |
1358 )); | 1393 )); |
| 1394 InstallGetterSetter($Object.prototype, "__proto__", |
| 1395 ObjectGetProto, ObjectSetProto); |
| 1396 |
| 1397 // Set up non-enumerable functions in the Object object. |
1359 InstallFunctions($Object, DONT_ENUM, $Array( | 1398 InstallFunctions($Object, DONT_ENUM, $Array( |
1360 "keys", ObjectKeys, | 1399 "keys", ObjectKeys, |
1361 "create", ObjectCreate, | 1400 "create", ObjectCreate, |
1362 "defineProperty", ObjectDefineProperty, | 1401 "defineProperty", ObjectDefineProperty, |
1363 "defineProperties", ObjectDefineProperties, | 1402 "defineProperties", ObjectDefineProperties, |
1364 "freeze", ObjectFreeze, | 1403 "freeze", ObjectFreeze, |
1365 "getPrototypeOf", ObjectGetPrototypeOf, | 1404 "getPrototypeOf", ObjectGetPrototypeOf, |
1366 "getOwnPropertyDescriptor", ObjectGetOwnPropertyDescriptor, | 1405 "getOwnPropertyDescriptor", ObjectGetOwnPropertyDescriptor, |
1367 "getOwnPropertyNames", ObjectGetOwnPropertyNames, | 1406 "getOwnPropertyNames", ObjectGetOwnPropertyNames, |
1368 "is", ObjectIs, | 1407 "is", ObjectIs, |
(...skipping 382 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1751 | 1790 |
1752 function SetUpFunction() { | 1791 function SetUpFunction() { |
1753 %CheckIsBootstrapping(); | 1792 %CheckIsBootstrapping(); |
1754 InstallFunctions($Function.prototype, DONT_ENUM, $Array( | 1793 InstallFunctions($Function.prototype, DONT_ENUM, $Array( |
1755 "bind", FunctionBind, | 1794 "bind", FunctionBind, |
1756 "toString", FunctionToString | 1795 "toString", FunctionToString |
1757 )); | 1796 )); |
1758 } | 1797 } |
1759 | 1798 |
1760 SetUpFunction(); | 1799 SetUpFunction(); |
OLD | NEW |