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

Side by Side Diff: src/bootstrapper.cc

Issue 1590873002: Make generators non-constructable. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Adapt test262.status Created 4 years, 11 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/api-natives.cc ('k') | src/globals.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 465 matching lines...) Expand 10 before | Expand all | Expand 10 after
476 AccessorConstantDescriptor d(Handle<Name>(Name::cast(prototype->name())), 476 AccessorConstantDescriptor d(Handle<Name>(Name::cast(prototype->name())),
477 prototype, ro_attribs); 477 prototype, ro_attribs);
478 map->AppendDescriptor(&d); 478 map->AppendDescriptor(&d);
479 } 479 }
480 } 480 }
481 481
482 482
483 Handle<Map> Genesis::CreateSloppyFunctionMap(FunctionMode function_mode) { 483 Handle<Map> Genesis::CreateSloppyFunctionMap(FunctionMode function_mode) {
484 Handle<Map> map = factory()->NewMap(JS_FUNCTION_TYPE, JSFunction::kSize); 484 Handle<Map> map = factory()->NewMap(JS_FUNCTION_TYPE, JSFunction::kSize);
485 SetFunctionInstanceDescriptor(map, function_mode); 485 SetFunctionInstanceDescriptor(map, function_mode);
486 if (IsFunctionModeWithPrototype(function_mode)) map->set_is_constructor(); 486 map->set_is_constructor(IsFunctionModeWithPrototype(function_mode));
487 map->set_is_callable(); 487 map->set_is_callable();
488 return map; 488 return map;
489 } 489 }
490 490
491 491
492 Handle<JSFunction> Genesis::CreateEmptyFunction(Isolate* isolate) { 492 Handle<JSFunction> Genesis::CreateEmptyFunction(Isolate* isolate) {
493 // Allocate the map for function instances. Maps are allocated first and their 493 // Allocate the map for function instances. Maps are allocated first and their
494 // prototypes patched later, once empty function is created. 494 // prototypes patched later, once empty function is created.
495 495
496 // Functions with this map will not have a 'prototype' property, and 496 // Functions with this map will not have a 'prototype' property, and
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after
708 Builtins::kRestrictedStrictArgumentsPropertiesThrower); 708 Builtins::kRestrictedStrictArgumentsPropertiesThrower);
709 } 709 }
710 return strict_poison_function_; 710 return strict_poison_function_;
711 } 711 }
712 712
713 713
714 Handle<Map> Genesis::CreateStrictFunctionMap( 714 Handle<Map> Genesis::CreateStrictFunctionMap(
715 FunctionMode function_mode, Handle<JSFunction> empty_function) { 715 FunctionMode function_mode, Handle<JSFunction> empty_function) {
716 Handle<Map> map = factory()->NewMap(JS_FUNCTION_TYPE, JSFunction::kSize); 716 Handle<Map> map = factory()->NewMap(JS_FUNCTION_TYPE, JSFunction::kSize);
717 SetStrictFunctionInstanceDescriptor(map, function_mode); 717 SetStrictFunctionInstanceDescriptor(map, function_mode);
718 if (IsFunctionModeWithPrototype(function_mode)) map->set_is_constructor(); 718 map->set_is_constructor(IsFunctionModeWithPrototype(function_mode));
719 map->set_is_callable(); 719 map->set_is_callable();
720 Map::SetPrototype(map, empty_function); 720 Map::SetPrototype(map, empty_function);
721 return map; 721 return map;
722 } 722 }
723 723
724 724
725 Handle<Map> Genesis::CreateStrongFunctionMap( 725 Handle<Map> Genesis::CreateStrongFunctionMap(
726 Handle<JSFunction> empty_function, bool is_constructor) { 726 Handle<JSFunction> empty_function, bool is_constructor) {
727 Handle<Map> map = factory()->NewMap(JS_FUNCTION_TYPE, JSFunction::kSize); 727 Handle<Map> map = factory()->NewMap(JS_FUNCTION_TYPE, JSFunction::kSize);
728 SetStrongFunctionInstanceDescriptor(map); 728 SetStrongFunctionInstanceDescriptor(map);
729 if (is_constructor) map->set_is_constructor(); 729 map->set_is_constructor(is_constructor);
730 Map::SetPrototype(map, empty_function); 730 Map::SetPrototype(map, empty_function);
731 map->set_is_callable(); 731 map->set_is_callable();
732 map->set_is_extensible(is_constructor); 732 map->set_is_extensible(is_constructor);
733 map->set_is_strong(); 733 map->set_is_strong();
734 return map; 734 return map;
735 } 735 }
736 736
737 737
738 void Genesis::CreateStrictModeFunctionMaps(Handle<JSFunction> empty) { 738 void Genesis::CreateStrictModeFunctionMaps(Handle<JSFunction> empty) {
739 // Allocate map for the prototype-less strict mode instances. 739 // Allocate map for the prototype-less strict mode instances.
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
782 static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY)); 782 static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
783 783
784 // Create maps for generator functions and their prototypes. Store those 784 // Create maps for generator functions and their prototypes. Store those
785 // maps in the native context. The "prototype" property descriptor is 785 // maps in the native context. The "prototype" property descriptor is
786 // writable, non-enumerable, and non-configurable (as per ES6 draft 786 // writable, non-enumerable, and non-configurable (as per ES6 draft
787 // 04-14-15, section 25.2.4.3). 787 // 04-14-15, section 25.2.4.3).
788 Handle<Map> strict_function_map(strict_function_map_writable_prototype_); 788 Handle<Map> strict_function_map(strict_function_map_writable_prototype_);
789 // Generator functions do not have "caller" or "arguments" accessors. 789 // Generator functions do not have "caller" or "arguments" accessors.
790 Handle<Map> sloppy_generator_function_map = 790 Handle<Map> sloppy_generator_function_map =
791 Map::Copy(strict_function_map, "SloppyGeneratorFunction"); 791 Map::Copy(strict_function_map, "SloppyGeneratorFunction");
792 sloppy_generator_function_map->set_is_constructor(false);
792 Map::SetPrototype(sloppy_generator_function_map, 793 Map::SetPrototype(sloppy_generator_function_map,
793 generator_function_prototype); 794 generator_function_prototype);
794 native_context()->set_sloppy_generator_function_map( 795 native_context()->set_sloppy_generator_function_map(
795 *sloppy_generator_function_map); 796 *sloppy_generator_function_map);
796 797
797 Handle<Map> strict_generator_function_map = 798 Handle<Map> strict_generator_function_map =
798 Map::Copy(strict_function_map, "StrictGeneratorFunction"); 799 Map::Copy(strict_function_map, "StrictGeneratorFunction");
800 strict_generator_function_map->set_is_constructor(false);
799 Map::SetPrototype(strict_generator_function_map, 801 Map::SetPrototype(strict_generator_function_map,
800 generator_function_prototype); 802 generator_function_prototype);
801 native_context()->set_strict_generator_function_map( 803 native_context()->set_strict_generator_function_map(
802 *strict_generator_function_map); 804 *strict_generator_function_map);
803 805
804 Handle<Map> strong_function_map(native_context()->strong_function_map()); 806 Handle<Map> strong_function_map(native_context()->strong_function_map());
805 Handle<Map> strong_generator_function_map = 807 Handle<Map> strong_generator_function_map =
806 Map::Copy(strong_function_map, "StrongGeneratorFunction"); 808 Map::Copy(strong_function_map, "StrongGeneratorFunction");
809 strong_generator_function_map->set_is_constructor(false);
807 Map::SetPrototype(strong_generator_function_map, 810 Map::SetPrototype(strong_generator_function_map,
808 generator_function_prototype); 811 generator_function_prototype);
809 native_context()->set_strong_generator_function_map( 812 native_context()->set_strong_generator_function_map(
810 *strong_generator_function_map); 813 *strong_generator_function_map);
811 814
812 Handle<JSFunction> object_function(native_context()->object_function()); 815 Handle<JSFunction> object_function(native_context()->object_function());
813 Handle<Map> generator_object_prototype_map = Map::Create(isolate(), 0); 816 Handle<Map> generator_object_prototype_map = Map::Create(isolate(), 0);
814 Map::SetPrototype(generator_object_prototype_map, generator_object_prototype); 817 Map::SetPrototype(generator_object_prototype_map, generator_object_prototype);
815 native_context()->set_generator_object_prototype_map( 818 native_context()->set_generator_object_prototype_map(
816 *generator_object_prototype_map); 819 *generator_object_prototype_map);
(...skipping 802 matching lines...) Expand 10 before | Expand all | Expand 10 after
1619 { // name 1622 { // name
1620 DataDescriptor d(factory->name_string(), JSBoundFunction::kNameIndex, 1623 DataDescriptor d(factory->name_string(), JSBoundFunction::kNameIndex,
1621 roc_attribs, Representation::Tagged()); 1624 roc_attribs, Representation::Tagged());
1622 map->AppendDescriptor(&d); 1625 map->AppendDescriptor(&d);
1623 } 1626 }
1624 1627
1625 map->SetInObjectProperties(2); 1628 map->SetInObjectProperties(2);
1626 native_context()->set_bound_function_without_constructor_map(*map); 1629 native_context()->set_bound_function_without_constructor_map(*map);
1627 1630
1628 map = Map::Copy(map, "IsConstructor"); 1631 map = Map::Copy(map, "IsConstructor");
1629 map->set_is_constructor(); 1632 map->set_is_constructor(true);
1630 native_context()->set_bound_function_with_constructor_map(*map); 1633 native_context()->set_bound_function_with_constructor_map(*map);
1631 } 1634 }
1632 1635
1633 { // --- sloppy arguments map 1636 { // --- sloppy arguments map
1634 // Make sure we can recognize argument objects at runtime. 1637 // Make sure we can recognize argument objects at runtime.
1635 // This is done by introducing an anonymous function with 1638 // This is done by introducing an anonymous function with
1636 // class_name equals 'Arguments'. 1639 // class_name equals 'Arguments'.
1637 Handle<String> arguments_string = factory->Arguments_string(); 1640 Handle<String> arguments_string = factory->Arguments_string();
1638 Handle<Code> code = isolate->builtins()->Illegal(); 1641 Handle<Code> code = isolate->builtins()->Illegal();
1639 Handle<JSFunction> function = factory->NewFunctionWithoutPrototype( 1642 Handle<JSFunction> function = factory->NewFunctionWithoutPrototype(
(...skipping 806 matching lines...) Expand 10 before | Expand all | Expand 10 after
2446 } 2449 }
2447 2450
2448 2451
2449 void Genesis::InstallJSProxyMaps() { 2452 void Genesis::InstallJSProxyMaps() {
2450 // Allocate the different maps for all Proxy types. 2453 // Allocate the different maps for all Proxy types.
2451 // Next to the default proxy, we need maps indicating callable and 2454 // Next to the default proxy, we need maps indicating callable and
2452 // constructable proxies. 2455 // constructable proxies.
2453 2456
2454 Handle<Map> proxy_function_map = 2457 Handle<Map> proxy_function_map =
2455 Map::Copy(isolate()->sloppy_function_without_prototype_map(), "Proxy"); 2458 Map::Copy(isolate()->sloppy_function_without_prototype_map(), "Proxy");
2456 proxy_function_map->set_is_constructor(); 2459 proxy_function_map->set_is_constructor(true);
2457 native_context()->set_proxy_function_map(*proxy_function_map); 2460 native_context()->set_proxy_function_map(*proxy_function_map);
2458 2461
2459 Handle<Map> proxy_map = 2462 Handle<Map> proxy_map =
2460 factory()->NewMap(JS_PROXY_TYPE, JSProxy::kSize, FAST_ELEMENTS); 2463 factory()->NewMap(JS_PROXY_TYPE, JSProxy::kSize, FAST_ELEMENTS);
2461 native_context()->set_proxy_map(*proxy_map); 2464 native_context()->set_proxy_map(*proxy_map);
2462 2465
2463 Handle<Map> proxy_callable_map = Map::Copy(proxy_map, "callable Proxy"); 2466 Handle<Map> proxy_callable_map = Map::Copy(proxy_map, "callable Proxy");
2464 proxy_callable_map->set_is_callable(); 2467 proxy_callable_map->set_is_callable();
2465 native_context()->set_proxy_callable_map(*proxy_callable_map); 2468 native_context()->set_proxy_callable_map(*proxy_callable_map);
2466 proxy_callable_map->SetConstructor(native_context()->function_function()); 2469 proxy_callable_map->SetConstructor(native_context()->function_function());
2467 2470
2468 Handle<Map> proxy_constructor_map = 2471 Handle<Map> proxy_constructor_map =
2469 Map::Copy(proxy_callable_map, "constructor Proxy"); 2472 Map::Copy(proxy_callable_map, "constructor Proxy");
2470 proxy_constructor_map->set_is_constructor(); 2473 proxy_constructor_map->set_is_constructor(true);
2471 native_context()->set_proxy_constructor_map(*proxy_constructor_map); 2474 native_context()->set_proxy_constructor_map(*proxy_constructor_map);
2472 } 2475 }
2473 2476
2474 2477
2475 void Genesis::InitializeGlobal_harmony_proxies() { 2478 void Genesis::InitializeGlobal_harmony_proxies() {
2476 if (!FLAG_harmony_proxies) return; 2479 if (!FLAG_harmony_proxies) return;
2477 Handle<JSGlobalObject> global( 2480 Handle<JSGlobalObject> global(
2478 JSGlobalObject::cast(native_context()->global_object())); 2481 JSGlobalObject::cast(native_context()->global_object()));
2479 Isolate* isolate = global->GetIsolate(); 2482 Isolate* isolate = global->GetIsolate();
2480 Factory* factory = isolate->factory(); 2483 Factory* factory = isolate->factory();
(...skipping 1038 matching lines...) Expand 10 before | Expand all | Expand 10 after
3519 } 3522 }
3520 3523
3521 3524
3522 // Called when the top-level V8 mutex is destroyed. 3525 // Called when the top-level V8 mutex is destroyed.
3523 void Bootstrapper::FreeThreadResources() { 3526 void Bootstrapper::FreeThreadResources() {
3524 DCHECK(!IsActive()); 3527 DCHECK(!IsActive());
3525 } 3528 }
3526 3529
3527 } // namespace internal 3530 } // namespace internal
3528 } // namespace v8 3531 } // namespace v8
OLDNEW
« no previous file with comments | « src/api-natives.cc ('k') | src/globals.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698