OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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 #include "src/bootstrapper.h" | 5 #include "src/bootstrapper.h" |
6 | 6 |
7 #include "src/accessors.h" | 7 #include "src/accessors.h" |
8 #include "src/api-natives.h" | 8 #include "src/api-natives.h" |
9 #include "src/code-stubs.h" | 9 #include "src/code-stubs.h" |
10 #include "src/extensions/externalize-string-extension.h" | 10 #include "src/extensions/externalize-string-extension.h" |
(...skipping 1228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1239 isolate->initial_object_prototype(), Builtins::kSymbolConstructor); | 1239 isolate->initial_object_prototype(), Builtins::kSymbolConstructor); |
1240 symbol_fun->shared()->set_construct_stub( | 1240 symbol_fun->shared()->set_construct_stub( |
1241 *isolate->builtins()->SymbolConstructor_ConstructStub()); | 1241 *isolate->builtins()->SymbolConstructor_ConstructStub()); |
1242 symbol_fun->shared()->set_length(1); | 1242 symbol_fun->shared()->set_length(1); |
1243 symbol_fun->shared()->DontAdaptArguments(); | 1243 symbol_fun->shared()->DontAdaptArguments(); |
1244 native_context()->set_symbol_function(*symbol_fun); | 1244 native_context()->set_symbol_function(*symbol_fun); |
1245 } | 1245 } |
1246 | 1246 |
1247 { // --- D a t e --- | 1247 { // --- D a t e --- |
1248 // Builtin functions for Date.prototype. | 1248 // Builtin functions for Date.prototype. |
1249 Handle<JSFunction> date_fun = InstallFunction( | 1249 Handle<JSObject> prototype = |
1250 global, "Date", JS_DATE_TYPE, JSDate::kSize, | 1250 factory->NewJSObject(isolate->object_function(), TENURED); |
1251 isolate->initial_object_prototype(), Builtins::kDateConstructor); | 1251 Handle<JSFunction> date_fun = |
| 1252 InstallFunction(global, "Date", JS_DATE_TYPE, JSDate::kSize, prototype, |
| 1253 Builtins::kDateConstructor); |
1252 InstallWithIntrinsicDefaultProto(isolate, date_fun, | 1254 InstallWithIntrinsicDefaultProto(isolate, date_fun, |
1253 Context::DATE_FUNCTION_INDEX); | 1255 Context::DATE_FUNCTION_INDEX); |
1254 date_fun->shared()->set_construct_stub( | 1256 date_fun->shared()->set_construct_stub( |
1255 *isolate->builtins()->DateConstructor_ConstructStub()); | 1257 *isolate->builtins()->DateConstructor_ConstructStub()); |
1256 date_fun->shared()->set_length(7); | 1258 date_fun->shared()->set_length(7); |
1257 date_fun->shared()->DontAdaptArguments(); | 1259 date_fun->shared()->DontAdaptArguments(); |
| 1260 |
| 1261 // Install the Date.now, Date.parse and Date.UTC functions. |
| 1262 SimpleInstallFunction(date_fun, "now", Builtins::kDateNow, 0, false); |
| 1263 SimpleInstallFunction(date_fun, "parse", Builtins::kDateParse, 1, false); |
| 1264 SimpleInstallFunction(date_fun, "UTC", Builtins::kDateUTC, 7, false); |
| 1265 |
| 1266 // Install the "constructor" property on the {prototype}. |
| 1267 JSObject::AddProperty(prototype, factory->constructor_string(), date_fun, |
| 1268 DONT_ENUM); |
| 1269 |
| 1270 // Install the Date.prototype methods. |
| 1271 SimpleInstallFunction(prototype, "toString", |
| 1272 Builtins::kDatePrototypeToString, 0, false); |
| 1273 SimpleInstallFunction(prototype, "toDateString", |
| 1274 Builtins::kDatePrototypeToDateString, 0, false); |
| 1275 SimpleInstallFunction(prototype, "toTimeString", |
| 1276 Builtins::kDatePrototypeToTimeString, 0, false); |
| 1277 SimpleInstallFunction(prototype, "toGMTString", |
| 1278 Builtins::kDatePrototypeToUTCString, 0, false); |
| 1279 SimpleInstallFunction(prototype, "toISOString", |
| 1280 Builtins::kDatePrototypeToISOString, 0, false); |
| 1281 SimpleInstallFunction(prototype, "toUTCString", |
| 1282 Builtins::kDatePrototypeToUTCString, 0, false); |
| 1283 SimpleInstallFunction(prototype, "getDate", Builtins::kDatePrototypeGetDate, |
| 1284 0, true); |
| 1285 SimpleInstallFunction(prototype, "setDate", Builtins::kDatePrototypeSetDate, |
| 1286 1, false); |
| 1287 SimpleInstallFunction(prototype, "getDay", Builtins::kDatePrototypeGetDay, |
| 1288 0, true); |
| 1289 SimpleInstallFunction(prototype, "getFullYear", |
| 1290 Builtins::kDatePrototypeGetFullYear, 0, true); |
| 1291 SimpleInstallFunction(prototype, "setFullYear", |
| 1292 Builtins::kDatePrototypeSetFullYear, 3, false); |
| 1293 SimpleInstallFunction(prototype, "getHours", |
| 1294 Builtins::kDatePrototypeGetHours, 0, true); |
| 1295 SimpleInstallFunction(prototype, "setHours", |
| 1296 Builtins::kDatePrototypeSetHours, 4, false); |
| 1297 SimpleInstallFunction(prototype, "getMilliseconds", |
| 1298 Builtins::kDatePrototypeGetMilliseconds, 0, true); |
| 1299 SimpleInstallFunction(prototype, "setMilliseconds", |
| 1300 Builtins::kDatePrototypeSetMilliseconds, 1, false); |
| 1301 SimpleInstallFunction(prototype, "getMinutes", |
| 1302 Builtins::kDatePrototypeGetMinutes, 0, true); |
| 1303 SimpleInstallFunction(prototype, "setMinutes", |
| 1304 Builtins::kDatePrototypeSetMinutes, 3, false); |
| 1305 SimpleInstallFunction(prototype, "getMonth", |
| 1306 Builtins::kDatePrototypeGetMonth, 0, true); |
| 1307 SimpleInstallFunction(prototype, "setMonth", |
| 1308 Builtins::kDatePrototypeSetMonth, 2, false); |
| 1309 SimpleInstallFunction(prototype, "getSeconds", |
| 1310 Builtins::kDatePrototypeGetSeconds, 0, true); |
| 1311 SimpleInstallFunction(prototype, "setSeconds", |
| 1312 Builtins::kDatePrototypeSetSeconds, 2, false); |
| 1313 SimpleInstallFunction(prototype, "getTime", Builtins::kDatePrototypeGetTime, |
| 1314 0, true); |
| 1315 SimpleInstallFunction(prototype, "setTime", Builtins::kDatePrototypeSetTime, |
| 1316 1, false); |
| 1317 SimpleInstallFunction(prototype, "getTimezoneOffset", |
| 1318 Builtins::kDatePrototypeGetTimezoneOffset, 0, true); |
| 1319 SimpleInstallFunction(prototype, "getUTCDate", |
| 1320 Builtins::kDatePrototypeGetUTCDate, 0, true); |
| 1321 SimpleInstallFunction(prototype, "setUTCDate", |
| 1322 Builtins::kDatePrototypeSetUTCDate, 1, false); |
| 1323 SimpleInstallFunction(prototype, "getUTCDay", |
| 1324 Builtins::kDatePrototypeGetUTCDay, 0, true); |
| 1325 SimpleInstallFunction(prototype, "getUTCFullYear", |
| 1326 Builtins::kDatePrototypeGetUTCFullYear, 0, true); |
| 1327 SimpleInstallFunction(prototype, "setUTCFullYear", |
| 1328 Builtins::kDatePrototypeSetUTCFullYear, 3, false); |
| 1329 SimpleInstallFunction(prototype, "getUTCHours", |
| 1330 Builtins::kDatePrototypeGetUTCHours, 0, true); |
| 1331 SimpleInstallFunction(prototype, "setUTCHours", |
| 1332 Builtins::kDatePrototypeSetUTCHours, 4, false); |
| 1333 SimpleInstallFunction(prototype, "getUTCMilliseconds", |
| 1334 Builtins::kDatePrototypeGetUTCMilliseconds, 0, true); |
| 1335 SimpleInstallFunction(prototype, "setUTCMilliseconds", |
| 1336 Builtins::kDatePrototypeSetUTCMilliseconds, 1, false); |
| 1337 SimpleInstallFunction(prototype, "getUTCMinutes", |
| 1338 Builtins::kDatePrototypeGetUTCMinutes, 0, true); |
| 1339 SimpleInstallFunction(prototype, "setUTCMinutes", |
| 1340 Builtins::kDatePrototypeSetUTCMinutes, 3, false); |
| 1341 SimpleInstallFunction(prototype, "getUTCMonth", |
| 1342 Builtins::kDatePrototypeGetUTCMonth, 0, true); |
| 1343 SimpleInstallFunction(prototype, "setUTCMonth", |
| 1344 Builtins::kDatePrototypeSetUTCMonth, 2, false); |
| 1345 SimpleInstallFunction(prototype, "getUTCSeconds", |
| 1346 Builtins::kDatePrototypeGetUTCSeconds, 0, true); |
| 1347 SimpleInstallFunction(prototype, "setUTCSeconds", |
| 1348 Builtins::kDatePrototypeSetUTCSeconds, 2, false); |
| 1349 SimpleInstallFunction(prototype, "valueOf", Builtins::kDatePrototypeValueOf, |
| 1350 0, false); |
| 1351 SimpleInstallFunction(prototype, "getYear", Builtins::kDatePrototypeGetYear, |
| 1352 0, true); |
| 1353 SimpleInstallFunction(prototype, "setYear", Builtins::kDatePrototypeSetYear, |
| 1354 1, false); |
| 1355 |
| 1356 // Install i18n fallback functions. |
| 1357 SimpleInstallFunction(prototype, "toLocaleString", |
| 1358 Builtins::kDatePrototypeToString, 0, false); |
| 1359 SimpleInstallFunction(prototype, "toLocaleDateString", |
| 1360 Builtins::kDatePrototypeToDateString, 0, false); |
| 1361 SimpleInstallFunction(prototype, "toLocaleTimeString", |
| 1362 Builtins::kDatePrototypeToTimeString, 0, false); |
| 1363 |
| 1364 // Install the @@toPrimitive function. |
| 1365 Handle<JSFunction> to_primitive = InstallFunction( |
| 1366 prototype, factory->to_primitive_symbol(), JS_OBJECT_TYPE, |
| 1367 JSObject::kHeaderSize, MaybeHandle<JSObject>(), |
| 1368 Builtins::kDatePrototypeToPrimitive, |
| 1369 static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY)); |
| 1370 |
| 1371 // Set the expected parameters for @@toPrimitive to 1; required by builtin. |
| 1372 to_primitive->shared()->set_internal_formal_parameter_count(1); |
| 1373 |
| 1374 // Set the length for the function to satisfy ECMA-262. |
| 1375 to_primitive->shared()->set_length(1); |
1258 } | 1376 } |
1259 | 1377 |
1260 { // -- R e g E x p | 1378 { // -- R e g E x p |
1261 // Builtin functions for RegExp.prototype. | 1379 // Builtin functions for RegExp.prototype. |
1262 Handle<JSFunction> regexp_fun = | 1380 Handle<JSFunction> regexp_fun = |
1263 InstallFunction(global, "RegExp", JS_REGEXP_TYPE, JSRegExp::kSize, | 1381 InstallFunction(global, "RegExp", JS_REGEXP_TYPE, JSRegExp::kSize, |
1264 isolate->initial_object_prototype(), | 1382 isolate->initial_object_prototype(), |
1265 Builtins::kIllegal); | 1383 Builtins::kIllegal); |
1266 InstallWithIntrinsicDefaultProto(isolate, regexp_fun, | 1384 InstallWithIntrinsicDefaultProto(isolate, regexp_fun, |
1267 Context::REGEXP_FUNCTION_INDEX); | 1385 Context::REGEXP_FUNCTION_INDEX); |
(...skipping 352 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1620 } | 1738 } |
1621 | 1739 |
1622 { | 1740 { |
1623 // Set up the call-as-constructor delegate. | 1741 // Set up the call-as-constructor delegate. |
1624 Handle<Code> code = isolate->builtins()->HandleApiCallAsConstructor(); | 1742 Handle<Code> code = isolate->builtins()->HandleApiCallAsConstructor(); |
1625 Handle<JSFunction> delegate = factory->NewFunction( | 1743 Handle<JSFunction> delegate = factory->NewFunction( |
1626 factory->empty_string(), code, JS_OBJECT_TYPE, JSObject::kHeaderSize); | 1744 factory->empty_string(), code, JS_OBJECT_TYPE, JSObject::kHeaderSize); |
1627 native_context()->set_call_as_constructor_delegate(*delegate); | 1745 native_context()->set_call_as_constructor_delegate(*delegate); |
1628 delegate->shared()->DontAdaptArguments(); | 1746 delegate->shared()->DontAdaptArguments(); |
1629 } | 1747 } |
1630 } | 1748 } // NOLINT(readability/fn_size) |
1631 | 1749 |
1632 | 1750 |
1633 void Genesis::InstallTypedArray(const char* name, ElementsKind elements_kind, | 1751 void Genesis::InstallTypedArray(const char* name, ElementsKind elements_kind, |
1634 Handle<JSFunction>* fun) { | 1752 Handle<JSFunction>* fun) { |
1635 Handle<JSObject> global = Handle<JSObject>(native_context()->global_object()); | 1753 Handle<JSObject> global = Handle<JSObject>(native_context()->global_object()); |
1636 Handle<JSFunction> result = InstallFunction( | 1754 Handle<JSFunction> result = InstallFunction( |
1637 global, name, JS_TYPED_ARRAY_TYPE, JSTypedArray::kSize, | 1755 global, name, JS_TYPED_ARRAY_TYPE, JSTypedArray::kSize, |
1638 isolate()->initial_object_prototype(), Builtins::kIllegal); | 1756 isolate()->initial_object_prototype(), Builtins::kIllegal); |
1639 | 1757 |
1640 Handle<Map> initial_map = isolate()->factory()->NewMap( | 1758 Handle<Map> initial_map = isolate()->factory()->NewMap( |
(...skipping 883 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2524 HeapObject::cast(string_function->initial_map()->prototype())->map()); | 2642 HeapObject::cast(string_function->initial_map()->prototype())->map()); |
2525 | 2643 |
2526 // Install Global.eval. | 2644 // Install Global.eval. |
2527 { | 2645 { |
2528 Handle<JSFunction> eval = SimpleInstallFunction( | 2646 Handle<JSFunction> eval = SimpleInstallFunction( |
2529 handle(native_context()->global_object()), factory()->eval_string(), | 2647 handle(native_context()->global_object()), factory()->eval_string(), |
2530 Builtins::kGlobalEval, 1, false); | 2648 Builtins::kGlobalEval, 1, false); |
2531 native_context()->set_global_eval_fun(*eval); | 2649 native_context()->set_global_eval_fun(*eval); |
2532 } | 2650 } |
2533 | 2651 |
2534 // Setup the Date constructor. | |
2535 { | |
2536 Handle<String> key = factory()->Date_string(); | |
2537 Handle<JSFunction> date_fun = Handle<JSFunction>::cast( | |
2538 Object::GetProperty(handle(native_context()->global_object()), key) | |
2539 .ToHandleChecked()); | |
2540 Handle<JSObject> prototype = | |
2541 Handle<JSObject>(JSObject::cast(date_fun->instance_prototype())); | |
2542 | |
2543 // Install the Date.now, Date.parse and Date.UTC functions. | |
2544 SimpleInstallFunction(date_fun, "now", Builtins::kDateNow, 0, false); | |
2545 SimpleInstallFunction(date_fun, "parse", Builtins::kDateParse, 1, false); | |
2546 SimpleInstallFunction(date_fun, "UTC", Builtins::kDateUTC, 7, false); | |
2547 | |
2548 // Install the "constructor" property on the {prototype}. | |
2549 JSObject::AddProperty(prototype, factory()->constructor_string(), date_fun, | |
2550 DONT_ENUM); | |
2551 | |
2552 // Install the toISOString and valueOf functions. | |
2553 SimpleInstallFunction(prototype, "toISOString", | |
2554 Builtins::kDatePrototypeToISOString, 0, false); | |
2555 SimpleInstallFunction(prototype, "getDate", Builtins::kDatePrototypeGetDate, | |
2556 0, true); | |
2557 SimpleInstallFunction(prototype, "getDay", Builtins::kDatePrototypeGetDay, | |
2558 0, true); | |
2559 SimpleInstallFunction(prototype, "getFullYear", | |
2560 Builtins::kDatePrototypeGetFullYear, 0, true); | |
2561 SimpleInstallFunction(prototype, "getHours", | |
2562 Builtins::kDatePrototypeGetHours, 0, true); | |
2563 SimpleInstallFunction(prototype, "getMilliseconds", | |
2564 Builtins::kDatePrototypeGetMilliseconds, 0, true); | |
2565 SimpleInstallFunction(prototype, "getMinutes", | |
2566 Builtins::kDatePrototypeGetMinutes, 0, true); | |
2567 SimpleInstallFunction(prototype, "getMonth", | |
2568 Builtins::kDatePrototypeGetMonth, 0, true); | |
2569 SimpleInstallFunction(prototype, "getSeconds", | |
2570 Builtins::kDatePrototypeGetSeconds, 0, true); | |
2571 SimpleInstallFunction(prototype, "getTime", Builtins::kDatePrototypeGetTime, | |
2572 0, true); | |
2573 SimpleInstallFunction(prototype, "getTimezoneOffset", | |
2574 Builtins::kDatePrototypeGetTimezoneOffset, 0, true); | |
2575 SimpleInstallFunction(prototype, "getUTCDate", | |
2576 Builtins::kDatePrototypeGetUTCDate, 0, true); | |
2577 SimpleInstallFunction(prototype, "getUTCDay", | |
2578 Builtins::kDatePrototypeGetUTCDay, 0, true); | |
2579 SimpleInstallFunction(prototype, "getUTCFullYear", | |
2580 Builtins::kDatePrototypeGetUTCFullYear, 0, true); | |
2581 SimpleInstallFunction(prototype, "getUTCHours", | |
2582 Builtins::kDatePrototypeGetUTCHours, 0, true); | |
2583 SimpleInstallFunction(prototype, "getUTCMilliseconds", | |
2584 Builtins::kDatePrototypeGetUTCMilliseconds, 0, true); | |
2585 SimpleInstallFunction(prototype, "getUTCMinutes", | |
2586 Builtins::kDatePrototypeGetUTCMinutes, 0, true); | |
2587 SimpleInstallFunction(prototype, "getUTCMonth", | |
2588 Builtins::kDatePrototypeGetUTCMonth, 0, true); | |
2589 SimpleInstallFunction(prototype, "getUTCSeconds", | |
2590 Builtins::kDatePrototypeGetUTCSeconds, 0, true); | |
2591 SimpleInstallFunction(prototype, "valueOf", Builtins::kDatePrototypeValueOf, | |
2592 0, false); | |
2593 | |
2594 // Install the @@toPrimitive function. | |
2595 Handle<JSFunction> to_primitive = InstallFunction( | |
2596 prototype, factory()->to_primitive_symbol(), JS_OBJECT_TYPE, | |
2597 JSObject::kHeaderSize, MaybeHandle<JSObject>(), | |
2598 Builtins::kDatePrototypeToPrimitive, | |
2599 static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY)); | |
2600 | |
2601 // Set the expected parameters for @@toPrimitive to 1; required by builtin. | |
2602 to_primitive->shared()->set_internal_formal_parameter_count(1); | |
2603 | |
2604 // Set the length for the function to satisfy ECMA-262. | |
2605 to_primitive->shared()->set_length(1); | |
2606 } | |
2607 | |
2608 // Install Array.prototype.concat | 2652 // Install Array.prototype.concat |
2609 { | 2653 { |
2610 Handle<JSFunction> array_constructor(native_context()->array_function()); | 2654 Handle<JSFunction> array_constructor(native_context()->array_function()); |
2611 Handle<JSObject> proto(JSObject::cast(array_constructor->prototype())); | 2655 Handle<JSObject> proto(JSObject::cast(array_constructor->prototype())); |
2612 Handle<JSFunction> concat = | 2656 Handle<JSFunction> concat = |
2613 InstallFunction(proto, "concat", JS_OBJECT_TYPE, JSObject::kHeaderSize, | 2657 InstallFunction(proto, "concat", JS_OBJECT_TYPE, JSObject::kHeaderSize, |
2614 MaybeHandle<JSObject>(), Builtins::kArrayConcat); | 2658 MaybeHandle<JSObject>(), Builtins::kArrayConcat); |
2615 | 2659 |
2616 // Make sure that Array.prototype.concat appears to be compiled. | 2660 // Make sure that Array.prototype.concat appears to be compiled. |
2617 // The code will never be called, but inline caching for call will | 2661 // The code will never be called, but inline caching for call will |
(...skipping 853 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3471 } | 3515 } |
3472 | 3516 |
3473 | 3517 |
3474 // Called when the top-level V8 mutex is destroyed. | 3518 // Called when the top-level V8 mutex is destroyed. |
3475 void Bootstrapper::FreeThreadResources() { | 3519 void Bootstrapper::FreeThreadResources() { |
3476 DCHECK(!IsActive()); | 3520 DCHECK(!IsActive()); |
3477 } | 3521 } |
3478 | 3522 |
3479 } // namespace internal | 3523 } // namespace internal |
3480 } // namespace v8 | 3524 } // namespace v8 |
OLD | NEW |