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 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
158 Handle<JSFunction> GetRestrictedFunctionPropertiesThrower(); | 158 Handle<JSFunction> GetRestrictedFunctionPropertiesThrower(); |
159 Handle<JSFunction> GetStrictArgumentsPoisonFunction(); | 159 Handle<JSFunction> GetStrictArgumentsPoisonFunction(); |
160 Handle<JSFunction> GetThrowTypeErrorIntrinsic(Builtins::Name builtin_name); | 160 Handle<JSFunction> GetThrowTypeErrorIntrinsic(Builtins::Name builtin_name); |
161 | 161 |
162 void CreateStrictModeFunctionMaps(Handle<JSFunction> empty); | 162 void CreateStrictModeFunctionMaps(Handle<JSFunction> empty); |
163 void CreateIteratorMaps(Handle<JSFunction> empty); | 163 void CreateIteratorMaps(Handle<JSFunction> empty); |
164 void CreateAsyncFunctionMaps(Handle<JSFunction> empty); | 164 void CreateAsyncFunctionMaps(Handle<JSFunction> empty); |
165 void CreateJSProxyMaps(); | 165 void CreateJSProxyMaps(); |
166 | 166 |
167 // Make the "arguments" and "caller" properties throw a TypeError on access. | 167 // Make the "arguments" and "caller" properties throw a TypeError on access. |
168 void AddRestrictedFunctionProperties(Handle<Map> map); | 168 void AddRestrictedFunctionProperties(Handle<JSFunction> empty); |
169 | 169 |
170 // Creates the global objects using the global proxy and the template passed | 170 // Creates the global objects using the global proxy and the template passed |
171 // in through the API. We call this regardless of whether we are building a | 171 // in through the API. We call this regardless of whether we are building a |
172 // context from scratch or using a deserialized one from the partial snapshot | 172 // context from scratch or using a deserialized one from the partial snapshot |
173 // but in the latter case we don't use the objects it produces directly, as | 173 // but in the latter case we don't use the objects it produces directly, as |
174 // we have to used the deserialized ones that are linked together with the | 174 // we have to used the deserialized ones that are linked together with the |
175 // rest of the context snapshot. | 175 // rest of the context snapshot. |
176 Handle<JSGlobalObject> CreateNewGlobals( | 176 Handle<JSGlobalObject> CreateNewGlobals( |
177 v8::Local<v8::ObjectTemplate> global_proxy_template, | 177 v8::Local<v8::ObjectTemplate> global_proxy_template, |
178 Handle<JSGlobalProxy> global_proxy); | 178 Handle<JSGlobalProxy> global_proxy); |
(...skipping 423 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
602 | 602 |
603 // Set prototypes for the function maps. | 603 // Set prototypes for the function maps. |
604 Handle<Map> sloppy_function_map(native_context()->sloppy_function_map(), | 604 Handle<Map> sloppy_function_map(native_context()->sloppy_function_map(), |
605 isolate); | 605 isolate); |
606 Handle<Map> sloppy_function_without_prototype_map( | 606 Handle<Map> sloppy_function_without_prototype_map( |
607 native_context()->sloppy_function_without_prototype_map(), isolate); | 607 native_context()->sloppy_function_without_prototype_map(), isolate); |
608 Map::SetPrototype(sloppy_function_map, empty_function); | 608 Map::SetPrototype(sloppy_function_map, empty_function); |
609 Map::SetPrototype(sloppy_function_without_prototype_map, empty_function); | 609 Map::SetPrototype(sloppy_function_without_prototype_map, empty_function); |
610 Map::SetPrototype(sloppy_function_map_writable_prototype_, empty_function); | 610 Map::SetPrototype(sloppy_function_map_writable_prototype_, empty_function); |
611 | 611 |
612 // ES6 draft 03-17-2015, section 8.2.2 step 12 | |
613 AddRestrictedFunctionProperties(empty_function_map); | |
614 | |
615 return empty_function; | 612 return empty_function; |
616 } | 613 } |
617 | 614 |
618 | 615 |
619 void Genesis::SetStrictFunctionInstanceDescriptor(Handle<Map> map, | 616 void Genesis::SetStrictFunctionInstanceDescriptor(Handle<Map> map, |
620 FunctionMode function_mode) { | 617 FunctionMode function_mode) { |
621 int size = IsFunctionModeWithPrototype(function_mode) ? 3 : 2; | 618 int size = IsFunctionModeWithPrototype(function_mode) ? 3 : 2; |
622 Map::EnsureDescriptorSlack(map, size); | 619 Map::EnsureDescriptorSlack(map, size); |
623 | 620 |
624 PropertyAttributes rw_attribs = | 621 PropertyAttributes rw_attribs = |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
659 } | 656 } |
660 | 657 |
661 | 658 |
662 // Creates the %ThrowTypeError% function. | 659 // Creates the %ThrowTypeError% function. |
663 Handle<JSFunction> Genesis::GetThrowTypeErrorIntrinsic( | 660 Handle<JSFunction> Genesis::GetThrowTypeErrorIntrinsic( |
664 Builtins::Name builtin_name) { | 661 Builtins::Name builtin_name) { |
665 Handle<String> name = | 662 Handle<String> name = |
666 factory()->InternalizeOneByteString(STATIC_CHAR_VECTOR("ThrowTypeError")); | 663 factory()->InternalizeOneByteString(STATIC_CHAR_VECTOR("ThrowTypeError")); |
667 Handle<Code> code(isolate()->builtins()->builtin(builtin_name)); | 664 Handle<Code> code(isolate()->builtins()->builtin(builtin_name)); |
668 Handle<JSFunction> function = | 665 Handle<JSFunction> function = |
669 factory()->NewFunctionWithoutPrototype(name, code); | 666 factory()->NewFunctionWithoutPrototype(name, code, true); |
670 function->shared()->DontAdaptArguments(); | 667 function->shared()->DontAdaptArguments(); |
671 | 668 |
672 // %ThrowTypeError% must not have a name property. | 669 // %ThrowTypeError% must not have a name property. |
673 if (JSReceiver::DeleteProperty(function, factory()->name_string()) | 670 if (JSReceiver::DeleteProperty(function, factory()->name_string()) |
674 .IsNothing()) { | 671 .IsNothing()) { |
675 DCHECK(false); | 672 DCHECK(false); |
676 } | 673 } |
677 | 674 |
678 // length needs to be non configurable. | 675 // length needs to be non configurable. |
679 Handle<Object> value(Smi::FromInt(function->shared()->length()), isolate()); | 676 Handle<Object> value(Smi::FromInt(function->shared()->length()), isolate()); |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
732 // only for processing of builtins. | 729 // only for processing of builtins. |
733 // Later the map is replaced with writable prototype map, allocated below. | 730 // Later the map is replaced with writable prototype map, allocated below. |
734 Handle<Map> strict_function_map = | 731 Handle<Map> strict_function_map = |
735 CreateStrictFunctionMap(FUNCTION_WITH_READONLY_PROTOTYPE, empty); | 732 CreateStrictFunctionMap(FUNCTION_WITH_READONLY_PROTOTYPE, empty); |
736 native_context()->set_strict_function_map(*strict_function_map); | 733 native_context()->set_strict_function_map(*strict_function_map); |
737 | 734 |
738 // The final map for the strict mode functions. Writeable prototype. | 735 // The final map for the strict mode functions. Writeable prototype. |
739 // This map is installed in MakeFunctionInstancePrototypeWritable. | 736 // This map is installed in MakeFunctionInstancePrototypeWritable. |
740 strict_function_map_writable_prototype_ = | 737 strict_function_map_writable_prototype_ = |
741 CreateStrictFunctionMap(FUNCTION_WITH_WRITEABLE_PROTOTYPE, empty); | 738 CreateStrictFunctionMap(FUNCTION_WITH_WRITEABLE_PROTOTYPE, empty); |
| 739 |
| 740 // Now that the strict mode function map is available, set up the |
| 741 // restricted "arguments" and "caller" getters. |
| 742 AddRestrictedFunctionProperties(empty); |
742 } | 743 } |
743 | 744 |
744 void Genesis::CreateIteratorMaps(Handle<JSFunction> empty) { | 745 void Genesis::CreateIteratorMaps(Handle<JSFunction> empty) { |
745 // Create iterator-related meta-objects. | 746 // Create iterator-related meta-objects. |
746 Handle<JSObject> iterator_prototype = | 747 Handle<JSObject> iterator_prototype = |
747 factory()->NewJSObject(isolate()->object_function(), TENURED); | 748 factory()->NewJSObject(isolate()->object_function(), TENURED); |
748 Handle<JSObject> generator_object_prototype = | 749 Handle<JSObject> generator_object_prototype = |
749 factory()->NewJSObject(isolate()->object_function(), TENURED); | 750 factory()->NewJSObject(isolate()->object_function(), TENURED); |
750 native_context()->set_initial_generator_prototype( | 751 native_context()->set_initial_generator_prototype( |
751 *generator_object_prototype); | 752 *generator_object_prototype); |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
861 static void ReplaceAccessors(Handle<Map> map, | 862 static void ReplaceAccessors(Handle<Map> map, |
862 Handle<String> name, | 863 Handle<String> name, |
863 PropertyAttributes attributes, | 864 PropertyAttributes attributes, |
864 Handle<AccessorPair> accessor_pair) { | 865 Handle<AccessorPair> accessor_pair) { |
865 DescriptorArray* descriptors = map->instance_descriptors(); | 866 DescriptorArray* descriptors = map->instance_descriptors(); |
866 int idx = descriptors->SearchWithCache(map->GetIsolate(), *name, *map); | 867 int idx = descriptors->SearchWithCache(map->GetIsolate(), *name, *map); |
867 AccessorConstantDescriptor descriptor(name, accessor_pair, attributes); | 868 AccessorConstantDescriptor descriptor(name, accessor_pair, attributes); |
868 descriptors->Replace(idx, &descriptor); | 869 descriptors->Replace(idx, &descriptor); |
869 } | 870 } |
870 | 871 |
871 | 872 void Genesis::AddRestrictedFunctionProperties(Handle<JSFunction> empty) { |
872 void Genesis::AddRestrictedFunctionProperties(Handle<Map> map) { | |
873 PropertyAttributes rw_attribs = static_cast<PropertyAttributes>(DONT_ENUM); | 873 PropertyAttributes rw_attribs = static_cast<PropertyAttributes>(DONT_ENUM); |
874 Handle<JSFunction> thrower = GetRestrictedFunctionPropertiesThrower(); | 874 Handle<JSFunction> thrower = GetRestrictedFunctionPropertiesThrower(); |
875 Handle<AccessorPair> accessors = factory()->NewAccessorPair(); | 875 Handle<AccessorPair> accessors = factory()->NewAccessorPair(); |
876 accessors->set_getter(*thrower); | 876 accessors->set_getter(*thrower); |
877 accessors->set_setter(*thrower); | 877 accessors->set_setter(*thrower); |
878 | 878 |
| 879 Handle<Map> map(empty->map()); |
879 ReplaceAccessors(map, factory()->arguments_string(), rw_attribs, accessors); | 880 ReplaceAccessors(map, factory()->arguments_string(), rw_attribs, accessors); |
880 ReplaceAccessors(map, factory()->caller_string(), rw_attribs, accessors); | 881 ReplaceAccessors(map, factory()->caller_string(), rw_attribs, accessors); |
881 } | 882 } |
882 | 883 |
883 | 884 |
884 static void AddToWeakNativeContextList(Context* context) { | 885 static void AddToWeakNativeContextList(Context* context) { |
885 DCHECK(context->IsNativeContext()); | 886 DCHECK(context->IsNativeContext()); |
886 Heap* heap = context->GetIsolate()->heap(); | 887 Heap* heap = context->GetIsolate()->heap(); |
887 #ifdef DEBUG | 888 #ifdef DEBUG |
888 { // NOLINT | 889 { // NOLINT |
(...skipping 2887 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3776 } | 3777 } |
3777 | 3778 |
3778 | 3779 |
3779 // Called when the top-level V8 mutex is destroyed. | 3780 // Called when the top-level V8 mutex is destroyed. |
3780 void Bootstrapper::FreeThreadResources() { | 3781 void Bootstrapper::FreeThreadResources() { |
3781 DCHECK(!IsActive()); | 3782 DCHECK(!IsActive()); |
3782 } | 3783 } |
3783 | 3784 |
3784 } // namespace internal | 3785 } // namespace internal |
3785 } // namespace v8 | 3786 } // namespace v8 |
OLD | NEW |