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

Side by Side Diff: src/bootstrapper.cc

Issue 1542963002: [runtime] Introduce dedicated JSBoundFunction to represent bound functions. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@FunctionConstructor
Patch Set: [arm64] Poke does not preserve flags with --debug-code. Created 4 years, 12 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
« no previous file with comments | « src/bailout-reason.h ('k') | src/builtins.h » ('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 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 251 matching lines...) Expand 10 before | Expand all | Expand 10 after
262 // 'from'. 262 // 'from'.
263 void TransferObject(Handle<JSObject> from, Handle<JSObject> to); 263 void TransferObject(Handle<JSObject> from, Handle<JSObject> to);
264 void TransferNamedProperties(Handle<JSObject> from, Handle<JSObject> to); 264 void TransferNamedProperties(Handle<JSObject> from, Handle<JSObject> to);
265 void TransferIndexedProperties(Handle<JSObject> from, Handle<JSObject> to); 265 void TransferIndexedProperties(Handle<JSObject> from, Handle<JSObject> to);
266 266
267 enum FunctionMode { 267 enum FunctionMode {
268 // With prototype. 268 // With prototype.
269 FUNCTION_WITH_WRITEABLE_PROTOTYPE, 269 FUNCTION_WITH_WRITEABLE_PROTOTYPE,
270 FUNCTION_WITH_READONLY_PROTOTYPE, 270 FUNCTION_WITH_READONLY_PROTOTYPE,
271 // Without prototype. 271 // Without prototype.
272 FUNCTION_WITHOUT_PROTOTYPE, 272 FUNCTION_WITHOUT_PROTOTYPE
273 BOUND_FUNCTION
274 }; 273 };
275 274
276 static bool IsFunctionModeWithPrototype(FunctionMode function_mode) { 275 static bool IsFunctionModeWithPrototype(FunctionMode function_mode) {
277 return (function_mode == FUNCTION_WITH_WRITEABLE_PROTOTYPE || 276 return (function_mode == FUNCTION_WITH_WRITEABLE_PROTOTYPE ||
278 function_mode == FUNCTION_WITH_READONLY_PROTOTYPE); 277 function_mode == FUNCTION_WITH_READONLY_PROTOTYPE);
279 } 278 }
280 279
281 Handle<Map> CreateSloppyFunctionMap(FunctionMode function_mode); 280 Handle<Map> CreateSloppyFunctionMap(FunctionMode function_mode);
282 281
283 void SetFunctionInstanceDescriptor(Handle<Map> map, 282 void SetFunctionInstanceDescriptor(Handle<Map> map,
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after
479 AccessorConstantDescriptor d(Handle<Name>(Name::cast(prototype->name())), 478 AccessorConstantDescriptor d(Handle<Name>(Name::cast(prototype->name())),
480 prototype, ro_attribs); 479 prototype, ro_attribs);
481 map->AppendDescriptor(&d); 480 map->AppendDescriptor(&d);
482 } 481 }
483 } 482 }
484 483
485 484
486 Handle<Map> Genesis::CreateSloppyFunctionMap(FunctionMode function_mode) { 485 Handle<Map> Genesis::CreateSloppyFunctionMap(FunctionMode function_mode) {
487 Handle<Map> map = factory()->NewMap(JS_FUNCTION_TYPE, JSFunction::kSize); 486 Handle<Map> map = factory()->NewMap(JS_FUNCTION_TYPE, JSFunction::kSize);
488 SetFunctionInstanceDescriptor(map, function_mode); 487 SetFunctionInstanceDescriptor(map, function_mode);
489 map->set_is_constructor(IsFunctionModeWithPrototype(function_mode)); 488 if (IsFunctionModeWithPrototype(function_mode)) map->set_is_constructor();
490 map->set_is_callable(); 489 map->set_is_callable();
491 return map; 490 return map;
492 } 491 }
493 492
494 493
495 Handle<JSFunction> Genesis::CreateEmptyFunction(Isolate* isolate) { 494 Handle<JSFunction> Genesis::CreateEmptyFunction(Isolate* isolate) {
496 // Allocate the map for function instances. Maps are allocated first and their 495 // Allocate the map for function instances. Maps are allocated first and their
497 // prototypes patched later, once empty function is created. 496 // prototypes patched later, once empty function is created.
498 497
499 // Functions with this map will not have a 'prototype' property, and 498 // Functions with this map will not have a 'prototype' property, and
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
602 int size = IsFunctionModeWithPrototype(function_mode) ? 3 : 2; 601 int size = IsFunctionModeWithPrototype(function_mode) ? 3 : 2;
603 Map::EnsureDescriptorSlack(map, size); 602 Map::EnsureDescriptorSlack(map, size);
604 603
605 PropertyAttributes rw_attribs = 604 PropertyAttributes rw_attribs =
606 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE); 605 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE);
607 PropertyAttributes ro_attribs = 606 PropertyAttributes ro_attribs =
608 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY); 607 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY);
609 PropertyAttributes roc_attribs = 608 PropertyAttributes roc_attribs =
610 static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY); 609 static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY);
611 610
612 if (function_mode == BOUND_FUNCTION) { 611 DCHECK(function_mode == FUNCTION_WITH_WRITEABLE_PROTOTYPE ||
613 { // Add length. 612 function_mode == FUNCTION_WITH_READONLY_PROTOTYPE ||
614 Handle<String> length_string = isolate()->factory()->length_string(); 613 function_mode == FUNCTION_WITHOUT_PROTOTYPE);
615 DataDescriptor d(length_string, 0, roc_attribs, Representation::Tagged()); 614 { // Add length.
616 map->AppendDescriptor(&d); 615 Handle<AccessorInfo> length =
617 } 616 Accessors::FunctionLengthInfo(isolate(), roc_attribs);
618 { // Add name. 617 AccessorConstantDescriptor d(Handle<Name>(Name::cast(length->name())),
619 Handle<String> name_string = isolate()->factory()->name_string(); 618 length, roc_attribs);
620 DataDescriptor d(name_string, 1, roc_attribs, Representation::Tagged()); 619 map->AppendDescriptor(&d);
621 map->AppendDescriptor(&d); 620 }
622 } 621 { // Add name.
623 } else { 622 Handle<AccessorInfo> name =
624 DCHECK(function_mode == FUNCTION_WITH_WRITEABLE_PROTOTYPE || 623 Accessors::FunctionNameInfo(isolate(), roc_attribs);
625 function_mode == FUNCTION_WITH_READONLY_PROTOTYPE || 624 AccessorConstantDescriptor d(Handle<Name>(Name::cast(name->name())), name,
626 function_mode == FUNCTION_WITHOUT_PROTOTYPE); 625 roc_attribs);
627 { // Add length. 626 map->AppendDescriptor(&d);
628 Handle<AccessorInfo> length =
629 Accessors::FunctionLengthInfo(isolate(), roc_attribs);
630 AccessorConstantDescriptor d(Handle<Name>(Name::cast(length->name())),
631 length, roc_attribs);
632 map->AppendDescriptor(&d);
633 }
634 { // Add name.
635 Handle<AccessorInfo> name =
636 Accessors::FunctionNameInfo(isolate(), roc_attribs);
637 AccessorConstantDescriptor d(Handle<Name>(Name::cast(name->name())), name,
638 roc_attribs);
639 map->AppendDescriptor(&d);
640 }
641 } 627 }
642 if (IsFunctionModeWithPrototype(function_mode)) { 628 if (IsFunctionModeWithPrototype(function_mode)) {
643 // Add prototype. 629 // Add prototype.
644 PropertyAttributes attribs = 630 PropertyAttributes attribs =
645 function_mode == FUNCTION_WITH_WRITEABLE_PROTOTYPE ? rw_attribs 631 function_mode == FUNCTION_WITH_WRITEABLE_PROTOTYPE ? rw_attribs
646 : ro_attribs; 632 : ro_attribs;
647 Handle<AccessorInfo> prototype = 633 Handle<AccessorInfo> prototype =
648 Accessors::FunctionPrototypeInfo(isolate(), attribs); 634 Accessors::FunctionPrototypeInfo(isolate(), attribs);
649 AccessorConstantDescriptor d(Handle<Name>(Name::cast(prototype->name())), 635 AccessorConstantDescriptor d(Handle<Name>(Name::cast(prototype->name())),
650 prototype, attribs); 636 prototype, attribs);
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
725 Builtins::kRestrictedStrictArgumentsPropertiesThrower); 711 Builtins::kRestrictedStrictArgumentsPropertiesThrower);
726 } 712 }
727 return strict_poison_function_; 713 return strict_poison_function_;
728 } 714 }
729 715
730 716
731 Handle<Map> Genesis::CreateStrictFunctionMap( 717 Handle<Map> Genesis::CreateStrictFunctionMap(
732 FunctionMode function_mode, Handle<JSFunction> empty_function) { 718 FunctionMode function_mode, Handle<JSFunction> empty_function) {
733 Handle<Map> map = factory()->NewMap(JS_FUNCTION_TYPE, JSFunction::kSize); 719 Handle<Map> map = factory()->NewMap(JS_FUNCTION_TYPE, JSFunction::kSize);
734 SetStrictFunctionInstanceDescriptor(map, function_mode); 720 SetStrictFunctionInstanceDescriptor(map, function_mode);
735 map->set_is_constructor(IsFunctionModeWithPrototype(function_mode)); 721 if (IsFunctionModeWithPrototype(function_mode)) map->set_is_constructor();
736 map->set_is_callable(); 722 map->set_is_callable();
737 Map::SetPrototype(map, empty_function); 723 Map::SetPrototype(map, empty_function);
738 return map; 724 return map;
739 } 725 }
740 726
741 727
742 Handle<Map> Genesis::CreateStrongFunctionMap( 728 Handle<Map> Genesis::CreateStrongFunctionMap(
743 Handle<JSFunction> empty_function, bool is_constructor) { 729 Handle<JSFunction> empty_function, bool is_constructor) {
744 Handle<Map> map = factory()->NewMap(JS_FUNCTION_TYPE, JSFunction::kSize); 730 Handle<Map> map = factory()->NewMap(JS_FUNCTION_TYPE, JSFunction::kSize);
745 SetStrongFunctionInstanceDescriptor(map); 731 SetStrongFunctionInstanceDescriptor(map);
746 map->set_is_constructor(is_constructor); 732 if (is_constructor) map->set_is_constructor();
747 Map::SetPrototype(map, empty_function); 733 Map::SetPrototype(map, empty_function);
748 map->set_is_callable(); 734 map->set_is_callable();
749 map->set_is_extensible(is_constructor); 735 map->set_is_extensible(is_constructor);
750 map->set_is_strong(); 736 map->set_is_strong();
751 return map; 737 return map;
752 } 738 }
753 739
754 740
755 void Genesis::CreateStrictModeFunctionMaps(Handle<JSFunction> empty) { 741 void Genesis::CreateStrictModeFunctionMaps(Handle<JSFunction> empty) {
756 // Allocate map for the prototype-less strict mode instances. 742 // Allocate map for the prototype-less strict mode instances.
757 Handle<Map> strict_function_without_prototype_map = 743 Handle<Map> strict_function_without_prototype_map =
758 CreateStrictFunctionMap(FUNCTION_WITHOUT_PROTOTYPE, empty); 744 CreateStrictFunctionMap(FUNCTION_WITHOUT_PROTOTYPE, empty);
759 native_context()->set_strict_function_without_prototype_map( 745 native_context()->set_strict_function_without_prototype_map(
760 *strict_function_without_prototype_map); 746 *strict_function_without_prototype_map);
761 747
762 // Allocate map for the strict mode functions. This map is temporary, used 748 // Allocate map for the strict mode functions. This map is temporary, used
763 // only for processing of builtins. 749 // only for processing of builtins.
764 // Later the map is replaced with writable prototype map, allocated below. 750 // Later the map is replaced with writable prototype map, allocated below.
765 Handle<Map> strict_function_map = 751 Handle<Map> strict_function_map =
766 CreateStrictFunctionMap(FUNCTION_WITH_READONLY_PROTOTYPE, empty); 752 CreateStrictFunctionMap(FUNCTION_WITH_READONLY_PROTOTYPE, empty);
767 native_context()->set_strict_function_map(*strict_function_map); 753 native_context()->set_strict_function_map(*strict_function_map);
768 754
769 // The final map for the strict mode functions. Writeable prototype. 755 // The final map for the strict mode functions. Writeable prototype.
770 // This map is installed in MakeFunctionInstancePrototypeWritable. 756 // This map is installed in MakeFunctionInstancePrototypeWritable.
771 strict_function_map_writable_prototype_ = 757 strict_function_map_writable_prototype_ =
772 CreateStrictFunctionMap(FUNCTION_WITH_WRITEABLE_PROTOTYPE, empty); 758 CreateStrictFunctionMap(FUNCTION_WITH_WRITEABLE_PROTOTYPE, empty);
773
774 // Special map for non-constructor bound functions.
775 // TODO(bmeurer): Bound functions should not be represented as JSFunctions.
776 Handle<Map> bound_function_without_constructor_map =
777 CreateStrictFunctionMap(BOUND_FUNCTION, empty);
778 native_context()->set_bound_function_without_constructor_map(
779 *bound_function_without_constructor_map);
780
781 // Special map for constructor bound functions.
782 // TODO(bmeurer): Bound functions should not be represented as JSFunctions.
783 Handle<Map> bound_function_with_constructor_map =
784 Map::Copy(bound_function_without_constructor_map, "IsConstructor");
785 bound_function_with_constructor_map->set_is_constructor(true);
786 native_context()->set_bound_function_with_constructor_map(
787 *bound_function_with_constructor_map);
788 } 759 }
789 760
790 761
791 void Genesis::CreateStrongModeFunctionMaps(Handle<JSFunction> empty) { 762 void Genesis::CreateStrongModeFunctionMaps(Handle<JSFunction> empty) {
792 // Allocate map for strong mode instances, which never have prototypes. 763 // Allocate map for strong mode instances, which never have prototypes.
793 Handle<Map> strong_function_map = CreateStrongFunctionMap(empty, false); 764 Handle<Map> strong_function_map = CreateStrongFunctionMap(empty, false);
794 native_context()->set_strong_function_map(*strong_function_map); 765 native_context()->set_strong_function_map(*strong_function_map);
795 // Constructors do, though. 766 // Constructors do, though.
796 Handle<Map> strong_constructor_map = CreateStrongFunctionMap(empty, true); 767 Handle<Map> strong_constructor_map = CreateStrongFunctionMap(empty, true);
797 native_context()->set_strong_constructor_map(*strong_constructor_map); 768 native_context()->set_strong_constructor_map(*strong_constructor_map);
(...skipping 654 matching lines...) Expand 10 before | Expand all | Expand 10 after
1452 } 1423 }
1453 1424
1454 { // -- W e a k S e t 1425 { // -- W e a k S e t
1455 Handle<JSFunction> js_weak_set_fun = InstallFunction( 1426 Handle<JSFunction> js_weak_set_fun = InstallFunction(
1456 global, "WeakSet", JS_WEAK_SET_TYPE, JSWeakSet::kSize, 1427 global, "WeakSet", JS_WEAK_SET_TYPE, JSWeakSet::kSize,
1457 isolate->initial_object_prototype(), Builtins::kIllegal); 1428 isolate->initial_object_prototype(), Builtins::kIllegal);
1458 InstallWithIntrinsicDefaultProto(isolate, js_weak_set_fun, 1429 InstallWithIntrinsicDefaultProto(isolate, js_weak_set_fun,
1459 Context::JS_WEAK_SET_FUN_INDEX); 1430 Context::JS_WEAK_SET_FUN_INDEX);
1460 } 1431 }
1461 1432
1433 { // --- B o u n d F u n c t i o n
1434 Handle<Map> map =
1435 factory->NewMap(JS_BOUND_FUNCTION_TYPE, JSBoundFunction::kSize);
1436 map->set_is_callable();
1437 Map::SetPrototype(map, empty_function);
1438
1439 PropertyAttributes roc_attribs =
1440 static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY);
1441 Map::EnsureDescriptorSlack(map, 2);
1442
1443 { // length
1444 DataDescriptor d(factory->length_string(), JSBoundFunction::kLengthIndex,
1445 roc_attribs, Representation::Tagged());
1446 map->AppendDescriptor(&d);
1447 }
1448 { // name
1449 DataDescriptor d(factory->name_string(), JSBoundFunction::kNameIndex,
1450 roc_attribs, Representation::Tagged());
1451 map->AppendDescriptor(&d);
1452 }
1453
1454 map->SetInObjectProperties(2);
1455 native_context()->set_bound_function_without_constructor_map(*map);
1456
1457 map = Map::Copy(map, "IsConstructor");
1458 map->set_is_constructor();
1459 native_context()->set_bound_function_with_constructor_map(*map);
1460 }
1461
1462 { // --- sloppy arguments map 1462 { // --- sloppy arguments map
1463 // Make sure we can recognize argument objects at runtime. 1463 // Make sure we can recognize argument objects at runtime.
1464 // This is done by introducing an anonymous function with 1464 // This is done by introducing an anonymous function with
1465 // class_name equals 'Arguments'. 1465 // class_name equals 'Arguments'.
1466 Handle<String> arguments_string = factory->Arguments_string(); 1466 Handle<String> arguments_string = factory->Arguments_string();
1467 Handle<Code> code = isolate->builtins()->Illegal(); 1467 Handle<Code> code = isolate->builtins()->Illegal();
1468 Handle<JSFunction> function = factory->NewFunctionWithoutPrototype( 1468 Handle<JSFunction> function = factory->NewFunctionWithoutPrototype(
1469 arguments_string, code); 1469 arguments_string, code);
1470 function->shared()->set_instance_class_name(*arguments_string); 1470 function->shared()->set_instance_class_name(*arguments_string);
1471 1471
(...skipping 806 matching lines...) Expand 10 before | Expand all | Expand 10 after
2278 } 2278 }
2279 2279
2280 2280
2281 void Genesis::InstallJSProxyMaps() { 2281 void Genesis::InstallJSProxyMaps() {
2282 // Allocate the different maps for all Proxy types. 2282 // Allocate the different maps for all Proxy types.
2283 // Next to the default proxy, we need maps indicating callable and 2283 // Next to the default proxy, we need maps indicating callable and
2284 // constructable proxies. 2284 // constructable proxies.
2285 2285
2286 Handle<Map> proxy_function_map = 2286 Handle<Map> proxy_function_map =
2287 Map::Copy(isolate()->sloppy_function_without_prototype_map(), "Proxy"); 2287 Map::Copy(isolate()->sloppy_function_without_prototype_map(), "Proxy");
2288 proxy_function_map->set_is_constructor(true); 2288 proxy_function_map->set_is_constructor();
2289 native_context()->set_proxy_function_map(*proxy_function_map); 2289 native_context()->set_proxy_function_map(*proxy_function_map);
2290 2290
2291 Handle<Map> proxy_map = 2291 Handle<Map> proxy_map =
2292 factory()->NewMap(JS_PROXY_TYPE, JSProxy::kSize, FAST_ELEMENTS); 2292 factory()->NewMap(JS_PROXY_TYPE, JSProxy::kSize, FAST_ELEMENTS);
2293 native_context()->set_proxy_map(*proxy_map); 2293 native_context()->set_proxy_map(*proxy_map);
2294 2294
2295 Handle<Map> proxy_callable_map = Map::Copy(proxy_map, "callable Proxy"); 2295 Handle<Map> proxy_callable_map = Map::Copy(proxy_map, "callable Proxy");
2296 proxy_callable_map->set_is_callable(); 2296 proxy_callable_map->set_is_callable();
2297 native_context()->set_proxy_callable_map(*proxy_callable_map); 2297 native_context()->set_proxy_callable_map(*proxy_callable_map);
2298 proxy_callable_map->SetConstructor(native_context()->function_function()); 2298 proxy_callable_map->SetConstructor(native_context()->function_function());
2299 2299
2300 Handle<Map> proxy_constructor_map = 2300 Handle<Map> proxy_constructor_map =
2301 Map::Copy(proxy_callable_map, "constructor Proxy"); 2301 Map::Copy(proxy_callable_map, "constructor Proxy");
2302 proxy_constructor_map->set_is_constructor(true); 2302 proxy_constructor_map->set_is_constructor();
2303 native_context()->set_proxy_constructor_map(*proxy_constructor_map); 2303 native_context()->set_proxy_constructor_map(*proxy_constructor_map);
2304 } 2304 }
2305 2305
2306 2306
2307 void Genesis::InitializeGlobal_harmony_proxies() { 2307 void Genesis::InitializeGlobal_harmony_proxies() {
2308 if (!FLAG_harmony_proxies) return; 2308 if (!FLAG_harmony_proxies) return;
2309 Handle<JSGlobalObject> global( 2309 Handle<JSGlobalObject> global(
2310 JSGlobalObject::cast(native_context()->global_object())); 2310 JSGlobalObject::cast(native_context()->global_object()));
2311 Isolate* isolate = global->GetIsolate(); 2311 Isolate* isolate = global->GetIsolate();
2312 Factory* factory = isolate->factory(); 2312 Factory* factory = isolate->factory();
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after
2518 MaybeHandle<JSObject>(), Builtins::kArrayConcat); 2518 MaybeHandle<JSObject>(), Builtins::kArrayConcat);
2519 2519
2520 // Make sure that InternalArray.prototype.concat appears to be compiled. 2520 // Make sure that InternalArray.prototype.concat appears to be compiled.
2521 // The code will never be called, but inline caching for call will 2521 // The code will never be called, but inline caching for call will
2522 // only work if it appears to be compiled. 2522 // only work if it appears to be compiled.
2523 concat->shared()->DontAdaptArguments(); 2523 concat->shared()->DontAdaptArguments();
2524 DCHECK(concat->is_compiled()); 2524 DCHECK(concat->is_compiled());
2525 // Set the lengths for the functions to satisfy ECMA-262. 2525 // Set the lengths for the functions to satisfy ECMA-262.
2526 concat->shared()->set_length(1); 2526 concat->shared()->set_length(1);
2527 } 2527 }
2528 // Install Function.prototype.apply, call, and toString. 2528
2529 // Install Function.prototype.apply, bind, call, and toString.
2529 { 2530 {
2530 Handle<String> key = factory()->Function_string(); 2531 Handle<String> key = factory()->Function_string();
2531 Handle<JSFunction> function = 2532 Handle<JSFunction> function =
2532 Handle<JSFunction>::cast(Object::GetProperty( 2533 Handle<JSFunction>::cast(Object::GetProperty(
2533 handle(native_context()->global_object()), key).ToHandleChecked()); 2534 handle(native_context()->global_object()), key).ToHandleChecked());
2534 Handle<JSObject> proto = 2535 Handle<JSObject> proto =
2535 Handle<JSObject>(JSObject::cast(function->instance_prototype())); 2536 Handle<JSObject>(JSObject::cast(function->instance_prototype()));
2536 2537
2537 // Install the apply, call and toString functions. 2538 // Install the apply, bind, call and toString functions.
2538 SimpleInstallFunction(proto, factory()->apply_string(), 2539 SimpleInstallFunction(proto, factory()->apply_string(),
2539 Builtins::kFunctionPrototypeApply, 2, false); 2540 Builtins::kFunctionPrototypeApply, 2, false);
2541 SimpleInstallFunction(proto, factory()->bind_string(),
2542 Builtins::kFunctionPrototypeBind, 1, false);
2540 SimpleInstallFunction(proto, factory()->call_string(), 2543 SimpleInstallFunction(proto, factory()->call_string(),
2541 Builtins::kFunctionPrototypeCall, 1, false); 2544 Builtins::kFunctionPrototypeCall, 1, false);
2542 SimpleInstallFunction(proto, factory()->toString_string(), 2545 SimpleInstallFunction(proto, factory()->toString_string(),
2543 Builtins::kFunctionPrototypeToString, 0, false); 2546 Builtins::kFunctionPrototypeToString, 0, false);
2544 } 2547 }
2545 2548
2546 // Set up the Promise constructor. 2549 // Set up the Promise constructor.
2547 { 2550 {
2548 Handle<String> key = factory()->Promise_string(); 2551 Handle<String> key = factory()->Promise_string();
2549 Handle<JSFunction> function = Handle<JSFunction>::cast( 2552 Handle<JSFunction> function = Handle<JSFunction>::cast(
(...skipping 803 matching lines...) Expand 10 before | Expand all | Expand 10 after
3353 } 3356 }
3354 3357
3355 3358
3356 // Called when the top-level V8 mutex is destroyed. 3359 // Called when the top-level V8 mutex is destroyed.
3357 void Bootstrapper::FreeThreadResources() { 3360 void Bootstrapper::FreeThreadResources() {
3358 DCHECK(!IsActive()); 3361 DCHECK(!IsActive());
3359 } 3362 }
3360 3363
3361 } // namespace internal 3364 } // namespace internal
3362 } // namespace v8 3365 } // namespace v8
OLDNEW
« no previous file with comments | « src/bailout-reason.h ('k') | src/builtins.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698