Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 59 %SetNativeFlag(f); | 59 %SetNativeFlag(f); |
| 60 } | 60 } |
| 61 %ToFastProperties(object); | 61 %ToFastProperties(object); |
| 62 } | 62 } |
| 63 | 63 |
| 64 // Emulates JSC by installing functions on a hidden prototype that | 64 // Emulates JSC by installing functions on a hidden prototype that |
| 65 // lies above the current object/prototype. This lets you override | 65 // lies above the current object/prototype. This lets you override |
| 66 // functions on String.prototype etc. and then restore the old function | 66 // functions on String.prototype etc. and then restore the old function |
| 67 // with delete. See http://code.google.com/p/chromium/issues/detail?id=1717 | 67 // with delete. See http://code.google.com/p/chromium/issues/detail?id=1717 |
| 68 function InstallFunctionsOnHiddenPrototype(object, attributes, functions) { | 68 function InstallFunctionsOnHiddenPrototype(object, attributes, functions) { |
| 69 %AssertIsBootstrapping(); | |
| 69 var hidden_prototype = new $Object(); | 70 var hidden_prototype = new $Object(); |
| 70 %SetHiddenPrototype(object, hidden_prototype); | 71 %SetHiddenPrototype(object, hidden_prototype); |
| 71 InstallFunctions(hidden_prototype, attributes, functions); | 72 InstallFunctions(hidden_prototype, attributes, functions); |
| 72 } | 73 } |
| 73 | 74 |
| 74 | 75 |
| 76 // Prevents changes to the prototype of a built-infunction. | |
| 77 // The "prototype" property of the function object is made non-configurable, | |
| 78 // and the prototype object is made non-extensible. The latter prevents | |
| 79 // changing the __proto__ property. | |
| 80 function SetupLockedPrototype(constructor, fields, methods) { | |
| 81 %AssertIsBootstrapping(); | |
| 82 var prototype = constructor.prototype; | |
| 83 // Install functions first, because this function is used to initialize | |
| 84 // PropertyDescriptor itself. | |
| 85 InstallFunctions(prototype, DONT_DELETE | DONT_ENUM | READ_ONLY, methods); | |
| 86 if (fields) { | |
| 87 for (var i = 0; i < fields.length; i++) { | |
| 88 %SetProperty(prototype, fields[i], void 0, DONT_ENUM | DONT_DELETE); | |
| 89 } | |
| 90 } | |
| 91 var desc = GetOwnProperty(constructor, "prototype"); | |
| 92 desc.setWritable(false); | |
| 93 desc.setConfigurable(false); | |
| 94 DefineOwnProperty(constructor, "prototype", desc, false); | |
| 95 prototype.__proto__ = null; | |
| 96 %PreventExtensions(prototype); | |
| 97 } | |
| 98 | |
| 99 | |
| 75 // ---------------------------------------------------------------------------- | 100 // ---------------------------------------------------------------------------- |
| 76 | 101 |
| 77 | 102 |
| 78 // ECMA 262 - 15.1.4 | 103 // ECMA 262 - 15.1.4 |
| 79 function GlobalIsNaN(number) { | 104 function GlobalIsNaN(number) { |
| 80 var n = ToNumber(number); | 105 var n = ToNumber(number); |
| 81 return NUMBER_IS_NAN(n); | 106 return NUMBER_IS_NAN(n); |
| 82 } | 107 } |
| 83 | 108 |
| 84 | 109 |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 153 var f = %CompileString(x); | 178 var f = %CompileString(x); |
| 154 if (!IS_FUNCTION(f)) return f; | 179 if (!IS_FUNCTION(f)) return f; |
| 155 | 180 |
| 156 return %_CallFunction(receiver, f); | 181 return %_CallFunction(receiver, f); |
| 157 } | 182 } |
| 158 | 183 |
| 159 | 184 |
| 160 // ---------------------------------------------------------------------------- | 185 // ---------------------------------------------------------------------------- |
| 161 | 186 |
| 162 | 187 |
| 163 function SetupGlobal() { | 188 function SetupGlobal() { |
|
Erik Corry
2011/08/31 05:46:04
SetUpGlobal
| |
| 189 %AssertIsBootstrapping(); | |
| 164 // ECMA 262 - 15.1.1.1. | 190 // ECMA 262 - 15.1.1.1. |
| 165 %SetProperty(global, "NaN", $NaN, DONT_ENUM | DONT_DELETE); | 191 %SetProperty(global, "NaN", $NaN, DONT_ENUM | DONT_DELETE); |
| 166 | 192 |
| 167 // ECMA-262 - 15.1.1.2. | 193 // ECMA-262 - 15.1.1.2. |
| 168 %SetProperty(global, "Infinity", 1/0, DONT_ENUM | DONT_DELETE); | 194 %SetProperty(global, "Infinity", 1/0, DONT_ENUM | DONT_DELETE); |
| 169 | 195 |
| 170 // ECMA-262 - 15.1.1.3. | 196 // ECMA-262 - 15.1.1.3. |
| 171 %SetProperty(global, "undefined", void 0, DONT_ENUM | DONT_DELETE); | 197 %SetProperty(global, "undefined", void 0, DONT_ENUM | DONT_DELETE); |
| 172 | 198 |
| 173 // Setup non-enumerable function on the global object. | 199 // Setup non-enumerable function on the global object. |
| (...skipping 297 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 471 this.enumerable_ = false; | 497 this.enumerable_ = false; |
| 472 this.hasEnumerable_ = false; | 498 this.hasEnumerable_ = false; |
| 473 this.configurable_ = false; | 499 this.configurable_ = false; |
| 474 this.hasConfigurable_ = false; | 500 this.hasConfigurable_ = false; |
| 475 this.get_ = void 0; | 501 this.get_ = void 0; |
| 476 this.hasGetter_ = false; | 502 this.hasGetter_ = false; |
| 477 this.set_ = void 0; | 503 this.set_ = void 0; |
| 478 this.hasSetter_ = false; | 504 this.hasSetter_ = false; |
| 479 } | 505 } |
| 480 | 506 |
| 481 PropertyDescriptor.prototype.__proto__ = null; | 507 SetupLockedPrototype(PropertyDescriptor, $Array( |
|
Erik Corry
2011/08/31 05:46:04
SetUpLockedPrototype
| |
| 482 | 508 "value_", |
| 483 PropertyDescriptor.prototype.toString = function() { | 509 "hasValue_", |
| 484 return "[object PropertyDescriptor]"; | 510 "writable_", |
| 485 }; | 511 "hasWritable_", |
| 486 | 512 "enumerable_", |
| 487 PropertyDescriptor.prototype.setValue = function(value) { | 513 "hasEnumerable_", |
| 488 this.value_ = value; | 514 "configurable_", |
| 489 this.hasValue_ = true; | 515 "hasConfigurable_", |
| 490 } | 516 "get_", |
| 491 | 517 "hasGetter_", |
| 492 | 518 "set_", |
| 493 PropertyDescriptor.prototype.getValue = function() { | 519 "hasSetter_" |
| 494 return this.value_; | 520 ), $Array( |
| 495 } | 521 "toString", function() { |
| 496 | 522 return "[object PropertyDescriptor]"; |
| 497 | 523 }, |
| 498 PropertyDescriptor.prototype.hasValue = function() { | 524 "setValue", function(value) { |
| 499 return this.hasValue_; | 525 this.value_ = value; |
| 500 } | 526 this.hasValue_ = true; |
| 501 | 527 }, |
| 502 | 528 "getValue", function() { |
| 503 PropertyDescriptor.prototype.setEnumerable = function(enumerable) { | 529 return this.value_; |
| 504 this.enumerable_ = enumerable; | 530 }, |
| 505 this.hasEnumerable_ = true; | 531 "hasValue", function() { |
| 506 } | 532 return this.hasValue_; |
| 507 | 533 }, |
| 508 | 534 "setEnumerable", function(enumerable) { |
| 509 PropertyDescriptor.prototype.isEnumerable = function () { | 535 this.enumerable_ = enumerable; |
| 510 return this.enumerable_; | 536 this.hasEnumerable_ = true; |
| 511 } | 537 }, |
| 512 | 538 "isEnumerable", function () { |
| 513 | 539 return this.enumerable_; |
| 514 PropertyDescriptor.prototype.hasEnumerable = function() { | 540 }, |
| 515 return this.hasEnumerable_; | 541 "hasEnumerable", function() { |
| 516 } | 542 return this.hasEnumerable_; |
| 517 | 543 }, |
| 518 | 544 "setWritable", function(writable) { |
| 519 PropertyDescriptor.prototype.setWritable = function(writable) { | 545 this.writable_ = writable; |
| 520 this.writable_ = writable; | 546 this.hasWritable_ = true; |
| 521 this.hasWritable_ = true; | 547 }, |
| 522 } | 548 "isWritable", function() { |
| 523 | 549 return this.writable_; |
| 524 | 550 }, |
| 525 PropertyDescriptor.prototype.isWritable = function() { | 551 "hasWritable", function() { |
| 526 return this.writable_; | 552 return this.hasWritable_; |
| 527 } | 553 }, |
| 528 | 554 "setConfigurable", function(configurable) { |
| 529 | 555 this.configurable_ = configurable; |
| 530 PropertyDescriptor.prototype.hasWritable = function() { | 556 this.hasConfigurable_ = true; |
| 531 return this.hasWritable_; | 557 }, |
| 532 } | 558 "hasConfigurable", function() { |
| 533 | 559 return this.hasConfigurable_; |
| 534 | 560 }, |
| 535 PropertyDescriptor.prototype.setConfigurable = function(configurable) { | 561 "isConfigurable", function() { |
| 536 this.configurable_ = configurable; | 562 return this.configurable_; |
| 537 this.hasConfigurable_ = true; | 563 }, |
| 538 } | 564 "setGet", function(get) { |
| 539 | 565 this.get_ = get; |
| 540 | 566 this.hasGetter_ = true; |
| 541 PropertyDescriptor.prototype.hasConfigurable = function() { | 567 }, |
| 542 return this.hasConfigurable_; | 568 "getGet", function() { |
| 543 } | 569 return this.get_; |
| 544 | 570 }, |
| 545 | 571 "hasGetter", function() { |
| 546 PropertyDescriptor.prototype.isConfigurable = function() { | 572 return this.hasGetter_; |
| 547 return this.configurable_; | 573 }, |
| 548 } | 574 "setSet", function(set) { |
| 549 | 575 this.set_ = set; |
| 550 | 576 this.hasSetter_ = true; |
| 551 PropertyDescriptor.prototype.setGet = function(get) { | 577 }, |
| 552 this.get_ = get; | 578 "getSet", function() { |
| 553 this.hasGetter_ = true; | 579 return this.set_; |
| 554 } | 580 }, |
| 555 | 581 "hasSetter", function() { |
| 556 | 582 return this.hasSetter_; |
| 557 PropertyDescriptor.prototype.getGet = function() { | 583 })); |
| 558 return this.get_; | |
| 559 } | |
| 560 | |
| 561 | |
| 562 PropertyDescriptor.prototype.hasGetter = function() { | |
| 563 return this.hasGetter_; | |
| 564 } | |
| 565 | |
| 566 | |
| 567 PropertyDescriptor.prototype.setSet = function(set) { | |
| 568 this.set_ = set; | |
| 569 this.hasSetter_ = true; | |
| 570 } | |
| 571 | |
| 572 | |
| 573 PropertyDescriptor.prototype.getSet = function() { | |
| 574 return this.set_; | |
| 575 } | |
| 576 | |
| 577 | |
| 578 PropertyDescriptor.prototype.hasSetter = function() { | |
| 579 return this.hasSetter_; | |
| 580 } | |
| 581 | 584 |
| 582 | 585 |
| 583 // Converts an array returned from Runtime_GetOwnProperty to an actual | 586 // Converts an array returned from Runtime_GetOwnProperty to an actual |
| 584 // property descriptor. For a description of the array layout please | 587 // property descriptor. For a description of the array layout please |
| 585 // see the runtime.cc file. | 588 // see the runtime.cc file. |
| 586 function ConvertDescriptorArrayToDescriptor(desc_array) { | 589 function ConvertDescriptorArrayToDescriptor(desc_array) { |
| 587 if (desc_array === false) { | 590 if (desc_array === false) { |
| 588 throw 'Internal error: invalid desc_array'; | 591 throw 'Internal error: invalid desc_array'; |
| 589 } | 592 } |
| 590 | 593 |
| (...skipping 569 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1160 if (x == null) return { }; | 1163 if (x == null) return { }; |
| 1161 return ToObject(x); | 1164 return ToObject(x); |
| 1162 } | 1165 } |
| 1163 }); | 1166 }); |
| 1164 | 1167 |
| 1165 %SetExpectedNumberOfProperties($Object, 4); | 1168 %SetExpectedNumberOfProperties($Object, 4); |
| 1166 | 1169 |
| 1167 // ---------------------------------------------------------------------------- | 1170 // ---------------------------------------------------------------------------- |
| 1168 | 1171 |
| 1169 | 1172 |
| 1170 function SetupObject() { | 1173 function SetupObject() { |
|
Erik Corry
2011/08/31 05:46:04
SetUpObject
| |
| 1174 %AssertIsBootstrapping(); | |
| 1171 // Setup non-enumerable functions on the Object.prototype object. | 1175 // Setup non-enumerable functions on the Object.prototype object. |
| 1172 InstallFunctions($Object.prototype, DONT_ENUM, $Array( | 1176 InstallFunctions($Object.prototype, DONT_ENUM, $Array( |
| 1173 "toString", ObjectToString, | 1177 "toString", ObjectToString, |
| 1174 "toLocaleString", ObjectToLocaleString, | 1178 "toLocaleString", ObjectToLocaleString, |
| 1175 "valueOf", ObjectValueOf, | 1179 "valueOf", ObjectValueOf, |
| 1176 "hasOwnProperty", ObjectHasOwnProperty, | 1180 "hasOwnProperty", ObjectHasOwnProperty, |
| 1177 "isPrototypeOf", ObjectIsPrototypeOf, | 1181 "isPrototypeOf", ObjectIsPrototypeOf, |
| 1178 "propertyIsEnumerable", ObjectPropertyIsEnumerable, | 1182 "propertyIsEnumerable", ObjectPropertyIsEnumerable, |
| 1179 "__defineGetter__", ObjectDefineGetter, | 1183 "__defineGetter__", ObjectDefineGetter, |
| 1180 "__lookupGetter__", ObjectLookupGetter, | 1184 "__lookupGetter__", ObjectLookupGetter, |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1223 // 'this'. This is not as dictated by ECMA-262. | 1227 // 'this'. This is not as dictated by ECMA-262. |
| 1224 if (!IS_BOOLEAN(this) && !IS_BOOLEAN_WRAPPER(this)) | 1228 if (!IS_BOOLEAN(this) && !IS_BOOLEAN_WRAPPER(this)) |
| 1225 throw new $TypeError('Boolean.prototype.valueOf is not generic'); | 1229 throw new $TypeError('Boolean.prototype.valueOf is not generic'); |
| 1226 return %_ValueOf(this); | 1230 return %_ValueOf(this); |
| 1227 } | 1231 } |
| 1228 | 1232 |
| 1229 | 1233 |
| 1230 // ---------------------------------------------------------------------------- | 1234 // ---------------------------------------------------------------------------- |
| 1231 | 1235 |
| 1232 | 1236 |
| 1233 function SetupBoolean() { | 1237 function SetupBoolean() { |
|
Erik Corry
2011/08/31 05:46:04
SetUpBoolean
| |
| 1238 %AssertIsBootstrapping(); | |
| 1234 InstallFunctions($Boolean.prototype, DONT_ENUM, $Array( | 1239 InstallFunctions($Boolean.prototype, DONT_ENUM, $Array( |
| 1235 "toString", BooleanToString, | 1240 "toString", BooleanToString, |
| 1236 "valueOf", BooleanValueOf | 1241 "valueOf", BooleanValueOf |
| 1237 )); | 1242 )); |
| 1238 } | 1243 } |
| 1239 | 1244 |
| 1240 SetupBoolean(); | 1245 SetupBoolean(); |
| 1241 | 1246 |
| 1242 // ---------------------------------------------------------------------------- | 1247 // ---------------------------------------------------------------------------- |
| 1243 // Number | 1248 // Number |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1345 throw new $RangeError("toPrecision() argument must be between 1 and 21"); | 1350 throw new $RangeError("toPrecision() argument must be between 1 and 21"); |
| 1346 } | 1351 } |
| 1347 var x = ToNumber(this); | 1352 var x = ToNumber(this); |
| 1348 return %NumberToPrecision(x, p); | 1353 return %NumberToPrecision(x, p); |
| 1349 } | 1354 } |
| 1350 | 1355 |
| 1351 | 1356 |
| 1352 // ---------------------------------------------------------------------------- | 1357 // ---------------------------------------------------------------------------- |
| 1353 | 1358 |
| 1354 function SetupNumber() { | 1359 function SetupNumber() { |
| 1360 %AssertIsBootstrapping(); | |
|
Erik Corry
2011/08/31 05:46:04
SetUpNumber
| |
| 1355 %OptimizeObjectForAddingMultipleProperties($Number.prototype, 8); | 1361 %OptimizeObjectForAddingMultipleProperties($Number.prototype, 8); |
| 1356 // Setup the constructor property on the Number prototype object. | 1362 // Setup the constructor property on the Number prototype object. |
| 1357 %SetProperty($Number.prototype, "constructor", $Number, DONT_ENUM); | 1363 %SetProperty($Number.prototype, "constructor", $Number, DONT_ENUM); |
| 1358 | 1364 |
| 1359 %OptimizeObjectForAddingMultipleProperties($Number, 5); | 1365 %OptimizeObjectForAddingMultipleProperties($Number, 5); |
| 1360 // ECMA-262 section 15.7.3.1. | 1366 // ECMA-262 section 15.7.3.1. |
| 1361 %SetProperty($Number, | 1367 %SetProperty($Number, |
| 1362 "MAX_VALUE", | 1368 "MAX_VALUE", |
| 1363 1.7976931348623157e+308, | 1369 1.7976931348623157e+308, |
| 1364 DONT_ENUM | DONT_DELETE | READ_ONLY); | 1370 DONT_ENUM | DONT_DELETE | READ_ONLY); |
| (...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1516 var f = %CompileString(source)(); | 1522 var f = %CompileString(source)(); |
| 1517 %FunctionMarkNameShouldPrintAsAnonymous(f); | 1523 %FunctionMarkNameShouldPrintAsAnonymous(f); |
| 1518 return %SetNewFunctionAttributes(f); | 1524 return %SetNewFunctionAttributes(f); |
| 1519 } | 1525 } |
| 1520 | 1526 |
| 1521 %SetCode($Function, NewFunction); | 1527 %SetCode($Function, NewFunction); |
| 1522 | 1528 |
| 1523 // ---------------------------------------------------------------------------- | 1529 // ---------------------------------------------------------------------------- |
| 1524 | 1530 |
| 1525 function SetupFunction() { | 1531 function SetupFunction() { |
| 1532 %AssertIsBootstrapping(); | |
|
Erik Corry
2011/08/31 05:46:04
SetUpFunction
| |
| 1526 InstallFunctions($Function.prototype, DONT_ENUM, $Array( | 1533 InstallFunctions($Function.prototype, DONT_ENUM, $Array( |
| 1527 "bind", FunctionBind, | 1534 "bind", FunctionBind, |
| 1528 "toString", FunctionToString | 1535 "toString", FunctionToString |
| 1529 )); | 1536 )); |
| 1530 } | 1537 } |
| 1531 | 1538 |
| 1532 SetupFunction(); | 1539 SetupFunction(); |
| OLD | NEW |