| 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/code-stubs.h" | 8 #include "src/code-stubs.h" | 
| 9 #include "src/extensions/externalize-string-extension.h" | 9 #include "src/extensions/externalize-string-extension.h" | 
| 10 #include "src/extensions/free-buffer-extension.h" | 10 #include "src/extensions/free-buffer-extension.h" | 
| (...skipping 343 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 354   if (env.is_null() || !InstallExtensions(env, extensions)) { | 354   if (env.is_null() || !InstallExtensions(env, extensions)) { | 
| 355     return Handle<Context>(); | 355     return Handle<Context>(); | 
| 356   } | 356   } | 
| 357   return scope.CloseAndEscape(env); | 357   return scope.CloseAndEscape(env); | 
| 358 } | 358 } | 
| 359 | 359 | 
| 360 | 360 | 
| 361 static void SetObjectPrototype(Handle<JSObject> object, Handle<Object> proto) { | 361 static void SetObjectPrototype(Handle<JSObject> object, Handle<Object> proto) { | 
| 362   // object.__proto__ = proto; | 362   // object.__proto__ = proto; | 
| 363   Handle<Map> old_map = Handle<Map>(object->map()); | 363   Handle<Map> old_map = Handle<Map>(object->map()); | 
| 364   Handle<Map> new_map = Map::Copy(old_map); | 364   Handle<Map> new_map = Map::Copy(old_map, "SetObjectPrototype"); | 
| 365   new_map->set_prototype(*proto); | 365   new_map->set_prototype(*proto); | 
| 366   JSObject::MigrateToMap(object, new_map); | 366   JSObject::MigrateToMap(object, new_map); | 
| 367 } | 367 } | 
| 368 | 368 | 
| 369 | 369 | 
| 370 void Bootstrapper::DetachGlobal(Handle<Context> env) { | 370 void Bootstrapper::DetachGlobal(Handle<Context> env) { | 
| 371   Factory* factory = env->GetIsolate()->factory(); | 371   Factory* factory = env->GetIsolate()->factory(); | 
| 372   Handle<JSGlobalProxy> global_proxy(JSGlobalProxy::cast(env->global_proxy())); | 372   Handle<JSGlobalProxy> global_proxy(JSGlobalProxy::cast(env->global_proxy())); | 
| 373   global_proxy->set_native_context(*factory->null_value()); | 373   global_proxy->set_native_context(*factory->null_value()); | 
| 374   SetObjectPrototype(global_proxy, factory->null_value()); | 374   SetObjectPrototype(global_proxy, factory->null_value()); | 
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 503     JSFunction::SetInitialMap(object_fun, object_function_map, | 503     JSFunction::SetInitialMap(object_fun, object_function_map, | 
| 504                               isolate->factory()->null_value()); | 504                               isolate->factory()->null_value()); | 
| 505     object_function_map->set_unused_property_fields(unused); | 505     object_function_map->set_unused_property_fields(unused); | 
| 506 | 506 | 
| 507     native_context()->set_object_function(*object_fun); | 507     native_context()->set_object_function(*object_fun); | 
| 508 | 508 | 
| 509     // Allocate a new prototype for the object function. | 509     // Allocate a new prototype for the object function. | 
| 510     Handle<JSObject> prototype = factory->NewJSObject( | 510     Handle<JSObject> prototype = factory->NewJSObject( | 
| 511         isolate->object_function(), | 511         isolate->object_function(), | 
| 512         TENURED); | 512         TENURED); | 
| 513     Handle<Map> map = Map::Copy(handle(prototype->map())); | 513     Handle<Map> map = | 
|  | 514         Map::Copy(handle(prototype->map()), "EmptyObjectPrototype"); | 
| 514     map->set_is_prototype_map(true); | 515     map->set_is_prototype_map(true); | 
| 515     prototype->set_map(*map); | 516     prototype->set_map(*map); | 
| 516 | 517 | 
| 517     native_context()->set_initial_object_prototype(*prototype); | 518     native_context()->set_initial_object_prototype(*prototype); | 
| 518     // For bootstrapping set the array prototype to be the same as the object | 519     // For bootstrapping set the array prototype to be the same as the object | 
| 519     // prototype, otherwise the missing initial_array_prototype will cause | 520     // prototype, otherwise the missing initial_array_prototype will cause | 
| 520     // assertions during startup. | 521     // assertions during startup. | 
| 521     native_context()->set_initial_array_prototype(*prototype); | 522     native_context()->set_initial_array_prototype(*prototype); | 
| 522     Accessors::FunctionSetPrototype(object_fun, prototype).Assert(); | 523     Accessors::FunctionSetPrototype(object_fun, prototype).Assert(); | 
| 523   } | 524   } | 
| (...skipping 558 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1082     } | 1083     } | 
| 1083 | 1084 | 
| 1084     initial_map->set_inobject_properties(5); | 1085     initial_map->set_inobject_properties(5); | 
| 1085     initial_map->set_pre_allocated_property_fields(5); | 1086     initial_map->set_pre_allocated_property_fields(5); | 
| 1086     initial_map->set_unused_property_fields(0); | 1087     initial_map->set_unused_property_fields(0); | 
| 1087     initial_map->set_instance_size( | 1088     initial_map->set_instance_size( | 
| 1088         initial_map->instance_size() + 5 * kPointerSize); | 1089         initial_map->instance_size() + 5 * kPointerSize); | 
| 1089     initial_map->set_visitor_id(StaticVisitorBase::GetVisitorId(*initial_map)); | 1090     initial_map->set_visitor_id(StaticVisitorBase::GetVisitorId(*initial_map)); | 
| 1090 | 1091 | 
| 1091     // RegExp prototype object is itself a RegExp. | 1092     // RegExp prototype object is itself a RegExp. | 
| 1092     Handle<Map> proto_map = Map::Copy(initial_map); | 1093     Handle<Map> proto_map = Map::Copy(initial_map, "RegExpPrototype"); | 
| 1093     proto_map->set_prototype(native_context()->initial_object_prototype()); | 1094     proto_map->set_prototype(native_context()->initial_object_prototype()); | 
| 1094     Handle<JSObject> proto = factory->NewJSObjectFromMap(proto_map); | 1095     Handle<JSObject> proto = factory->NewJSObjectFromMap(proto_map); | 
| 1095     proto->InObjectPropertyAtPut(JSRegExp::kSourceFieldIndex, | 1096     proto->InObjectPropertyAtPut(JSRegExp::kSourceFieldIndex, | 
| 1096                                  heap->query_colon_string()); | 1097                                  heap->query_colon_string()); | 
| 1097     proto->InObjectPropertyAtPut(JSRegExp::kGlobalFieldIndex, | 1098     proto->InObjectPropertyAtPut(JSRegExp::kGlobalFieldIndex, | 
| 1098                                  heap->false_value()); | 1099                                  heap->false_value()); | 
| 1099     proto->InObjectPropertyAtPut(JSRegExp::kIgnoreCaseFieldIndex, | 1100     proto->InObjectPropertyAtPut(JSRegExp::kIgnoreCaseFieldIndex, | 
| 1100                                  heap->false_value()); | 1101                                  heap->false_value()); | 
| 1101     proto->InObjectPropertyAtPut(JSRegExp::kMultilineFieldIndex, | 1102     proto->InObjectPropertyAtPut(JSRegExp::kMultilineFieldIndex, | 
| 1102                                  heap->false_value()); | 1103                                  heap->false_value()); | 
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1237     JSFunction::SetInitialMap(function, map, | 1238     JSFunction::SetInitialMap(function, map, | 
| 1238                               isolate->initial_object_prototype()); | 1239                               isolate->initial_object_prototype()); | 
| 1239 | 1240 | 
| 1240     DCHECK(map->inobject_properties() > Heap::kArgumentsCalleeIndex); | 1241     DCHECK(map->inobject_properties() > Heap::kArgumentsCalleeIndex); | 
| 1241     DCHECK(map->inobject_properties() > Heap::kArgumentsLengthIndex); | 1242     DCHECK(map->inobject_properties() > Heap::kArgumentsLengthIndex); | 
| 1242     DCHECK(!map->is_dictionary_map()); | 1243     DCHECK(!map->is_dictionary_map()); | 
| 1243     DCHECK(IsFastObjectElementsKind(map->elements_kind())); | 1244     DCHECK(IsFastObjectElementsKind(map->elements_kind())); | 
| 1244   } | 1245   } | 
| 1245 | 1246 | 
| 1246   {  // --- aliased arguments map | 1247   {  // --- aliased arguments map | 
| 1247     Handle<Map> map = Map::Copy(isolate->sloppy_arguments_map()); | 1248     Handle<Map> map = | 
|  | 1249         Map::Copy(isolate->sloppy_arguments_map(), "AliasedArguments"); | 
| 1248     map->set_elements_kind(SLOPPY_ARGUMENTS_ELEMENTS); | 1250     map->set_elements_kind(SLOPPY_ARGUMENTS_ELEMENTS); | 
| 1249     DCHECK_EQ(2, map->pre_allocated_property_fields()); | 1251     DCHECK_EQ(2, map->pre_allocated_property_fields()); | 
| 1250     native_context()->set_aliased_arguments_map(*map); | 1252     native_context()->set_aliased_arguments_map(*map); | 
| 1251   } | 1253   } | 
| 1252 | 1254 | 
| 1253   {  // --- strict mode arguments map | 1255   {  // --- strict mode arguments map | 
| 1254     const PropertyAttributes attributes = | 1256     const PropertyAttributes attributes = | 
| 1255       static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY); | 1257       static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY); | 
| 1256 | 1258 | 
| 1257     // Create the ThrowTypeError functions. | 1259     // Create the ThrowTypeError functions. | 
| (...skipping 392 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1650   Handle<JSFunction> array_function = InstallFunction( | 1652   Handle<JSFunction> array_function = InstallFunction( | 
| 1651       builtins, name, JS_ARRAY_TYPE, JSArray::kSize, | 1653       builtins, name, JS_ARRAY_TYPE, JSArray::kSize, | 
| 1652       prototype, Builtins::kInternalArrayCode); | 1654       prototype, Builtins::kInternalArrayCode); | 
| 1653 | 1655 | 
| 1654   InternalArrayConstructorStub internal_array_constructor_stub(isolate()); | 1656   InternalArrayConstructorStub internal_array_constructor_stub(isolate()); | 
| 1655   Handle<Code> code = internal_array_constructor_stub.GetCode(); | 1657   Handle<Code> code = internal_array_constructor_stub.GetCode(); | 
| 1656   array_function->shared()->set_construct_stub(*code); | 1658   array_function->shared()->set_construct_stub(*code); | 
| 1657   array_function->shared()->DontAdaptArguments(); | 1659   array_function->shared()->DontAdaptArguments(); | 
| 1658 | 1660 | 
| 1659   Handle<Map> original_map(array_function->initial_map()); | 1661   Handle<Map> original_map(array_function->initial_map()); | 
| 1660   Handle<Map> initial_map = Map::Copy(original_map); | 1662   Handle<Map> initial_map = Map::Copy(original_map, "InternalArray"); | 
| 1661   initial_map->set_elements_kind(elements_kind); | 1663   initial_map->set_elements_kind(elements_kind); | 
| 1662   JSFunction::SetInitialMap(array_function, initial_map, prototype); | 1664   JSFunction::SetInitialMap(array_function, initial_map, prototype); | 
| 1663 | 1665 | 
| 1664   // Make "length" magic on instances. | 1666   // Make "length" magic on instances. | 
| 1665   Map::EnsureDescriptorSlack(initial_map, 1); | 1667   Map::EnsureDescriptorSlack(initial_map, 1); | 
| 1666 | 1668 | 
| 1667   PropertyAttributes attribs = static_cast<PropertyAttributes>( | 1669   PropertyAttributes attribs = static_cast<PropertyAttributes>( | 
| 1668       DONT_ENUM | DONT_DELETE); | 1670       DONT_ENUM | DONT_DELETE); | 
| 1669 | 1671 | 
| 1670   Handle<AccessorInfo> array_length = | 1672   Handle<AccessorInfo> array_length = | 
| (...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1928         InstallFunction(builtins, "GeneratorFunctionPrototype", | 1930         InstallFunction(builtins, "GeneratorFunctionPrototype", | 
| 1929                         JS_FUNCTION_TYPE, JSFunction::kHeaderSize, | 1931                         JS_FUNCTION_TYPE, JSFunction::kHeaderSize, | 
| 1930                         generator_object_prototype, Builtins::kIllegal); | 1932                         generator_object_prototype, Builtins::kIllegal); | 
| 1931     InstallFunction(builtins, "GeneratorFunction", JS_FUNCTION_TYPE, | 1933     InstallFunction(builtins, "GeneratorFunction", JS_FUNCTION_TYPE, | 
| 1932                     JSFunction::kSize, generator_function_prototype, | 1934                     JSFunction::kSize, generator_function_prototype, | 
| 1933                     Builtins::kIllegal); | 1935                     Builtins::kIllegal); | 
| 1934 | 1936 | 
| 1935     // Create maps for generator functions and their prototypes.  Store those | 1937     // Create maps for generator functions and their prototypes.  Store those | 
| 1936     // maps in the native context. | 1938     // maps in the native context. | 
| 1937     Handle<Map> generator_function_map = | 1939     Handle<Map> generator_function_map = | 
| 1938         Map::Copy(sloppy_function_map_writable_prototype_); | 1940         Map::Copy(sloppy_function_map_writable_prototype_, "GeneratorFunction"); | 
| 1939     generator_function_map->set_prototype(*generator_function_prototype); | 1941     generator_function_map->set_prototype(*generator_function_prototype); | 
| 1940     native_context()->set_sloppy_generator_function_map( | 1942     native_context()->set_sloppy_generator_function_map( | 
| 1941         *generator_function_map); | 1943         *generator_function_map); | 
| 1942 | 1944 | 
| 1943     // The "arguments" and "caller" instance properties aren't specified, so | 1945     // The "arguments" and "caller" instance properties aren't specified, so | 
| 1944     // technically we could leave them out.  They make even less sense for | 1946     // technically we could leave them out.  They make even less sense for | 
| 1945     // generators than for functions.  Still, the same argument that it makes | 1947     // generators than for functions.  Still, the same argument that it makes | 
| 1946     // sense to keep them around but poisoned in strict mode applies to | 1948     // sense to keep them around but poisoned in strict mode applies to | 
| 1947     // generators as well.  With poisoned accessors, naive callers can still | 1949     // generators as well.  With poisoned accessors, naive callers can still | 
| 1948     // iterate over the properties without accessing them. | 1950     // iterate over the properties without accessing them. | 
| (...skipping 10 matching lines...) Expand all  Loading... | 
| 1959         static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE); | 1961         static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE); | 
| 1960     Handle<JSFunction> poison_function = GetGeneratorPoisonFunction(); | 1962     Handle<JSFunction> poison_function = GetGeneratorPoisonFunction(); | 
| 1961     poison_pair->set_getter(*poison_function); | 1963     poison_pair->set_getter(*poison_function); | 
| 1962     poison_pair->set_setter(*poison_function); | 1964     poison_pair->set_setter(*poison_function); | 
| 1963     ReplaceAccessors(generator_function_map, factory()->arguments_string(), | 1965     ReplaceAccessors(generator_function_map, factory()->arguments_string(), | 
| 1964                      rw_attribs, poison_pair); | 1966                      rw_attribs, poison_pair); | 
| 1965     ReplaceAccessors(generator_function_map, factory()->caller_string(), | 1967     ReplaceAccessors(generator_function_map, factory()->caller_string(), | 
| 1966                      rw_attribs, poison_pair); | 1968                      rw_attribs, poison_pair); | 
| 1967 | 1969 | 
| 1968     Handle<Map> strict_function_map(native_context()->strict_function_map()); | 1970     Handle<Map> strict_function_map(native_context()->strict_function_map()); | 
| 1969     Handle<Map> strict_generator_function_map = Map::Copy(strict_function_map); | 1971     Handle<Map> strict_generator_function_map = | 
|  | 1972         Map::Copy(strict_function_map, "StrictGeneratorFunction"); | 
| 1970     // "arguments" and "caller" already poisoned. | 1973     // "arguments" and "caller" already poisoned. | 
| 1971     strict_generator_function_map->set_prototype(*generator_function_prototype); | 1974     strict_generator_function_map->set_prototype(*generator_function_prototype); | 
| 1972     native_context()->set_strict_generator_function_map( | 1975     native_context()->set_strict_generator_function_map( | 
| 1973         *strict_generator_function_map); | 1976         *strict_generator_function_map); | 
| 1974 | 1977 | 
| 1975     Handle<JSFunction> object_function(native_context()->object_function()); | 1978     Handle<JSFunction> object_function(native_context()->object_function()); | 
| 1976     Handle<Map> generator_object_prototype_map = Map::Create(isolate(), 0); | 1979     Handle<Map> generator_object_prototype_map = Map::Create(isolate(), 0); | 
| 1977     generator_object_prototype_map->set_prototype(*generator_object_prototype); | 1980     generator_object_prototype_map->set_prototype(*generator_object_prototype); | 
| 1978     native_context()->set_generator_object_prototype_map( | 1981     native_context()->set_generator_object_prototype_map( | 
| 1979         *generator_object_prototype_map); | 1982         *generator_object_prototype_map); | 
| (...skipping 725 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2705   if (isolate->initialized_from_snapshot()) { | 2708   if (isolate->initialized_from_snapshot()) { | 
| 2706     native_context_ = Snapshot::NewContextFromSnapshot(isolate); | 2709     native_context_ = Snapshot::NewContextFromSnapshot(isolate); | 
| 2707   } else { | 2710   } else { | 
| 2708     native_context_ = Handle<Context>(); | 2711     native_context_ = Handle<Context>(); | 
| 2709   } | 2712   } | 
| 2710 | 2713 | 
| 2711   if (!native_context().is_null()) { | 2714   if (!native_context().is_null()) { | 
| 2712     AddToWeakNativeContextList(*native_context()); | 2715     AddToWeakNativeContextList(*native_context()); | 
| 2713     isolate->set_context(*native_context()); | 2716     isolate->set_context(*native_context()); | 
| 2714     isolate->counters()->contexts_created_by_snapshot()->Increment(); | 2717     isolate->counters()->contexts_created_by_snapshot()->Increment(); | 
|  | 2718 #if TRACE_MAPS | 
|  | 2719     if (FLAG_trace_maps) { | 
|  | 2720       Handle<JSFunction> object_fun = isolate->object_function(); | 
|  | 2721       PrintF("[TraceMap: InitialMap map= %p SFI= %d_Object ]\n", | 
|  | 2722              reinterpret_cast<void*>(object_fun->initial_map()), | 
|  | 2723              object_fun->shared()->unique_id()); | 
|  | 2724       Map::TraceAllTransitions(object_fun->initial_map()); | 
|  | 2725     } | 
|  | 2726 #endif | 
| 2715     Handle<GlobalObject> global_object; | 2727     Handle<GlobalObject> global_object; | 
| 2716     Handle<JSGlobalProxy> global_proxy = CreateNewGlobals( | 2728     Handle<JSGlobalProxy> global_proxy = CreateNewGlobals( | 
| 2717         global_proxy_template, maybe_global_proxy, &global_object); | 2729         global_proxy_template, maybe_global_proxy, &global_object); | 
| 2718 | 2730 | 
| 2719     HookUpGlobalProxy(global_object, global_proxy); | 2731     HookUpGlobalProxy(global_object, global_proxy); | 
| 2720     HookUpGlobalObject(global_object); | 2732     HookUpGlobalObject(global_object); | 
| 2721     native_context()->builtins()->set_global_proxy( | 2733     native_context()->builtins()->set_global_proxy( | 
| 2722         native_context()->global_proxy()); | 2734         native_context()->global_proxy()); | 
| 2723 | 2735 | 
| 2724     if (!ConfigureGlobalObjects(global_proxy_template)) return; | 2736     if (!ConfigureGlobalObjects(global_proxy_template)) return; | 
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2810   return from + sizeof(NestingCounterType); | 2822   return from + sizeof(NestingCounterType); | 
| 2811 } | 2823 } | 
| 2812 | 2824 | 
| 2813 | 2825 | 
| 2814 // Called when the top-level V8 mutex is destroyed. | 2826 // Called when the top-level V8 mutex is destroyed. | 
| 2815 void Bootstrapper::FreeThreadResources() { | 2827 void Bootstrapper::FreeThreadResources() { | 
| 2816   DCHECK(!IsActive()); | 2828   DCHECK(!IsActive()); | 
| 2817 } | 2829 } | 
| 2818 | 2830 | 
| 2819 } }  // namespace v8::internal | 2831 } }  // namespace v8::internal | 
| OLD | NEW | 
|---|