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 23 matching lines...) Expand all Loading... |
34 // const $Function = global.Function; | 34 // const $Function = global.Function; |
35 // const $Array = global.Array; | 35 // const $Array = global.Array; |
36 // const $NaN = 0/0; | 36 // const $NaN = 0/0; |
37 // | 37 // |
38 // in math.js: | 38 // in math.js: |
39 // const $floor = MathFloor | 39 // const $floor = MathFloor |
40 | 40 |
41 const $isNaN = GlobalIsNaN; | 41 const $isNaN = GlobalIsNaN; |
42 const $isFinite = GlobalIsFinite; | 42 const $isFinite = GlobalIsFinite; |
43 | 43 |
44 | |
45 // ---------------------------------------------------------------------------- | 44 // ---------------------------------------------------------------------------- |
46 | 45 |
47 | 46 |
48 // Helper function used to install functions on objects. | 47 // Helper function used to install functions on objects. |
49 function InstallFunctions(object, attributes, functions) { | 48 function InstallFunctions(object, attributes, functions) { |
50 if (functions.length >= 8) { | 49 if (functions.length >= 8) { |
51 %OptimizeObjectForAddingMultipleProperties(object, functions.length >> 1); | 50 %OptimizeObjectForAddingMultipleProperties(object, functions.length >> 1); |
52 } | 51 } |
53 for (var i = 0; i < functions.length; i += 2) { | 52 for (var i = 0; i < functions.length; i += 2) { |
54 var key = functions[i]; | 53 var key = functions[i]; |
(...skipping 13 matching lines...) Expand all Loading... |
68 %SetNativeFlag(f); | 67 %SetNativeFlag(f); |
69 } | 68 } |
70 %ToFastProperties(object); | 69 %ToFastProperties(object); |
71 } | 70 } |
72 | 71 |
73 // Emulates JSC by installing functions on a hidden prototype that | 72 // Emulates JSC by installing functions on a hidden prototype that |
74 // lies above the current object/prototype. This lets you override | 73 // lies above the current object/prototype. This lets you override |
75 // functions on String.prototype etc. and then restore the old function | 74 // functions on String.prototype etc. and then restore the old function |
76 // with delete. See http://code.google.com/p/chromium/issues/detail?id=1717 | 75 // with delete. See http://code.google.com/p/chromium/issues/detail?id=1717 |
77 function InstallFunctionsOnHiddenPrototype(object, attributes, functions) { | 76 function InstallFunctionsOnHiddenPrototype(object, attributes, functions) { |
78 %CheckIsBootstrapping(); | |
79 var hidden_prototype = new $Object(); | 77 var hidden_prototype = new $Object(); |
80 %SetHiddenPrototype(object, hidden_prototype); | 78 %SetHiddenPrototype(object, hidden_prototype); |
81 InstallFunctions(hidden_prototype, attributes, functions); | 79 InstallFunctions(hidden_prototype, attributes, functions); |
82 } | 80 } |
83 | 81 |
84 | 82 |
85 // Prevents changes to the prototype of a built-infunction. | |
86 // The "prototype" property of the function object is made non-configurable, | |
87 // and the prototype object is made non-extensible. The latter prevents | |
88 // changing the __proto__ property. | |
89 function SetUpLockedPrototype(constructor, fields, methods) { | |
90 %CheckIsBootstrapping(); | |
91 var prototype = constructor.prototype; | |
92 // Install functions first, because this function is used to initialize | |
93 // PropertyDescriptor itself. | |
94 var property_count = (methods.length >> 1) + (fields ? fields.length : 0); | |
95 if (property_count >= 4) { | |
96 %OptimizeObjectForAddingMultipleProperties(prototype, property_count); | |
97 } | |
98 if (fields) { | |
99 for (var i = 0; i < fields.length; i++) { | |
100 %SetProperty(prototype, fields[i], void 0, DONT_ENUM | DONT_DELETE); | |
101 } | |
102 } | |
103 for (var i = 0; i < methods.length; i += 2) { | |
104 var key = methods[i]; | |
105 var f = methods[i + 1]; | |
106 %SetProperty(prototype, key, f, DONT_ENUM | DONT_DELETE | READ_ONLY); | |
107 %SetNativeFlag(f); | |
108 } | |
109 prototype.__proto__ = null; | |
110 %PreventExtensions(prototype); | |
111 %ToFastProperties(prototype); | |
112 | |
113 var desc = GetOwnProperty(constructor, "prototype"); | |
114 desc.setWritable(false); | |
115 desc.setConfigurable(false); | |
116 DefineOwnProperty(constructor, "prototype", desc, false); | |
117 } | |
118 | |
119 | |
120 // ---------------------------------------------------------------------------- | 83 // ---------------------------------------------------------------------------- |
121 | 84 |
122 | 85 |
123 // ECMA 262 - 15.1.4 | 86 // ECMA 262 - 15.1.4 |
124 function GlobalIsNaN(number) { | 87 function GlobalIsNaN(number) { |
125 var n = ToNumber(number); | 88 if (!IS_NUMBER(number)) number = NonNumberToNumber(number); |
126 return NUMBER_IS_NAN(n); | 89 return NUMBER_IS_NAN(number); |
127 } | 90 } |
128 | 91 |
129 | 92 |
130 // ECMA 262 - 15.1.5 | 93 // ECMA 262 - 15.1.5 |
131 function GlobalIsFinite(number) { | 94 function GlobalIsFinite(number) { |
132 if (!IS_NUMBER(number)) number = NonNumberToNumber(number); | 95 if (!IS_NUMBER(number)) number = NonNumberToNumber(number); |
133 | 96 return NUMBER_IS_FINITE(number); |
134 // NaN - NaN == NaN, Infinity - Infinity == NaN, -Infinity - -Infinity == NaN. | |
135 return %_IsSmi(number) || number - number == 0; | |
136 } | 97 } |
137 | 98 |
138 | 99 |
139 // ECMA-262 - 15.1.2.2 | 100 // ECMA-262 - 15.1.2.2 |
140 function GlobalParseInt(string, radix) { | 101 function GlobalParseInt(string, radix) { |
141 if (IS_UNDEFINED(radix) || radix === 10 || radix === 0) { | 102 if (IS_UNDEFINED(radix) || radix === 10 || radix === 0) { |
142 // Some people use parseInt instead of Math.floor. This | 103 // Some people use parseInt instead of Math.floor. This |
143 // optimization makes parseInt on a Smi 12 times faster (60ns | 104 // optimization makes parseInt on a Smi 12 times faster (60ns |
144 // vs 800ns). The following optimization makes parseInt on a | 105 // vs 800ns). The following optimization makes parseInt on a |
145 // non-Smi number 9 times faster (230ns vs 2070ns). Together | 106 // non-Smi number 9 times faster (230ns vs 2070ns). Together |
146 // they make parseInt on a string 1.4% slower (274ns vs 270ns). | 107 // they make parseInt on a string 1.4% slower (274ns vs 270ns). |
147 if (%_IsSmi(string)) return string; | 108 if (%_IsSmi(string)) return string; |
148 if (IS_NUMBER(string) && | 109 if (IS_NUMBER(string) && |
149 ((0.01 < string && string < 1e9) || | 110 ((0.01 < string && string < 1e9) || |
150 (-1e9 < string && string < -0.01))) { | 111 (-1e9 < string && string < -0.01))) { |
151 // Truncate number. | 112 // Truncate number. |
152 return string | 0; | 113 return string | 0; |
153 } | 114 } |
154 string = TO_STRING_INLINE(string); | |
155 radix = radix | 0; | 115 radix = radix | 0; |
156 } else { | 116 } else { |
157 // The spec says ToString should be evaluated before ToInt32. | |
158 string = TO_STRING_INLINE(string); | |
159 radix = TO_INT32(radix); | 117 radix = TO_INT32(radix); |
160 if (!(radix == 0 || (2 <= radix && radix <= 36))) | 118 if (!(radix == 0 || (2 <= radix && radix <= 36))) |
161 return $NaN; | 119 return $NaN; |
162 } | 120 } |
163 | 121 string = TO_STRING_INLINE(string); |
164 if (%_HasCachedArrayIndex(string) && | 122 if (%_HasCachedArrayIndex(string) && |
165 (radix == 0 || radix == 10)) { | 123 (radix == 0 || radix == 10)) { |
166 return %_GetCachedArrayIndex(string); | 124 return %_GetCachedArrayIndex(string); |
167 } | 125 } |
168 return %StringParseInt(string, radix); | 126 return %StringParseInt(string, radix); |
169 } | 127 } |
170 | 128 |
171 | 129 |
172 // ECMA-262 - 15.1.2.3 | 130 // ECMA-262 - 15.1.2.3 |
173 function GlobalParseFloat(string) { | 131 function GlobalParseFloat(string) { |
(...skipping 26 matching lines...) Expand all Loading... |
200 | 158 |
201 var f = %CompileString(x); | 159 var f = %CompileString(x); |
202 if (!IS_FUNCTION(f)) return f; | 160 if (!IS_FUNCTION(f)) return f; |
203 | 161 |
204 return %_CallFunction(receiver, f); | 162 return %_CallFunction(receiver, f); |
205 } | 163 } |
206 | 164 |
207 | 165 |
208 // ---------------------------------------------------------------------------- | 166 // ---------------------------------------------------------------------------- |
209 | 167 |
210 // Set up global object. | 168 |
211 function SetUpGlobal() { | 169 function SetupGlobal() { |
212 %CheckIsBootstrapping(); | |
213 // ECMA 262 - 15.1.1.1. | 170 // ECMA 262 - 15.1.1.1. |
214 %SetProperty(global, "NaN", $NaN, DONT_ENUM | DONT_DELETE); | 171 %SetProperty(global, "NaN", $NaN, DONT_ENUM | DONT_DELETE); |
215 | 172 |
216 // ECMA-262 - 15.1.1.2. | 173 // ECMA-262 - 15.1.1.2. |
217 %SetProperty(global, "Infinity", 1/0, DONT_ENUM | DONT_DELETE); | 174 %SetProperty(global, "Infinity", 1/0, DONT_ENUM | DONT_DELETE); |
218 | 175 |
219 // ECMA-262 - 15.1.1.3. | 176 // ECMA-262 - 15.1.1.3. |
220 %SetProperty(global, "undefined", void 0, DONT_ENUM | DONT_DELETE); | 177 %SetProperty(global, "undefined", void 0, DONT_ENUM | DONT_DELETE); |
221 | 178 |
222 // Set up non-enumerable function on the global object. | 179 // Setup non-enumerable function on the global object. |
223 InstallFunctions(global, DONT_ENUM, $Array( | 180 InstallFunctions(global, DONT_ENUM, $Array( |
224 "isNaN", GlobalIsNaN, | 181 "isNaN", GlobalIsNaN, |
225 "isFinite", GlobalIsFinite, | 182 "isFinite", GlobalIsFinite, |
226 "parseInt", GlobalParseInt, | 183 "parseInt", GlobalParseInt, |
227 "parseFloat", GlobalParseFloat, | 184 "parseFloat", GlobalParseFloat, |
228 "eval", GlobalEval | 185 "eval", GlobalEval |
229 )); | 186 )); |
230 } | 187 } |
231 | 188 |
232 SetUpGlobal(); | 189 SetupGlobal(); |
| 190 |
233 | 191 |
234 // ---------------------------------------------------------------------------- | 192 // ---------------------------------------------------------------------------- |
235 // Boolean (first part of definition) | 193 // Boolean (first part of definition) |
236 | 194 |
237 | 195 |
238 %SetCode($Boolean, function(x) { | 196 %SetCode($Boolean, function(x) { |
239 if (%_IsConstructCall()) { | 197 if (%_IsConstructCall()) { |
240 %_SetValueOf(this, ToBoolean(x)); | 198 %_SetValueOf(this, ToBoolean(x)); |
241 } else { | 199 } else { |
242 return ToBoolean(x); | 200 return ToBoolean(x); |
(...skipping 276 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
519 this.enumerable_ = false; | 477 this.enumerable_ = false; |
520 this.hasEnumerable_ = false; | 478 this.hasEnumerable_ = false; |
521 this.configurable_ = false; | 479 this.configurable_ = false; |
522 this.hasConfigurable_ = false; | 480 this.hasConfigurable_ = false; |
523 this.get_ = void 0; | 481 this.get_ = void 0; |
524 this.hasGetter_ = false; | 482 this.hasGetter_ = false; |
525 this.set_ = void 0; | 483 this.set_ = void 0; |
526 this.hasSetter_ = false; | 484 this.hasSetter_ = false; |
527 } | 485 } |
528 | 486 |
529 SetUpLockedPrototype(PropertyDescriptor, $Array( | 487 PropertyDescriptor.prototype.__proto__ = null; |
530 "value_", | 488 |
531 "hasValue_", | 489 PropertyDescriptor.prototype.toString = function() { |
532 "writable_", | 490 return "[object PropertyDescriptor]"; |
533 "hasWritable_", | 491 }; |
534 "enumerable_", | 492 |
535 "hasEnumerable_", | 493 PropertyDescriptor.prototype.setValue = function(value) { |
536 "configurable_", | 494 this.value_ = value; |
537 "hasConfigurable_", | 495 this.hasValue_ = true; |
538 "get_", | 496 } |
539 "hasGetter_", | 497 |
540 "set_", | 498 |
541 "hasSetter_" | 499 PropertyDescriptor.prototype.getValue = function() { |
542 ), $Array( | 500 return this.value_; |
543 "toString", function() { | 501 } |
544 return "[object PropertyDescriptor]"; | 502 |
545 }, | 503 |
546 "setValue", function(value) { | 504 PropertyDescriptor.prototype.hasValue = function() { |
547 this.value_ = value; | 505 return this.hasValue_; |
548 this.hasValue_ = true; | 506 } |
549 }, | 507 |
550 "getValue", function() { | 508 |
551 return this.value_; | 509 PropertyDescriptor.prototype.setEnumerable = function(enumerable) { |
552 }, | 510 this.enumerable_ = enumerable; |
553 "hasValue", function() { | 511 this.hasEnumerable_ = true; |
554 return this.hasValue_; | 512 } |
555 }, | 513 |
556 "setEnumerable", function(enumerable) { | 514 |
557 this.enumerable_ = enumerable; | 515 PropertyDescriptor.prototype.isEnumerable = function () { |
558 this.hasEnumerable_ = true; | 516 return this.enumerable_; |
559 }, | 517 } |
560 "isEnumerable", function () { | 518 |
561 return this.enumerable_; | 519 |
562 }, | 520 PropertyDescriptor.prototype.hasEnumerable = function() { |
563 "hasEnumerable", function() { | 521 return this.hasEnumerable_; |
564 return this.hasEnumerable_; | 522 } |
565 }, | 523 |
566 "setWritable", function(writable) { | 524 |
567 this.writable_ = writable; | 525 PropertyDescriptor.prototype.setWritable = function(writable) { |
568 this.hasWritable_ = true; | 526 this.writable_ = writable; |
569 }, | 527 this.hasWritable_ = true; |
570 "isWritable", function() { | 528 } |
571 return this.writable_; | 529 |
572 }, | 530 |
573 "hasWritable", function() { | 531 PropertyDescriptor.prototype.isWritable = function() { |
574 return this.hasWritable_; | 532 return this.writable_; |
575 }, | 533 } |
576 "setConfigurable", function(configurable) { | 534 |
577 this.configurable_ = configurable; | 535 |
578 this.hasConfigurable_ = true; | 536 PropertyDescriptor.prototype.hasWritable = function() { |
579 }, | 537 return this.hasWritable_; |
580 "hasConfigurable", function() { | 538 } |
581 return this.hasConfigurable_; | 539 |
582 }, | 540 |
583 "isConfigurable", function() { | 541 PropertyDescriptor.prototype.setConfigurable = function(configurable) { |
584 return this.configurable_; | 542 this.configurable_ = configurable; |
585 }, | 543 this.hasConfigurable_ = true; |
586 "setGet", function(get) { | 544 } |
587 this.get_ = get; | 545 |
588 this.hasGetter_ = true; | 546 |
589 }, | 547 PropertyDescriptor.prototype.hasConfigurable = function() { |
590 "getGet", function() { | 548 return this.hasConfigurable_; |
591 return this.get_; | 549 } |
592 }, | 550 |
593 "hasGetter", function() { | 551 |
594 return this.hasGetter_; | 552 PropertyDescriptor.prototype.isConfigurable = function() { |
595 }, | 553 return this.configurable_; |
596 "setSet", function(set) { | 554 } |
597 this.set_ = set; | 555 |
598 this.hasSetter_ = true; | 556 |
599 }, | 557 PropertyDescriptor.prototype.setGet = function(get) { |
600 "getSet", function() { | 558 this.get_ = get; |
601 return this.set_; | 559 this.hasGetter_ = true; |
602 }, | 560 } |
603 "hasSetter", function() { | 561 |
604 return this.hasSetter_; | 562 |
605 })); | 563 PropertyDescriptor.prototype.getGet = function() { |
| 564 return this.get_; |
| 565 } |
| 566 |
| 567 |
| 568 PropertyDescriptor.prototype.hasGetter = function() { |
| 569 return this.hasGetter_; |
| 570 } |
| 571 |
| 572 |
| 573 PropertyDescriptor.prototype.setSet = function(set) { |
| 574 this.set_ = set; |
| 575 this.hasSetter_ = true; |
| 576 } |
| 577 |
| 578 |
| 579 PropertyDescriptor.prototype.getSet = function() { |
| 580 return this.set_; |
| 581 } |
| 582 |
| 583 |
| 584 PropertyDescriptor.prototype.hasSetter = function() { |
| 585 return this.hasSetter_; |
| 586 } |
606 | 587 |
607 | 588 |
608 // Converts an array returned from Runtime_GetOwnProperty to an actual | 589 // Converts an array returned from Runtime_GetOwnProperty to an actual |
609 // property descriptor. For a description of the array layout please | 590 // property descriptor. For a description of the array layout please |
610 // see the runtime.cc file. | 591 // see the runtime.cc file. |
611 function ConvertDescriptorArrayToDescriptor(desc_array) { | 592 function ConvertDescriptorArrayToDescriptor(desc_array) { |
612 if (desc_array === false) { | 593 if (desc_array === false) { |
613 throw 'Internal error: invalid desc_array'; | 594 throw 'Internal error: invalid desc_array'; |
614 } | 595 } |
615 | 596 |
(...skipping 567 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1183 return ToObject(x); | 1164 return ToObject(x); |
1184 } else { | 1165 } else { |
1185 if (x == null) return { }; | 1166 if (x == null) return { }; |
1186 return ToObject(x); | 1167 return ToObject(x); |
1187 } | 1168 } |
1188 }); | 1169 }); |
1189 | 1170 |
1190 %SetExpectedNumberOfProperties($Object, 4); | 1171 %SetExpectedNumberOfProperties($Object, 4); |
1191 | 1172 |
1192 // ---------------------------------------------------------------------------- | 1173 // ---------------------------------------------------------------------------- |
1193 // Object | |
1194 | 1174 |
1195 function SetUpObject() { | 1175 |
1196 %CheckIsBootstrapping(); | 1176 function SetupObject() { |
1197 // Set Up non-enumerable functions on the Object.prototype object. | 1177 // Setup non-enumerable functions on the Object.prototype object. |
1198 InstallFunctions($Object.prototype, DONT_ENUM, $Array( | 1178 InstallFunctions($Object.prototype, DONT_ENUM, $Array( |
1199 "toString", ObjectToString, | 1179 "toString", ObjectToString, |
1200 "toLocaleString", ObjectToLocaleString, | 1180 "toLocaleString", ObjectToLocaleString, |
1201 "valueOf", ObjectValueOf, | 1181 "valueOf", ObjectValueOf, |
1202 "hasOwnProperty", ObjectHasOwnProperty, | 1182 "hasOwnProperty", ObjectHasOwnProperty, |
1203 "isPrototypeOf", ObjectIsPrototypeOf, | 1183 "isPrototypeOf", ObjectIsPrototypeOf, |
1204 "propertyIsEnumerable", ObjectPropertyIsEnumerable, | 1184 "propertyIsEnumerable", ObjectPropertyIsEnumerable, |
1205 "__defineGetter__", ObjectDefineGetter, | 1185 "__defineGetter__", ObjectDefineGetter, |
1206 "__lookupGetter__", ObjectLookupGetter, | 1186 "__lookupGetter__", ObjectLookupGetter, |
1207 "__defineSetter__", ObjectDefineSetter, | 1187 "__defineSetter__", ObjectDefineSetter, |
1208 "__lookupSetter__", ObjectLookupSetter | 1188 "__lookupSetter__", ObjectLookupSetter |
1209 )); | 1189 )); |
1210 InstallFunctions($Object, DONT_ENUM, $Array( | 1190 InstallFunctions($Object, DONT_ENUM, $Array( |
1211 "keys", ObjectKeys, | 1191 "keys", ObjectKeys, |
1212 "create", ObjectCreate, | 1192 "create", ObjectCreate, |
1213 "defineProperty", ObjectDefineProperty, | 1193 "defineProperty", ObjectDefineProperty, |
1214 "defineProperties", ObjectDefineProperties, | 1194 "defineProperties", ObjectDefineProperties, |
1215 "freeze", ObjectFreeze, | 1195 "freeze", ObjectFreeze, |
1216 "getPrototypeOf", ObjectGetPrototypeOf, | 1196 "getPrototypeOf", ObjectGetPrototypeOf, |
1217 "getOwnPropertyDescriptor", ObjectGetOwnPropertyDescriptor, | 1197 "getOwnPropertyDescriptor", ObjectGetOwnPropertyDescriptor, |
1218 "getOwnPropertyNames", ObjectGetOwnPropertyNames, | 1198 "getOwnPropertyNames", ObjectGetOwnPropertyNames, |
1219 "isExtensible", ObjectIsExtensible, | 1199 "isExtensible", ObjectIsExtensible, |
1220 "isFrozen", ObjectIsFrozen, | 1200 "isFrozen", ObjectIsFrozen, |
1221 "isSealed", ObjectIsSealed, | 1201 "isSealed", ObjectIsSealed, |
1222 "preventExtensions", ObjectPreventExtension, | 1202 "preventExtensions", ObjectPreventExtension, |
1223 "seal", ObjectSeal | 1203 "seal", ObjectSeal |
1224 )); | 1204 )); |
1225 } | 1205 } |
1226 | 1206 |
1227 SetUpObject(); | 1207 SetupObject(); |
| 1208 |
1228 | 1209 |
1229 // ---------------------------------------------------------------------------- | 1210 // ---------------------------------------------------------------------------- |
1230 // Boolean | 1211 // Boolean |
1231 | 1212 |
1232 function BooleanToString() { | 1213 function BooleanToString() { |
1233 // NOTE: Both Boolean objects and values can enter here as | 1214 // NOTE: Both Boolean objects and values can enter here as |
1234 // 'this'. This is not as dictated by ECMA-262. | 1215 // 'this'. This is not as dictated by ECMA-262. |
1235 var b = this; | 1216 var b = this; |
1236 if (!IS_BOOLEAN(b)) { | 1217 if (!IS_BOOLEAN(b)) { |
1237 if (!IS_BOOLEAN_WRAPPER(b)) { | 1218 if (!IS_BOOLEAN_WRAPPER(b)) { |
(...skipping 10 matching lines...) Expand all Loading... |
1248 // 'this'. This is not as dictated by ECMA-262. | 1229 // 'this'. This is not as dictated by ECMA-262. |
1249 if (!IS_BOOLEAN(this) && !IS_BOOLEAN_WRAPPER(this)) | 1230 if (!IS_BOOLEAN(this) && !IS_BOOLEAN_WRAPPER(this)) |
1250 throw new $TypeError('Boolean.prototype.valueOf is not generic'); | 1231 throw new $TypeError('Boolean.prototype.valueOf is not generic'); |
1251 return %_ValueOf(this); | 1232 return %_ValueOf(this); |
1252 } | 1233 } |
1253 | 1234 |
1254 | 1235 |
1255 // ---------------------------------------------------------------------------- | 1236 // ---------------------------------------------------------------------------- |
1256 | 1237 |
1257 | 1238 |
1258 function SetUpBoolean () { | 1239 function SetupBoolean() { |
1259 %CheckIsBootstrapping(); | |
1260 InstallFunctions($Boolean.prototype, DONT_ENUM, $Array( | 1240 InstallFunctions($Boolean.prototype, DONT_ENUM, $Array( |
1261 "toString", BooleanToString, | 1241 "toString", BooleanToString, |
1262 "valueOf", BooleanValueOf | 1242 "valueOf", BooleanValueOf |
1263 )); | 1243 )); |
1264 } | 1244 } |
1265 | 1245 |
1266 SetUpBoolean(); | 1246 SetupBoolean(); |
1267 | |
1268 | 1247 |
1269 // ---------------------------------------------------------------------------- | 1248 // ---------------------------------------------------------------------------- |
1270 // Number | 1249 // Number |
1271 | 1250 |
1272 // Set the Number function and constructor. | 1251 // Set the Number function and constructor. |
1273 %SetCode($Number, function(x) { | 1252 %SetCode($Number, function(x) { |
1274 var value = %_ArgumentsLength() == 0 ? 0 : ToNumber(x); | 1253 var value = %_ArgumentsLength() == 0 ? 0 : ToNumber(x); |
1275 if (%_IsConstructCall()) { | 1254 if (%_IsConstructCall()) { |
1276 %_SetValueOf(this, value); | 1255 %_SetValueOf(this, value); |
1277 } else { | 1256 } else { |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1371 if (p < 1 || p > 21) { | 1350 if (p < 1 || p > 21) { |
1372 throw new $RangeError("toPrecision() argument must be between 1 and 21"); | 1351 throw new $RangeError("toPrecision() argument must be between 1 and 21"); |
1373 } | 1352 } |
1374 var x = ToNumber(this); | 1353 var x = ToNumber(this); |
1375 return %NumberToPrecision(x, p); | 1354 return %NumberToPrecision(x, p); |
1376 } | 1355 } |
1377 | 1356 |
1378 | 1357 |
1379 // ---------------------------------------------------------------------------- | 1358 // ---------------------------------------------------------------------------- |
1380 | 1359 |
1381 function SetUpNumber() { | 1360 function SetupNumber() { |
1382 %CheckIsBootstrapping(); | |
1383 %OptimizeObjectForAddingMultipleProperties($Number.prototype, 8); | 1361 %OptimizeObjectForAddingMultipleProperties($Number.prototype, 8); |
1384 // Set up the constructor property on the Number prototype object. | 1362 // Setup the constructor property on the Number prototype object. |
1385 %SetProperty($Number.prototype, "constructor", $Number, DONT_ENUM); | 1363 %SetProperty($Number.prototype, "constructor", $Number, DONT_ENUM); |
1386 | 1364 |
1387 %OptimizeObjectForAddingMultipleProperties($Number, 5); | 1365 %OptimizeObjectForAddingMultipleProperties($Number, 5); |
1388 // ECMA-262 section 15.7.3.1. | 1366 // ECMA-262 section 15.7.3.1. |
1389 %SetProperty($Number, | 1367 %SetProperty($Number, |
1390 "MAX_VALUE", | 1368 "MAX_VALUE", |
1391 1.7976931348623157e+308, | 1369 1.7976931348623157e+308, |
1392 DONT_ENUM | DONT_DELETE | READ_ONLY); | 1370 DONT_ENUM | DONT_DELETE | READ_ONLY); |
1393 | 1371 |
1394 // ECMA-262 section 15.7.3.2. | 1372 // ECMA-262 section 15.7.3.2. |
1395 %SetProperty($Number, "MIN_VALUE", 5e-324, DONT_ENUM | DONT_DELETE | READ_ONLY
); | 1373 %SetProperty($Number, "MIN_VALUE", 5e-324, DONT_ENUM | DONT_DELETE | READ_ONLY
); |
1396 | 1374 |
1397 // ECMA-262 section 15.7.3.3. | 1375 // ECMA-262 section 15.7.3.3. |
1398 %SetProperty($Number, "NaN", $NaN, DONT_ENUM | DONT_DELETE | READ_ONLY); | 1376 %SetProperty($Number, "NaN", $NaN, DONT_ENUM | DONT_DELETE | READ_ONLY); |
1399 | 1377 |
1400 // ECMA-262 section 15.7.3.4. | 1378 // ECMA-262 section 15.7.3.4. |
1401 %SetProperty($Number, | 1379 %SetProperty($Number, |
1402 "NEGATIVE_INFINITY", | 1380 "NEGATIVE_INFINITY", |
1403 -1/0, | 1381 -1/0, |
1404 DONT_ENUM | DONT_DELETE | READ_ONLY); | 1382 DONT_ENUM | DONT_DELETE | READ_ONLY); |
1405 | 1383 |
1406 // ECMA-262 section 15.7.3.5. | 1384 // ECMA-262 section 15.7.3.5. |
1407 %SetProperty($Number, | 1385 %SetProperty($Number, |
1408 "POSITIVE_INFINITY", | 1386 "POSITIVE_INFINITY", |
1409 1/0, | 1387 1/0, |
1410 DONT_ENUM | DONT_DELETE | READ_ONLY); | 1388 DONT_ENUM | DONT_DELETE | READ_ONLY); |
1411 %ToFastProperties($Number); | 1389 %ToFastProperties($Number); |
1412 | 1390 |
1413 // Set up non-enumerable functions on the Number prototype object. | 1391 // Setup non-enumerable functions on the Number prototype object. |
1414 InstallFunctions($Number.prototype, DONT_ENUM, $Array( | 1392 InstallFunctions($Number.prototype, DONT_ENUM, $Array( |
1415 "toString", NumberToString, | 1393 "toString", NumberToString, |
1416 "toLocaleString", NumberToLocaleString, | 1394 "toLocaleString", NumberToLocaleString, |
1417 "valueOf", NumberValueOf, | 1395 "valueOf", NumberValueOf, |
1418 "toFixed", NumberToFixed, | 1396 "toFixed", NumberToFixed, |
1419 "toExponential", NumberToExponential, | 1397 "toExponential", NumberToExponential, |
1420 "toPrecision", NumberToPrecision | 1398 "toPrecision", NumberToPrecision |
1421 )); | 1399 )); |
1422 } | 1400 } |
1423 | 1401 |
1424 SetUpNumber(); | 1402 SetupNumber(); |
1425 | 1403 |
1426 | 1404 |
1427 // ---------------------------------------------------------------------------- | 1405 // ---------------------------------------------------------------------------- |
1428 // Function | 1406 // Function |
1429 | 1407 |
1430 $Function.prototype.constructor = $Function; | 1408 $Function.prototype.constructor = $Function; |
1431 | 1409 |
1432 function FunctionSourceString(func) { | 1410 function FunctionSourceString(func) { |
1433 if (!IS_FUNCTION(func)) { | 1411 if (!IS_FUNCTION(func)) { |
1434 throw new $TypeError('Function.prototype.toString is not generic'); | 1412 throw new $TypeError('Function.prototype.toString is not generic'); |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1543 // property of the resulting function is enumerable (ECMA262, 15.3.5.2). | 1521 // property of the resulting function is enumerable (ECMA262, 15.3.5.2). |
1544 var f = %CompileString(source)(); | 1522 var f = %CompileString(source)(); |
1545 %FunctionMarkNameShouldPrintAsAnonymous(f); | 1523 %FunctionMarkNameShouldPrintAsAnonymous(f); |
1546 return %SetNewFunctionAttributes(f); | 1524 return %SetNewFunctionAttributes(f); |
1547 } | 1525 } |
1548 | 1526 |
1549 %SetCode($Function, NewFunction); | 1527 %SetCode($Function, NewFunction); |
1550 | 1528 |
1551 // ---------------------------------------------------------------------------- | 1529 // ---------------------------------------------------------------------------- |
1552 | 1530 |
1553 function SetUpFunction() { | 1531 function SetupFunction() { |
1554 %CheckIsBootstrapping(); | |
1555 InstallFunctions($Function.prototype, DONT_ENUM, $Array( | 1532 InstallFunctions($Function.prototype, DONT_ENUM, $Array( |
1556 "bind", FunctionBind, | 1533 "bind", FunctionBind, |
1557 "toString", FunctionToString | 1534 "toString", FunctionToString |
1558 )); | 1535 )); |
1559 } | 1536 } |
1560 | 1537 |
1561 SetUpFunction(); | 1538 SetupFunction(); |
OLD | NEW |