Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(344)

Side by Side Diff: src/v8natives.js

Issue 13533004: Make __proto__ a real JavaScript accessor property. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Add poisoning of the property descriptor. Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/runtime.cc ('k') | test/mjsunit/proto-poison.js » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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 304 matching lines...) Expand 10 before | Expand all | Expand 10 after
387 function FromPropertyDescriptor(desc) { 399 function FromPropertyDescriptor(desc) {
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() === ObjectGetProto ? ObjectPoisonProto
rossberg 2013/04/04 09:58:43 I don't think there is a need (or the intention) t
Michael Starzinger 2013/04/04 11:52:19 Done.
398 set: desc.getSet(), 410 : desc.getGet(),
411 set: desc.getSet() === ObjectSetProto ? ObjectPoisonProto
412 : desc.getSet(),
399 enumerable: desc.isEnumerable(), 413 enumerable: desc.isEnumerable(),
400 configurable: desc.isConfigurable() }; 414 configurable: desc.isConfigurable() };
401 } 415 }
402 416
403 417
404 // Harmony Proxies 418 // Harmony Proxies
405 function FromGenericPropertyDescriptor(desc) { 419 function FromGenericPropertyDescriptor(desc) {
406 if (IS_UNDEFINED(desc)) return desc; 420 if (IS_UNDEFINED(desc)) return desc;
407 var obj = new $Object(); 421 var obj = new $Object();
408 422
(...skipping 910 matching lines...) Expand 10 before | Expand all | Expand 10 after
1319 // Harmony egal. 1333 // Harmony egal.
1320 function ObjectIs(obj1, obj2) { 1334 function ObjectIs(obj1, obj2) {
1321 if (obj1 === obj2) { 1335 if (obj1 === obj2) {
1322 return (obj1 !== 0) || (1 / obj1 === 1 / obj2); 1336 return (obj1 !== 0) || (1 / obj1 === 1 / obj2);
1323 } else { 1337 } else {
1324 return (obj1 !== obj1) && (obj2 !== obj2); 1338 return (obj1 !== obj1) && (obj2 !== obj2);
1325 } 1339 }
1326 } 1340 }
1327 1341
1328 1342
1343 // Harmony __proto__ getter.
1344 function ObjectGetProto() {
1345 return %GetPrototype(this);
1346 }
1347
1348
1349 // Harmony __proto__ setter.
1350 function ObjectSetProto(obj) {
1351 return %SetPrototype(this, obj);
1352 }
1353
1354
1355 // Harmony __proto__ poison pill.
1356 function ObjectPoisonProto() {
1357 throw MakeTypeError("proto_poison_pill", []);
1358 }
1359
1360
1329 %SetCode($Object, function(x) { 1361 %SetCode($Object, function(x) {
1330 if (%_IsConstructCall()) { 1362 if (%_IsConstructCall()) {
1331 if (x == null) return this; 1363 if (x == null) return this;
1332 return ToObject(x); 1364 return ToObject(x);
1333 } else { 1365 } else {
1334 if (x == null) return { }; 1366 if (x == null) return { };
1335 return ToObject(x); 1367 return ToObject(x);
1336 } 1368 }
1337 }); 1369 });
1338 1370
1339 %SetExpectedNumberOfProperties($Object, 4);
1340 1371
1341 // ---------------------------------------------------------------------------- 1372 // ----------------------------------------------------------------------------
1342 // Object 1373 // Object
1343 1374
1344 function SetUpObject() { 1375 function SetUpObject() {
1345 %CheckIsBootstrapping(); 1376 %CheckIsBootstrapping();
1346 // Set Up non-enumerable functions on the Object.prototype object. 1377
1378 %FunctionSetName(ObjectPoisonProto, "__proto__");
1379 %FunctionRemovePrototype(ObjectPoisonProto);
1380 %SetExpectedNumberOfProperties($Object, 4);
1381
1382 // Set up non-enumerable functions on the Object.prototype object.
1347 InstallFunctions($Object.prototype, DONT_ENUM, $Array( 1383 InstallFunctions($Object.prototype, DONT_ENUM, $Array(
1348 "toString", ObjectToString, 1384 "toString", ObjectToString,
1349 "toLocaleString", ObjectToLocaleString, 1385 "toLocaleString", ObjectToLocaleString,
1350 "valueOf", ObjectValueOf, 1386 "valueOf", ObjectValueOf,
1351 "hasOwnProperty", ObjectHasOwnProperty, 1387 "hasOwnProperty", ObjectHasOwnProperty,
1352 "isPrototypeOf", ObjectIsPrototypeOf, 1388 "isPrototypeOf", ObjectIsPrototypeOf,
1353 "propertyIsEnumerable", ObjectPropertyIsEnumerable, 1389 "propertyIsEnumerable", ObjectPropertyIsEnumerable,
1354 "__defineGetter__", ObjectDefineGetter, 1390 "__defineGetter__", ObjectDefineGetter,
1355 "__lookupGetter__", ObjectLookupGetter, 1391 "__lookupGetter__", ObjectLookupGetter,
1356 "__defineSetter__", ObjectDefineSetter, 1392 "__defineSetter__", ObjectDefineSetter,
1357 "__lookupSetter__", ObjectLookupSetter 1393 "__lookupSetter__", ObjectLookupSetter
1358 )); 1394 ));
1395 InstallGetterSetter($Object.prototype, "__proto__",
1396 ObjectGetProto, ObjectSetProto);
1397
1398 // Set up non-enumerable functions in the Object object.
1359 InstallFunctions($Object, DONT_ENUM, $Array( 1399 InstallFunctions($Object, DONT_ENUM, $Array(
1360 "keys", ObjectKeys, 1400 "keys", ObjectKeys,
1361 "create", ObjectCreate, 1401 "create", ObjectCreate,
1362 "defineProperty", ObjectDefineProperty, 1402 "defineProperty", ObjectDefineProperty,
1363 "defineProperties", ObjectDefineProperties, 1403 "defineProperties", ObjectDefineProperties,
1364 "freeze", ObjectFreeze, 1404 "freeze", ObjectFreeze,
1365 "getPrototypeOf", ObjectGetPrototypeOf, 1405 "getPrototypeOf", ObjectGetPrototypeOf,
1366 "getOwnPropertyDescriptor", ObjectGetOwnPropertyDescriptor, 1406 "getOwnPropertyDescriptor", ObjectGetOwnPropertyDescriptor,
1367 "getOwnPropertyNames", ObjectGetOwnPropertyNames, 1407 "getOwnPropertyNames", ObjectGetOwnPropertyNames,
1368 "is", ObjectIs, 1408 "is", ObjectIs,
(...skipping 382 matching lines...) Expand 10 before | Expand all | Expand 10 after
1751 1791
1752 function SetUpFunction() { 1792 function SetUpFunction() {
1753 %CheckIsBootstrapping(); 1793 %CheckIsBootstrapping();
1754 InstallFunctions($Function.prototype, DONT_ENUM, $Array( 1794 InstallFunctions($Function.prototype, DONT_ENUM, $Array(
1755 "bind", FunctionBind, 1795 "bind", FunctionBind,
1756 "toString", FunctionToString 1796 "toString", FunctionToString
1757 )); 1797 ));
1758 } 1798 }
1759 1799
1760 SetUpFunction(); 1800 SetUpFunction();
OLDNEW
« no previous file with comments | « src/runtime.cc ('k') | test/mjsunit/proto-poison.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698