| 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 "bootstrapper.h" | 5 #include "bootstrapper.h" |
| 6 | 6 |
| 7 #include "accessors.h" | 7 #include "accessors.h" |
| 8 #include "isolate-inl.h" | 8 #include "isolate-inl.h" |
| 9 #include "natives.h" | 9 #include "natives.h" |
| 10 #include "snapshot.h" | 10 #include "snapshot.h" |
| (...skipping 443 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 454 // The final map for functions. Writeable prototype. | 454 // The final map for functions. Writeable prototype. |
| 455 // This map is installed in MakeFunctionInstancePrototypeWritable. | 455 // This map is installed in MakeFunctionInstancePrototypeWritable. |
| 456 sloppy_function_map_writable_prototype_ = | 456 sloppy_function_map_writable_prototype_ = |
| 457 CreateFunctionMap(ADD_WRITEABLE_PROTOTYPE); | 457 CreateFunctionMap(ADD_WRITEABLE_PROTOTYPE); |
| 458 | 458 |
| 459 Factory* factory = isolate->factory(); | 459 Factory* factory = isolate->factory(); |
| 460 | 460 |
| 461 Handle<String> object_name = factory->Object_string(); | 461 Handle<String> object_name = factory->Object_string(); |
| 462 | 462 |
| 463 { // --- O b j e c t --- | 463 { // --- O b j e c t --- |
| 464 Handle<JSFunction> object_fun = factory->NewFunctionWithPrototype( | 464 Handle<JSFunction> object_fun = factory->NewFunction(object_name); |
| 465 object_name, factory->null_value()); | |
| 466 Handle<Map> object_function_map = | 465 Handle<Map> object_function_map = |
| 467 factory->NewMap(JS_OBJECT_TYPE, JSObject::kHeaderSize); | 466 factory->NewMap(JS_OBJECT_TYPE, JSObject::kHeaderSize); |
| 468 object_fun->set_initial_map(*object_function_map); | 467 object_fun->set_initial_map(*object_function_map); |
| 469 object_function_map->set_constructor(*object_fun); | 468 object_function_map->set_constructor(*object_fun); |
| 470 | 469 |
| 471 native_context()->set_object_function(*object_fun); | 470 native_context()->set_object_function(*object_fun); |
| 472 | 471 |
| 473 // Allocate a new prototype for the object function. | 472 // Allocate a new prototype for the object function. |
| 474 Handle<JSObject> prototype = factory->NewJSObject( | 473 Handle<JSObject> prototype = factory->NewJSObject( |
| 475 isolate->object_function(), | 474 isolate->object_function(), |
| 476 TENURED); | 475 TENURED); |
| 477 | 476 |
| 478 native_context()->set_initial_object_prototype(*prototype); | 477 native_context()->set_initial_object_prototype(*prototype); |
| 479 // For bootstrapping set the array prototype to be the same as the object | 478 // For bootstrapping set the array prototype to be the same as the object |
| 480 // prototype, otherwise the missing initial_array_prototype will cause | 479 // prototype, otherwise the missing initial_array_prototype will cause |
| 481 // assertions during startup. | 480 // assertions during startup. |
| 482 native_context()->set_initial_array_prototype(*prototype); | 481 native_context()->set_initial_array_prototype(*prototype); |
| 483 Accessors::FunctionSetPrototype(object_fun, prototype); | 482 Accessors::FunctionSetPrototype(object_fun, prototype); |
| 484 } | 483 } |
| 485 | 484 |
| 486 // Allocate the empty function as the prototype for function ECMAScript | 485 // Allocate the empty function as the prototype for function ECMAScript |
| 487 // 262 15.3.4. | 486 // 262 15.3.4. |
| 488 Handle<String> empty_string = | 487 Handle<String> empty_string = |
| 489 factory->InternalizeOneByteString(STATIC_ASCII_VECTOR("Empty")); | 488 factory->InternalizeOneByteString(STATIC_ASCII_VECTOR("Empty")); |
| 490 Handle<Code> code(isolate->builtins()->builtin(Builtins::kEmptyFunction)); | 489 Handle<Code> code(isolate->builtins()->builtin(Builtins::kEmptyFunction)); |
| 491 Handle<JSFunction> empty_function = factory->NewFunction(empty_string, code); | 490 Handle<JSFunction> empty_function = factory->NewFunction( |
| 491 empty_string, MaybeHandle<Object>(), code); |
| 492 | 492 |
| 493 // --- E m p t y --- | 493 // --- E m p t y --- |
| 494 Handle<String> source = factory->NewStringFromStaticAscii("() {}"); | 494 Handle<String> source = factory->NewStringFromStaticAscii("() {}"); |
| 495 Handle<Script> script = factory->NewScript(source); | 495 Handle<Script> script = factory->NewScript(source); |
| 496 script->set_type(Smi::FromInt(Script::TYPE_NATIVE)); | 496 script->set_type(Smi::FromInt(Script::TYPE_NATIVE)); |
| 497 empty_function->shared()->set_script(*script); | 497 empty_function->shared()->set_script(*script); |
| 498 empty_function->shared()->set_start_position(0); | 498 empty_function->shared()->set_start_position(0); |
| 499 empty_function->shared()->set_end_position(source->length()); | 499 empty_function->shared()->set_end_position(source->length()); |
| 500 empty_function->shared()->DontAdaptArguments(); | 500 empty_function->shared()->DontAdaptArguments(); |
| 501 | 501 |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 562 } | 562 } |
| 563 | 563 |
| 564 | 564 |
| 565 // ECMAScript 5th Edition, 13.2.3 | 565 // ECMAScript 5th Edition, 13.2.3 |
| 566 Handle<JSFunction> Genesis::GetThrowTypeErrorFunction() { | 566 Handle<JSFunction> Genesis::GetThrowTypeErrorFunction() { |
| 567 if (throw_type_error_function.is_null()) { | 567 if (throw_type_error_function.is_null()) { |
| 568 Handle<String> name = factory()->InternalizeOneByteString( | 568 Handle<String> name = factory()->InternalizeOneByteString( |
| 569 STATIC_ASCII_VECTOR("ThrowTypeError")); | 569 STATIC_ASCII_VECTOR("ThrowTypeError")); |
| 570 Handle<Code> code(isolate()->builtins()->builtin( | 570 Handle<Code> code(isolate()->builtins()->builtin( |
| 571 Builtins::kStrictModePoisonPill)); | 571 Builtins::kStrictModePoisonPill)); |
| 572 throw_type_error_function = factory()->NewFunction(name, code); | 572 throw_type_error_function = factory()->NewFunction( |
| 573 name, MaybeHandle<Object>(), code); |
| 573 throw_type_error_function->set_map(native_context()->sloppy_function_map()); | 574 throw_type_error_function->set_map(native_context()->sloppy_function_map()); |
| 574 throw_type_error_function->shared()->DontAdaptArguments(); | 575 throw_type_error_function->shared()->DontAdaptArguments(); |
| 575 | 576 |
| 576 JSObject::PreventExtensions(throw_type_error_function).Assert(); | 577 JSObject::PreventExtensions(throw_type_error_function).Assert(); |
| 577 } | 578 } |
| 578 return throw_type_error_function; | 579 return throw_type_error_function; |
| 579 } | 580 } |
| 580 | 581 |
| 581 | 582 |
| 582 Handle<Map> Genesis::CreateStrictFunctionMap( | 583 Handle<Map> Genesis::CreateStrictFunctionMap( |
| (...skipping 436 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1019 Smi::FromInt(0), | 1020 Smi::FromInt(0), |
| 1020 SKIP_WRITE_BARRIER); // It's a Smi. | 1021 SKIP_WRITE_BARRIER); // It's a Smi. |
| 1021 initial_map->set_prototype(*proto); | 1022 initial_map->set_prototype(*proto); |
| 1022 factory->SetRegExpIrregexpData(Handle<JSRegExp>::cast(proto), | 1023 factory->SetRegExpIrregexpData(Handle<JSRegExp>::cast(proto), |
| 1023 JSRegExp::IRREGEXP, factory->empty_string(), | 1024 JSRegExp::IRREGEXP, factory->empty_string(), |
| 1024 JSRegExp::Flags(0), 0); | 1025 JSRegExp::Flags(0), 0); |
| 1025 } | 1026 } |
| 1026 | 1027 |
| 1027 { // -- J S O N | 1028 { // -- J S O N |
| 1028 Handle<String> name = factory->InternalizeUtf8String("JSON"); | 1029 Handle<String> name = factory->InternalizeUtf8String("JSON"); |
| 1029 Handle<JSFunction> cons = factory->NewFunctionWithPrototype( | 1030 Handle<JSFunction> cons = factory->NewFunction(name); |
| 1030 name, factory->the_hole_value()); | |
| 1031 JSFunction::SetInstancePrototype(cons, | 1031 JSFunction::SetInstancePrototype(cons, |
| 1032 Handle<Object>(native_context()->initial_object_prototype(), isolate)); | 1032 Handle<Object>(native_context()->initial_object_prototype(), isolate)); |
| 1033 cons->SetInstanceClassName(*name); | 1033 cons->SetInstanceClassName(*name); |
| 1034 Handle<JSObject> json_object = factory->NewJSObject(cons, TENURED); | 1034 Handle<JSObject> json_object = factory->NewJSObject(cons, TENURED); |
| 1035 ASSERT(json_object->IsJSObject()); | 1035 ASSERT(json_object->IsJSObject()); |
| 1036 JSObject::SetLocalPropertyIgnoreAttributes( | 1036 JSObject::SetLocalPropertyIgnoreAttributes( |
| 1037 global, name, json_object, DONT_ENUM).Check(); | 1037 global, name, json_object, DONT_ENUM).Check(); |
| 1038 native_context()->set_json_object(*json_object); | 1038 native_context()->set_json_object(*json_object); |
| 1039 } | 1039 } |
| 1040 | 1040 |
| (...skipping 622 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1663 Handle<String> builtins_string = | 1663 Handle<String> builtins_string = |
| 1664 factory()->InternalizeOneByteString(STATIC_ASCII_VECTOR("builtins")); | 1664 factory()->InternalizeOneByteString(STATIC_ASCII_VECTOR("builtins")); |
| 1665 JSObject::SetLocalPropertyIgnoreAttributes( | 1665 JSObject::SetLocalPropertyIgnoreAttributes( |
| 1666 builtins, builtins_string, builtins, attributes).Check(); | 1666 builtins, builtins_string, builtins, attributes).Check(); |
| 1667 | 1667 |
| 1668 // Set up the reference from the global object to the builtins object. | 1668 // Set up the reference from the global object to the builtins object. |
| 1669 JSGlobalObject::cast(native_context()->global_object())-> | 1669 JSGlobalObject::cast(native_context()->global_object())-> |
| 1670 set_builtins(*builtins); | 1670 set_builtins(*builtins); |
| 1671 | 1671 |
| 1672 // Create a bridge function that has context in the native context. | 1672 // Create a bridge function that has context in the native context. |
| 1673 Handle<JSFunction> bridge = factory()->NewFunctionWithPrototype( | 1673 Handle<JSFunction> bridge = factory()->NewFunction(factory()->empty_string()); |
| 1674 factory()->empty_string(), factory()->undefined_value()); | |
| 1675 ASSERT(bridge->context() == *isolate()->native_context()); | 1674 ASSERT(bridge->context() == *isolate()->native_context()); |
| 1676 | 1675 |
| 1677 // Allocate the builtins context. | 1676 // Allocate the builtins context. |
| 1678 Handle<Context> context = | 1677 Handle<Context> context = |
| 1679 factory()->NewFunctionContext(Context::MIN_CONTEXT_SLOTS, bridge); | 1678 factory()->NewFunctionContext(Context::MIN_CONTEXT_SLOTS, bridge); |
| 1680 context->set_global_object(*builtins); // override builtins global object | 1679 context->set_global_object(*builtins); // override builtins global object |
| 1681 | 1680 |
| 1682 native_context()->set_runtime_context(*context); | 1681 native_context()->set_runtime_context(*context); |
| 1683 | 1682 |
| 1684 { // -- S c r i p t | 1683 { // -- S c r i p t |
| (...skipping 988 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2673 return from + sizeof(NestingCounterType); | 2672 return from + sizeof(NestingCounterType); |
| 2674 } | 2673 } |
| 2675 | 2674 |
| 2676 | 2675 |
| 2677 // Called when the top-level V8 mutex is destroyed. | 2676 // Called when the top-level V8 mutex is destroyed. |
| 2678 void Bootstrapper::FreeThreadResources() { | 2677 void Bootstrapper::FreeThreadResources() { |
| 2679 ASSERT(!IsActive()); | 2678 ASSERT(!IsActive()); |
| 2680 } | 2679 } |
| 2681 | 2680 |
| 2682 } } // namespace v8::internal | 2681 } } // namespace v8::internal |
| OLD | NEW |