Chromium Code Reviews| Index: src/bootstrapper.cc |
| diff --git a/src/bootstrapper.cc b/src/bootstrapper.cc |
| index a30ffc015ccc53b0b9ac5ba83f3c95df93bc1acb..245dc91a68ae855718d6ba60b33239b376814bfd 100644 |
| --- a/src/bootstrapper.cc |
| +++ b/src/bootstrapper.cc |
| @@ -141,7 +141,8 @@ void Bootstrapper::TearDown() { |
| class Genesis BASE_EMBEDDED { |
| public: |
| - Genesis(Handle<Object> global_object, |
| + Genesis(Isolate* isolate, |
| + Handle<Object> global_object, |
| v8::Handle<v8::ObjectTemplate> global_template, |
| v8::ExtensionConfiguration* extensions); |
| ~Genesis() { } |
| @@ -150,8 +151,12 @@ class Genesis BASE_EMBEDDED { |
| Genesis* previous() { return previous_; } |
| + Isolate* isolate() const { return isolate_; } |
| + Factory* factory() const { return isolate_->factory(); } |
| + Heap* heap() const { return isolate_->heap(); } |
| private: |
|
Mads Ager (chromium)
2011/04/06 07:34:15
Could you leave a blank line before the private se
|
| Handle<Context> global_context_; |
| + Isolate* isolate_; |
| // There may be more than one active genesis object: When GC is |
| // triggered during environment creation there may be weak handle |
| @@ -163,7 +168,7 @@ class Genesis BASE_EMBEDDED { |
| // Creates some basic objects. Used for creating a context from scratch. |
| void CreateRoots(); |
| // Creates the empty function. Used for creating a context from scratch. |
| - Handle<JSFunction> CreateEmptyFunction(); |
| + Handle<JSFunction> CreateEmptyFunction(Isolate* isolate); |
| // Creates the ThrowTypeError function. ECMA 5th Ed. 13.2.3 |
| Handle<JSFunction> CreateThrowTypeErrorFunction(Builtins::Name builtin); |
| @@ -239,7 +244,7 @@ class Genesis BASE_EMBEDDED { |
| Handle<FixedArray> arguments, |
| Handle<FixedArray> caller); |
| - static bool CompileBuiltin(int index); |
| + static bool CompileBuiltin(Isolate* isolate, int index); |
| static bool CompileNative(Vector<const char> name, Handle<String> source); |
| static bool CompileScriptCached(Vector<const char> name, |
| Handle<String> source, |
| @@ -269,12 +274,13 @@ void Bootstrapper::Iterate(ObjectVisitor* v) { |
| Handle<Context> Bootstrapper::CreateEnvironment( |
| + Isolate* isolate, |
| Handle<Object> global_object, |
| v8::Handle<v8::ObjectTemplate> global_template, |
| v8::ExtensionConfiguration* extensions) { |
| HandleScope scope; |
| Handle<Context> env; |
| - Genesis genesis(global_object, global_template, extensions); |
| + Genesis genesis(isolate, global_object, global_template, extensions); |
| env = genesis.result(); |
| if (!env.is_null()) { |
| if (InstallExtensions(env, extensions)) { |
| @@ -287,15 +293,16 @@ Handle<Context> Bootstrapper::CreateEnvironment( |
| static void SetObjectPrototype(Handle<JSObject> object, Handle<Object> proto) { |
| // object.__proto__ = proto; |
| + Factory* factory = object->GetIsolate()->factory(); |
| Handle<Map> old_to_map = Handle<Map>(object->map()); |
| - Handle<Map> new_to_map = FACTORY->CopyMapDropTransitions(old_to_map); |
| + Handle<Map> new_to_map = factory->CopyMapDropTransitions(old_to_map); |
| new_to_map->set_prototype(*proto); |
| object->set_map(*new_to_map); |
| } |
| void Bootstrapper::DetachGlobal(Handle<Context> env) { |
| - Factory* factory = Isolate::Current()->factory(); |
| + Factory* factory = env->GetIsolate()->factory(); |
| JSGlobalProxy::cast(env->global_proxy())->set_context(*factory->null_value()); |
| SetObjectPrototype(Handle<JSObject>(env->global_proxy()), |
| factory->null_value()); |
| @@ -322,7 +329,7 @@ static Handle<JSFunction> InstallFunction(Handle<JSObject> target, |
| Handle<JSObject> prototype, |
| Builtins::Name call, |
| bool is_ecma_native) { |
| - Isolate* isolate = Isolate::Current(); |
| + Isolate* isolate = target->GetIsolate(); |
| Factory* factory = isolate->factory(); |
| Handle<String> symbol = factory->LookupAsciiSymbol(name); |
| Handle<Code> call_code = Handle<Code>(isolate->builtins()->builtin(call)); |
| @@ -344,30 +351,29 @@ static Handle<JSFunction> InstallFunction(Handle<JSObject> target, |
| Handle<DescriptorArray> Genesis::ComputeFunctionInstanceDescriptor( |
| PrototypePropertyMode prototypeMode) { |
| - Factory* factory = Isolate::Current()->factory(); |
| Handle<DescriptorArray> descriptors = |
| - factory->NewDescriptorArray(prototypeMode == DONT_ADD_PROTOTYPE ? 4 : 5); |
| + factory()->NewDescriptorArray(prototypeMode == DONT_ADD_PROTOTYPE ? 4 : 5); |
| PropertyAttributes attributes = |
| static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY); |
| { // Add length. |
| - Handle<Proxy> proxy = factory->NewProxy(&Accessors::FunctionLength); |
| - CallbacksDescriptor d(*factory->length_symbol(), *proxy, attributes); |
| + Handle<Proxy> proxy = factory()->NewProxy(&Accessors::FunctionLength); |
| + CallbacksDescriptor d(*factory()->length_symbol(), *proxy, attributes); |
| descriptors->Set(0, &d); |
| } |
| { // Add name. |
| - Handle<Proxy> proxy = factory->NewProxy(&Accessors::FunctionName); |
| - CallbacksDescriptor d(*factory->name_symbol(), *proxy, attributes); |
| + Handle<Proxy> proxy = factory()->NewProxy(&Accessors::FunctionName); |
| + CallbacksDescriptor d(*factory()->name_symbol(), *proxy, attributes); |
| descriptors->Set(1, &d); |
| } |
| { // Add arguments. |
| - Handle<Proxy> proxy = factory->NewProxy(&Accessors::FunctionArguments); |
| - CallbacksDescriptor d(*factory->arguments_symbol(), *proxy, attributes); |
| + Handle<Proxy> proxy = factory()->NewProxy(&Accessors::FunctionArguments); |
| + CallbacksDescriptor d(*factory()->arguments_symbol(), *proxy, attributes); |
| descriptors->Set(2, &d); |
| } |
| { // Add caller. |
| - Handle<Proxy> proxy = factory->NewProxy(&Accessors::FunctionCaller); |
| - CallbacksDescriptor d(*factory->caller_symbol(), *proxy, attributes); |
| + Handle<Proxy> proxy = factory()->NewProxy(&Accessors::FunctionCaller); |
| + CallbacksDescriptor d(*factory()->caller_symbol(), *proxy, attributes); |
| descriptors->Set(3, &d); |
| } |
| if (prototypeMode != DONT_ADD_PROTOTYPE) { |
| @@ -375,8 +381,8 @@ Handle<DescriptorArray> Genesis::ComputeFunctionInstanceDescriptor( |
| if (prototypeMode == ADD_WRITEABLE_PROTOTYPE) { |
| attributes = static_cast<PropertyAttributes>(attributes & ~READ_ONLY); |
| } |
| - Handle<Proxy> proxy = factory->NewProxy(&Accessors::FunctionPrototype); |
| - CallbacksDescriptor d(*factory->prototype_symbol(), *proxy, attributes); |
| + Handle<Proxy> proxy = factory()->NewProxy(&Accessors::FunctionPrototype); |
| + CallbacksDescriptor d(*factory()->prototype_symbol(), *proxy, attributes); |
| descriptors->Set(4, &d); |
| } |
| descriptors->Sort(); |
| @@ -385,7 +391,7 @@ Handle<DescriptorArray> Genesis::ComputeFunctionInstanceDescriptor( |
| Handle<Map> Genesis::CreateFunctionMap(PrototypePropertyMode prototype_mode) { |
| - Handle<Map> map = FACTORY->NewMap(JS_FUNCTION_TYPE, JSFunction::kSize); |
| + Handle<Map> map = factory()->NewMap(JS_FUNCTION_TYPE, JSFunction::kSize); |
| Handle<DescriptorArray> descriptors = |
| ComputeFunctionInstanceDescriptor(prototype_mode); |
| map->set_instance_descriptors(*descriptors); |
| @@ -394,7 +400,7 @@ Handle<Map> Genesis::CreateFunctionMap(PrototypePropertyMode prototype_mode) { |
| } |
| -Handle<JSFunction> Genesis::CreateEmptyFunction() { |
| +Handle<JSFunction> Genesis::CreateEmptyFunction(Isolate* isolate) { |
| // Allocate the map for function instances. Maps are allocated first and their |
| // prototypes patched later, once empty function is created. |
| @@ -422,7 +428,6 @@ Handle<JSFunction> Genesis::CreateEmptyFunction() { |
| function_instance_map_writable_prototype_ = |
| CreateFunctionMap(ADD_WRITEABLE_PROTOTYPE); |
| - Isolate* isolate = Isolate::Current(); |
| Factory* factory = isolate->factory(); |
| Heap* heap = isolate->heap(); |
| @@ -491,28 +496,29 @@ Handle<DescriptorArray> Genesis::ComputeStrictFunctionInstanceDescriptor( |
| PrototypePropertyMode prototypeMode, |
| Handle<FixedArray> arguments, |
| Handle<FixedArray> caller) { |
| - Factory* factory = Isolate::Current()->factory(); |
| Handle<DescriptorArray> descriptors = |
| - factory->NewDescriptorArray(prototypeMode == DONT_ADD_PROTOTYPE ? 4 : 5); |
| + factory()->NewDescriptorArray(prototypeMode == DONT_ADD_PROTOTYPE ? 4 : 5); |
| PropertyAttributes attributes = static_cast<PropertyAttributes>( |
| DONT_ENUM | DONT_DELETE | READ_ONLY); |
| { // length |
| - Handle<Proxy> proxy = factory->NewProxy(&Accessors::FunctionLength); |
| - CallbacksDescriptor d(*factory->length_symbol(), *proxy, attributes); |
| + Handle<Proxy> proxy = factory()->NewProxy(&Accessors::FunctionLength); |
| + CallbacksDescriptor d(*factory()->length_symbol(), *proxy, attributes); |
| descriptors->Set(0, &d); |
| } |
| { // name |
| - Handle<Proxy> proxy = factory->NewProxy(&Accessors::FunctionName); |
| - CallbacksDescriptor d(*factory->name_symbol(), *proxy, attributes); |
| + Handle<Proxy> proxy = factory()->NewProxy(&Accessors::FunctionName); |
| + CallbacksDescriptor d(*factory()->name_symbol(), *proxy, attributes); |
| descriptors->Set(1, &d); |
| } |
| { // arguments |
| - CallbacksDescriptor d(*factory->arguments_symbol(), *arguments, attributes); |
| + CallbacksDescriptor d(*factory()->arguments_symbol(), |
| + *arguments, |
| + attributes); |
| descriptors->Set(2, &d); |
| } |
| { // caller |
| - CallbacksDescriptor d(*factory->caller_symbol(), *caller, attributes); |
| + CallbacksDescriptor d(*factory()->caller_symbol(), *caller, attributes); |
| descriptors->Set(3, &d); |
| } |
| @@ -521,8 +527,8 @@ Handle<DescriptorArray> Genesis::ComputeStrictFunctionInstanceDescriptor( |
| if (prototypeMode == ADD_WRITEABLE_PROTOTYPE) { |
| attributes = static_cast<PropertyAttributes>(attributes & ~READ_ONLY); |
| } |
| - Handle<Proxy> proxy = factory->NewProxy(&Accessors::FunctionPrototype); |
| - CallbacksDescriptor d(*factory->prototype_symbol(), *proxy, attributes); |
| + Handle<Proxy> proxy = factory()->NewProxy(&Accessors::FunctionPrototype); |
| + CallbacksDescriptor d(*factory()->prototype_symbol(), *proxy, attributes); |
| descriptors->Set(4, &d); |
| } |
| @@ -534,14 +540,11 @@ Handle<DescriptorArray> Genesis::ComputeStrictFunctionInstanceDescriptor( |
| // ECMAScript 5th Edition, 13.2.3 |
| Handle<JSFunction> Genesis::CreateThrowTypeErrorFunction( |
| Builtins::Name builtin) { |
| - Isolate* isolate = Isolate::Current(); |
| - Factory* factory = isolate->factory(); |
| - |
| - Handle<String> name = factory->LookupAsciiSymbol("ThrowTypeError"); |
| + Handle<String> name = factory()->LookupAsciiSymbol("ThrowTypeError"); |
| Handle<JSFunction> throw_type_error = |
| - factory->NewFunctionWithoutPrototype(name, kStrictMode); |
| + factory()->NewFunctionWithoutPrototype(name, kStrictMode); |
| Handle<Code> code = Handle<Code>( |
| - isolate->builtins()->builtin(builtin)); |
| + isolate()->builtins()->builtin(builtin)); |
| throw_type_error->set_map(global_context()->strict_mode_function_map()); |
| throw_type_error->set_code(*code); |
| @@ -559,7 +562,7 @@ Handle<Map> Genesis::CreateStrictModeFunctionMap( |
| Handle<JSFunction> empty_function, |
| Handle<FixedArray> arguments_callbacks, |
| Handle<FixedArray> caller_callbacks) { |
| - Handle<Map> map = FACTORY->NewMap(JS_FUNCTION_TYPE, JSFunction::kSize); |
| + Handle<Map> map = factory()->NewMap(JS_FUNCTION_TYPE, JSFunction::kSize); |
| Handle<DescriptorArray> descriptors = |
| ComputeStrictFunctionInstanceDescriptor(prototype_mode, |
| arguments_callbacks, |
| @@ -574,7 +577,7 @@ Handle<Map> Genesis::CreateStrictModeFunctionMap( |
| void Genesis::CreateStrictModeFunctionMaps(Handle<JSFunction> empty) { |
| // Create the callbacks arrays for ThrowTypeError functions. |
| // The get/set callacks are filled in after the maps are created below. |
| - Factory* factory = Isolate::Current()->factory(); |
| + Factory* factory = empty->GetIsolate()->factory(); |
| Handle<FixedArray> arguments = factory->NewFixedArray(2, TENURED); |
| Handle<FixedArray> caller = factory->NewFixedArray(2, TENURED); |
| @@ -623,7 +626,7 @@ void Genesis::CreateStrictModeFunctionMaps(Handle<JSFunction> empty) { |
| static void AddToWeakGlobalContextList(Context* context) { |
| ASSERT(context->IsGlobalContext()); |
| - Heap* heap = Isolate::Current()->heap(); |
| + Heap* heap = context->GetIsolate()->heap(); |
| #ifdef DEBUG |
| { // NOLINT |
| ASSERT(context->get(Context::NEXT_CONTEXT_LINK)->IsUndefined()); |
| @@ -641,15 +644,14 @@ static void AddToWeakGlobalContextList(Context* context) { |
| void Genesis::CreateRoots() { |
| - Isolate* isolate = Isolate::Current(); |
| // Allocate the global context FixedArray first and then patch the |
| // closure and extension object later (we need the empty function |
| // and the global object, but in order to create those, we need the |
| // global context). |
| - global_context_ = Handle<Context>::cast(isolate->global_handles()->Create( |
| - *isolate->factory()->NewGlobalContext())); |
| + global_context_ = Handle<Context>::cast(isolate()->global_handles()->Create( |
| + *factory()->NewGlobalContext())); |
| AddToWeakGlobalContextList(*global_context_); |
| - isolate->set_context(*global_context()); |
| + isolate()->set_context(*global_context()); |
| // Allocate the message listeners object. |
| { |
| @@ -692,16 +694,12 @@ Handle<JSGlobalProxy> Genesis::CreateNewGlobals( |
| } |
| } |
| - Isolate* isolate = Isolate::Current(); |
| - Factory* factory = isolate->factory(); |
| - Heap* heap = isolate->heap(); |
| - |
| if (js_global_template.is_null()) { |
| - Handle<String> name = Handle<String>(heap->empty_symbol()); |
| - Handle<Code> code = Handle<Code>(isolate->builtins()->builtin( |
| + Handle<String> name = Handle<String>(heap()->empty_symbol()); |
| + Handle<Code> code = Handle<Code>(isolate()->builtins()->builtin( |
| Builtins::kIllegal)); |
| js_global_function = |
| - factory->NewFunction(name, JS_GLOBAL_OBJECT_TYPE, |
| + factory()->NewFunction(name, JS_GLOBAL_OBJECT_TYPE, |
| JSGlobalObject::kSize, code, true); |
|
Mads Ager (chromium)
2011/04/06 07:34:15
Indentation is off.
|
| // Change the constructor property of the prototype of the |
| // hidden global function to refer to the Object function. |
| @@ -710,20 +708,20 @@ Handle<JSGlobalProxy> Genesis::CreateNewGlobals( |
| JSObject::cast(js_global_function->instance_prototype())); |
| SetLocalPropertyNoThrow( |
| prototype, |
| - factory->constructor_symbol(), |
| - isolate->object_function(), |
| + factory()->constructor_symbol(), |
| + isolate()->object_function(), |
| NONE); |
| } else { |
| Handle<FunctionTemplateInfo> js_global_constructor( |
| FunctionTemplateInfo::cast(js_global_template->constructor())); |
| js_global_function = |
| - factory->CreateApiFunction(js_global_constructor, |
| - factory->InnerGlobalObject); |
| + factory()->CreateApiFunction(js_global_constructor, |
| + factory()->InnerGlobalObject); |
| } |
| js_global_function->initial_map()->set_is_hidden_prototype(); |
| Handle<GlobalObject> inner_global = |
| - factory->NewGlobalObject(js_global_function); |
| + factory()->NewGlobalObject(js_global_function); |
| if (inner_global_out != NULL) { |
| *inner_global_out = inner_global; |
| } |
| @@ -731,23 +729,23 @@ Handle<JSGlobalProxy> Genesis::CreateNewGlobals( |
| // Step 2: create or re-initialize the global proxy object. |
| Handle<JSFunction> global_proxy_function; |
| if (global_template.IsEmpty()) { |
| - Handle<String> name = Handle<String>(heap->empty_symbol()); |
| - Handle<Code> code = Handle<Code>(isolate->builtins()->builtin( |
| + Handle<String> name = Handle<String>(heap()->empty_symbol()); |
| + Handle<Code> code = Handle<Code>(isolate()->builtins()->builtin( |
| Builtins::kIllegal)); |
| global_proxy_function = |
| - factory->NewFunction(name, JS_GLOBAL_PROXY_TYPE, |
| - JSGlobalProxy::kSize, code, true); |
| + factory()->NewFunction(name, JS_GLOBAL_PROXY_TYPE, |
| + JSGlobalProxy::kSize, code, true); |
| } else { |
| Handle<ObjectTemplateInfo> data = |
| v8::Utils::OpenHandle(*global_template); |
| Handle<FunctionTemplateInfo> global_constructor( |
| FunctionTemplateInfo::cast(data->constructor())); |
| global_proxy_function = |
| - factory->CreateApiFunction(global_constructor, |
| - factory->OuterGlobalObject); |
| + factory()->CreateApiFunction(global_constructor, |
| + factory()->OuterGlobalObject); |
| } |
| - Handle<String> global_name = factory->LookupAsciiSymbol("global"); |
| + Handle<String> global_name = factory()->LookupAsciiSymbol("global"); |
| global_proxy_function->shared()->set_instance_class_name(*global_name); |
| global_proxy_function->initial_map()->set_is_access_check_needed(true); |
| @@ -761,7 +759,7 @@ Handle<JSGlobalProxy> Genesis::CreateNewGlobals( |
| Handle<JSGlobalProxy>::cast(global_object)); |
| } else { |
| return Handle<JSGlobalProxy>::cast( |
| - factory->NewJSObject(global_proxy_function, TENURED)); |
| + factory()->NewJSObject(global_proxy_function, TENURED)); |
| } |
| } |
| @@ -786,7 +784,7 @@ void Genesis::HookUpInnerGlobal(Handle<GlobalObject> inner_global) { |
| static const PropertyAttributes attributes = |
| static_cast<PropertyAttributes>(READ_ONLY | DONT_DELETE); |
| ForceSetProperty(builtins_global, |
| - FACTORY->LookupAsciiSymbol("global"), |
| + factory()->LookupAsciiSymbol("global"), |
| inner_global, |
| attributes); |
| // Setup the reference from the global object to the builtins object. |
| @@ -814,7 +812,7 @@ void Genesis::InitializeGlobal(Handle<GlobalObject> inner_global, |
| // object reinitialization. |
| global_context()->set_security_token(*inner_global); |
| - Isolate* isolate = Isolate::Current(); |
| + Isolate* isolate = inner_global->GetIsolate(); |
| Factory* factory = isolate->factory(); |
| Heap* heap = isolate->heap(); |
| @@ -1164,17 +1162,17 @@ void Genesis::InitializeGlobal(Handle<GlobalObject> inner_global, |
| } |
| -bool Genesis::CompileBuiltin(int index) { |
| +bool Genesis::CompileBuiltin(Isolate* isolate, int index) { |
| Vector<const char> name = Natives::GetScriptName(index); |
| Handle<String> source_code = |
| - Isolate::Current()->bootstrapper()->NativesSourceLookup(index); |
| + isolate->bootstrapper()->NativesSourceLookup(index); |
| return CompileNative(name, source_code); |
| } |
| bool Genesis::CompileNative(Vector<const char> name, Handle<String> source) { |
| HandleScope scope; |
| - Isolate* isolate = Isolate::Current(); |
| + Isolate* isolate = source->GetIsolate(); |
| #ifdef ENABLE_DEBUGGER_SUPPORT |
| isolate->debugger()->set_compiling_natives(true); |
| #endif |
| @@ -1199,7 +1197,7 @@ bool Genesis::CompileScriptCached(Vector<const char> name, |
| v8::Extension* extension, |
| Handle<Context> top_context, |
| bool use_runtime_context) { |
| - Factory* factory = Isolate::Current()->factory(); |
| + Factory* factory = source->GetIsolate()->factory(); |
| HandleScope scope; |
| Handle<SharedFunctionInfo> function_info; |
| @@ -1247,14 +1245,13 @@ bool Genesis::CompileScriptCached(Vector<const char> name, |
| #define INSTALL_NATIVE(Type, name, var) \ |
| - Handle<String> var##_name = factory->LookupAsciiSymbol(name); \ |
| + Handle<String> var##_name = factory()->LookupAsciiSymbol(name); \ |
| Object* var##_native = \ |
| global_context()->builtins()->GetPropertyNoExceptionThrown(*var##_name); \ |
| global_context()->set_##var(Type::cast(var##_native)); |
| void Genesis::InstallNativeFunctions() { |
| - Factory* factory = Isolate::Current()->factory(); |
| HandleScope scope; |
| INSTALL_NATIVE(JSFunction, "CreateDate", create_date_fun); |
| INSTALL_NATIVE(JSFunction, "ToNumber", to_number_fun); |
| @@ -1277,25 +1274,23 @@ void Genesis::InstallNativeFunctions() { |
| bool Genesis::InstallNatives() { |
| HandleScope scope; |
| - Isolate* isolate = Isolate::Current(); |
| - Factory* factory = isolate->factory(); |
| - Heap* heap = isolate->heap(); |
| // Create a function for the builtins object. Allocate space for the |
| // JavaScript builtins, a reference to the builtins object |
| // (itself) and a reference to the global_context directly in the object. |
| Handle<Code> code = Handle<Code>( |
| - isolate->builtins()->builtin(Builtins::kIllegal)); |
| + isolate()->builtins()->builtin(Builtins::kIllegal)); |
| Handle<JSFunction> builtins_fun = |
| - factory->NewFunction(factory->empty_symbol(), JS_BUILTINS_OBJECT_TYPE, |
| - JSBuiltinsObject::kSize, code, true); |
| + factory()->NewFunction(factory()->empty_symbol(), |
| + JS_BUILTINS_OBJECT_TYPE, |
| + JSBuiltinsObject::kSize, code, true); |
| - Handle<String> name = factory->LookupAsciiSymbol("builtins"); |
| + Handle<String> name = factory()->LookupAsciiSymbol("builtins"); |
| builtins_fun->shared()->set_instance_class_name(*name); |
| // Allocate the builtins object. |
| Handle<JSBuiltinsObject> builtins = |
| - Handle<JSBuiltinsObject>::cast(factory->NewGlobalObject(builtins_fun)); |
| + Handle<JSBuiltinsObject>::cast(factory()->NewGlobalObject(builtins_fun)); |
| builtins->set_builtins(*builtins); |
| builtins->set_global_context(*global_context()); |
| builtins->set_global_receiver(*builtins); |
| @@ -1306,7 +1301,7 @@ bool Genesis::InstallNatives() { |
| // global object. |
| static const PropertyAttributes attributes = |
| static_cast<PropertyAttributes>(READ_ONLY | DONT_DELETE); |
| - Handle<String> global_symbol = factory->LookupAsciiSymbol("global"); |
| + Handle<String> global_symbol = factory()->LookupAsciiSymbol("global"); |
| Handle<Object> global_obj(global_context()->global()); |
| SetLocalPropertyNoThrow(builtins, global_symbol, global_obj, attributes); |
| @@ -1315,12 +1310,12 @@ bool Genesis::InstallNatives() { |
| // Create a bridge function that has context in the global context. |
| Handle<JSFunction> bridge = |
| - factory->NewFunction(factory->empty_symbol(), factory->undefined_value()); |
| - ASSERT(bridge->context() == *isolate->global_context()); |
| + factory()->NewFunction(factory()->empty_symbol(), factory()->undefined_value()); |
|
Mads Ager (chromium)
2011/04/06 07:34:15
Line too long.
|
| + ASSERT(bridge->context() == *isolate()->global_context()); |
| // Allocate the builtins context. |
| Handle<Context> context = |
| - factory->NewFunctionContext(Context::MIN_CONTEXT_SLOTS, bridge); |
| + factory()->NewFunctionContext(Context::MIN_CONTEXT_SLOTS, bridge); |
| context->set_global(*builtins); // override builtins global object |
| global_context()->set_runtime_context(*context); |
| @@ -1329,113 +1324,113 @@ bool Genesis::InstallNatives() { |
| // Builtin functions for Script. |
| Handle<JSFunction> script_fun = |
| InstallFunction(builtins, "Script", JS_VALUE_TYPE, JSValue::kSize, |
| - isolate->initial_object_prototype(), |
| + isolate()->initial_object_prototype(), |
| Builtins::kIllegal, false); |
| Handle<JSObject> prototype = |
| - factory->NewJSObject(isolate->object_function(), TENURED); |
| + factory()->NewJSObject(isolate()->object_function(), TENURED); |
| SetPrototype(script_fun, prototype); |
| global_context()->set_script_function(*script_fun); |
| // Add 'source' and 'data' property to scripts. |
| PropertyAttributes common_attributes = |
| static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY); |
| - Handle<Proxy> proxy_source = factory->NewProxy(&Accessors::ScriptSource); |
| + Handle<Proxy> proxy_source = factory()->NewProxy(&Accessors::ScriptSource); |
| Handle<DescriptorArray> script_descriptors = |
| - factory->CopyAppendProxyDescriptor( |
| - factory->empty_descriptor_array(), |
| - factory->LookupAsciiSymbol("source"), |
| + factory()->CopyAppendProxyDescriptor( |
| + factory()->empty_descriptor_array(), |
| + factory()->LookupAsciiSymbol("source"), |
| proxy_source, |
| common_attributes); |
| - Handle<Proxy> proxy_name = factory->NewProxy(&Accessors::ScriptName); |
| + Handle<Proxy> proxy_name = factory()->NewProxy(&Accessors::ScriptName); |
| script_descriptors = |
| - factory->CopyAppendProxyDescriptor( |
| + factory()->CopyAppendProxyDescriptor( |
| script_descriptors, |
| - factory->LookupAsciiSymbol("name"), |
| + factory()->LookupAsciiSymbol("name"), |
| proxy_name, |
| common_attributes); |
| - Handle<Proxy> proxy_id = factory->NewProxy(&Accessors::ScriptId); |
| + Handle<Proxy> proxy_id = factory()->NewProxy(&Accessors::ScriptId); |
| script_descriptors = |
| - factory->CopyAppendProxyDescriptor( |
| + factory()->CopyAppendProxyDescriptor( |
| script_descriptors, |
| - factory->LookupAsciiSymbol("id"), |
| + factory()->LookupAsciiSymbol("id"), |
| proxy_id, |
| common_attributes); |
| Handle<Proxy> proxy_line_offset = |
| - factory->NewProxy(&Accessors::ScriptLineOffset); |
| + factory()->NewProxy(&Accessors::ScriptLineOffset); |
| script_descriptors = |
| - factory->CopyAppendProxyDescriptor( |
| + factory()->CopyAppendProxyDescriptor( |
| script_descriptors, |
| - factory->LookupAsciiSymbol("line_offset"), |
| + factory()->LookupAsciiSymbol("line_offset"), |
| proxy_line_offset, |
| common_attributes); |
| Handle<Proxy> proxy_column_offset = |
| - factory->NewProxy(&Accessors::ScriptColumnOffset); |
| + factory()->NewProxy(&Accessors::ScriptColumnOffset); |
| script_descriptors = |
| - factory->CopyAppendProxyDescriptor( |
| + factory()->CopyAppendProxyDescriptor( |
| script_descriptors, |
| - factory->LookupAsciiSymbol("column_offset"), |
| + factory()->LookupAsciiSymbol("column_offset"), |
| proxy_column_offset, |
| common_attributes); |
| - Handle<Proxy> proxy_data = factory->NewProxy(&Accessors::ScriptData); |
| + Handle<Proxy> proxy_data = factory()->NewProxy(&Accessors::ScriptData); |
| script_descriptors = |
| - factory->CopyAppendProxyDescriptor( |
| + factory()->CopyAppendProxyDescriptor( |
| script_descriptors, |
| - factory->LookupAsciiSymbol("data"), |
| + factory()->LookupAsciiSymbol("data"), |
| proxy_data, |
| common_attributes); |
| - Handle<Proxy> proxy_type = factory->NewProxy(&Accessors::ScriptType); |
| + Handle<Proxy> proxy_type = factory()->NewProxy(&Accessors::ScriptType); |
| script_descriptors = |
| - factory->CopyAppendProxyDescriptor( |
| + factory()->CopyAppendProxyDescriptor( |
| script_descriptors, |
| - factory->LookupAsciiSymbol("type"), |
| + factory()->LookupAsciiSymbol("type"), |
| proxy_type, |
| common_attributes); |
| Handle<Proxy> proxy_compilation_type = |
| - factory->NewProxy(&Accessors::ScriptCompilationType); |
| + factory()->NewProxy(&Accessors::ScriptCompilationType); |
| script_descriptors = |
| - factory->CopyAppendProxyDescriptor( |
| + factory()->CopyAppendProxyDescriptor( |
| script_descriptors, |
| - factory->LookupAsciiSymbol("compilation_type"), |
| + factory()->LookupAsciiSymbol("compilation_type"), |
| proxy_compilation_type, |
| common_attributes); |
| Handle<Proxy> proxy_line_ends = |
| - factory->NewProxy(&Accessors::ScriptLineEnds); |
| + factory()->NewProxy(&Accessors::ScriptLineEnds); |
| script_descriptors = |
| - factory->CopyAppendProxyDescriptor( |
| + factory()->CopyAppendProxyDescriptor( |
| script_descriptors, |
| - factory->LookupAsciiSymbol("line_ends"), |
| + factory()->LookupAsciiSymbol("line_ends"), |
| proxy_line_ends, |
| common_attributes); |
| Handle<Proxy> proxy_context_data = |
| - factory->NewProxy(&Accessors::ScriptContextData); |
| + factory()->NewProxy(&Accessors::ScriptContextData); |
| script_descriptors = |
| - factory->CopyAppendProxyDescriptor( |
| + factory()->CopyAppendProxyDescriptor( |
| script_descriptors, |
| - factory->LookupAsciiSymbol("context_data"), |
| + factory()->LookupAsciiSymbol("context_data"), |
| proxy_context_data, |
| common_attributes); |
| Handle<Proxy> proxy_eval_from_script = |
| - factory->NewProxy(&Accessors::ScriptEvalFromScript); |
| + factory()->NewProxy(&Accessors::ScriptEvalFromScript); |
| script_descriptors = |
| - factory->CopyAppendProxyDescriptor( |
| + factory()->CopyAppendProxyDescriptor( |
| script_descriptors, |
| - factory->LookupAsciiSymbol("eval_from_script"), |
| + factory()->LookupAsciiSymbol("eval_from_script"), |
| proxy_eval_from_script, |
| common_attributes); |
| Handle<Proxy> proxy_eval_from_script_position = |
| - factory->NewProxy(&Accessors::ScriptEvalFromScriptPosition); |
| + factory()->NewProxy(&Accessors::ScriptEvalFromScriptPosition); |
| script_descriptors = |
| - factory->CopyAppendProxyDescriptor( |
| + factory()->CopyAppendProxyDescriptor( |
| script_descriptors, |
| - factory->LookupAsciiSymbol("eval_from_script_position"), |
| + factory()->LookupAsciiSymbol("eval_from_script_position"), |
| proxy_eval_from_script_position, |
| common_attributes); |
| Handle<Proxy> proxy_eval_from_function_name = |
| - factory->NewProxy(&Accessors::ScriptEvalFromFunctionName); |
| + factory()->NewProxy(&Accessors::ScriptEvalFromFunctionName); |
| script_descriptors = |
| - factory->CopyAppendProxyDescriptor( |
| + factory()->CopyAppendProxyDescriptor( |
| script_descriptors, |
| - factory->LookupAsciiSymbol("eval_from_function_name"), |
| + factory()->LookupAsciiSymbol("eval_from_function_name"), |
| proxy_eval_from_function_name, |
| common_attributes); |
| @@ -1443,21 +1438,21 @@ bool Genesis::InstallNatives() { |
| script_map->set_instance_descriptors(*script_descriptors); |
| // Allocate the empty script. |
| - Handle<Script> script = factory->NewScript(factory->empty_string()); |
| + Handle<Script> script = factory()->NewScript(factory()->empty_string()); |
| script->set_type(Smi::FromInt(Script::TYPE_NATIVE)); |
| - heap->public_set_empty_script(*script); |
| + heap()->public_set_empty_script(*script); |
| } |
| { |
| // Builtin function for OpaqueReference -- a JSValue-based object, |
| - // that keeps its field isolated from JavaScript code. It may store |
| + // that keeps its field isolate()d from JavaScript code. It may store |
|
Mads Ager (chromium)
2011/04/06 07:34:15
Whoops. :)
|
| // objects, that JavaScript code may not access. |
| Handle<JSFunction> opaque_reference_fun = |
| InstallFunction(builtins, "OpaqueReference", JS_VALUE_TYPE, |
| JSValue::kSize, |
| - isolate->initial_object_prototype(), |
| + isolate()->initial_object_prototype(), |
| Builtins::kIllegal, false); |
| Handle<JSObject> prototype = |
| - factory->NewJSObject(isolate->object_function(), TENURED); |
| + factory()->NewJSObject(isolate()->object_function(), TENURED); |
| SetPrototype(opaque_reference_fun, prototype); |
| global_context()->set_opaque_reference_function(*opaque_reference_fun); |
| } |
| @@ -1476,23 +1471,23 @@ bool Genesis::InstallNatives() { |
| "InternalArray", |
| JS_ARRAY_TYPE, |
| JSArray::kSize, |
| - isolate->initial_object_prototype(), |
| + isolate()->initial_object_prototype(), |
| Builtins::kArrayCode, |
| true); |
| Handle<JSObject> prototype = |
| - factory->NewJSObject(isolate->object_function(), TENURED); |
| + factory()->NewJSObject(isolate()->object_function(), TENURED); |
| SetPrototype(array_function, prototype); |
| array_function->shared()->set_construct_stub( |
| - isolate->builtins()->builtin(Builtins::kArrayConstructCode)); |
| + isolate()->builtins()->builtin(Builtins::kArrayConstructCode)); |
| array_function->shared()->DontAdaptArguments(); |
| // Make "length" magic on instances. |
| Handle<DescriptorArray> array_descriptors = |
| - factory->CopyAppendProxyDescriptor( |
| - factory->empty_descriptor_array(), |
| - factory->length_symbol(), |
| - factory->NewProxy(&Accessors::ArrayLength), |
| + factory()->CopyAppendProxyDescriptor( |
| + factory()->empty_descriptor_array(), |
| + factory()->length_symbol(), |
| + factory()->NewProxy(&Accessors::ArrayLength), |
| static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE)); |
| array_function->initial_map()->set_instance_descriptors( |
| @@ -1509,7 +1504,7 @@ bool Genesis::InstallNatives() { |
| i < Natives::GetBuiltinsCount(); |
| i++) { |
| Vector<const char> name = Natives::GetScriptName(i); |
| - if (!CompileBuiltin(i)) return false; |
| + if (!CompileBuiltin(isolate(), i)) return false; |
| // TODO(ager): We really only need to install the JS builtin |
| // functions on the builtins object after compiling and running |
| // runtime.js. |
| @@ -1529,9 +1524,9 @@ bool Genesis::InstallNatives() { |
| InstallBuiltinFunctionIds(); |
| // Install Function.prototype.call and apply. |
| - { Handle<String> key = factory->function_class_symbol(); |
| + { Handle<String> key = factory()->function_class_symbol(); |
| Handle<JSFunction> function = |
| - Handle<JSFunction>::cast(GetProperty(isolate->global(), key)); |
| + Handle<JSFunction>::cast(GetProperty(isolate()->global(), key)); |
| Handle<JSObject> proto = |
| Handle<JSObject>(JSObject::cast(function->instance_prototype())); |
| @@ -1573,7 +1568,7 @@ bool Genesis::InstallNatives() { |
| // Add initial map. |
| Handle<Map> initial_map = |
| - factory->NewMap(JS_ARRAY_TYPE, JSRegExpResult::kSize); |
| + factory()->NewMap(JS_ARRAY_TYPE, JSRegExpResult::kSize); |
| initial_map->set_constructor(*array_constructor); |
| // Set prototype on map. |
| @@ -1587,13 +1582,13 @@ bool Genesis::InstallNatives() { |
| ASSERT_EQ(1, array_descriptors->number_of_descriptors()); |
| Handle<DescriptorArray> reresult_descriptors = |
| - factory->NewDescriptorArray(3); |
| + factory()->NewDescriptorArray(3); |
| reresult_descriptors->CopyFrom(0, *array_descriptors, 0); |
| int enum_index = 0; |
| { |
| - FieldDescriptor index_field(heap->index_symbol(), |
| + FieldDescriptor index_field(heap()->index_symbol(), |
| JSRegExpResult::kIndexIndex, |
| NONE, |
| enum_index++); |
| @@ -1601,7 +1596,7 @@ bool Genesis::InstallNatives() { |
| } |
| { |
| - FieldDescriptor input_field(heap->input_symbol(), |
| + FieldDescriptor input_field(heap()->input_symbol(), |
| JSRegExpResult::kInputIndex, |
| NONE, |
| enum_index++); |
| @@ -1629,7 +1624,7 @@ bool Genesis::InstallNatives() { |
| static Handle<JSObject> ResolveBuiltinIdHolder( |
| Handle<Context> global_context, |
| const char* holder_expr) { |
| - Factory* factory = Isolate::Current()->factory(); |
| + Factory* factory = global_context->GetIsolate()->factory(); |
| Handle<GlobalObject> global(global_context->global()); |
| const char* period_pos = strchr(holder_expr, '.'); |
| if (period_pos == NULL) { |
| @@ -1648,7 +1643,8 @@ static Handle<JSObject> ResolveBuiltinIdHolder( |
| static void InstallBuiltinFunctionId(Handle<JSObject> holder, |
| const char* function_name, |
| BuiltinFunctionId id) { |
| - Handle<String> name = FACTORY->LookupAsciiSymbol(function_name); |
| + Factory* factory = holder->GetIsolate()->factory(); |
| + Handle<String> name = factory->LookupAsciiSymbol(function_name); |
| Object* function_object = holder->GetProperty(*name)->ToObjectUnchecked(); |
| Handle<JSFunction> function(JSFunction::cast(function_object)); |
| function->shared()->set_function_data(Smi::FromInt(id)); |
| @@ -1675,13 +1671,14 @@ void Genesis::InstallBuiltinFunctionIds() { |
| F(16, global_context()->regexp_function()) |
| -static FixedArray* CreateCache(int size, JSFunction* factory) { |
| +static FixedArray* CreateCache(int size, JSFunction* factory_function) { |
| + Factory* factory = factory_function->GetIsolate()->factory(); |
| // Caches are supposed to live for a long time, allocate in old space. |
| int array_size = JSFunctionResultCache::kEntriesIndex + 2 * size; |
| // Cannot use cast as object is not fully initialized yet. |
| JSFunctionResultCache* cache = reinterpret_cast<JSFunctionResultCache*>( |
| - *FACTORY->NewFixedArrayWithHoles(array_size, TENURED)); |
| - cache->set(JSFunctionResultCache::kFactoryIndex, factory); |
| + *factory->NewFixedArrayWithHoles(array_size, TENURED)); |
| + cache->set(JSFunctionResultCache::kFactoryIndex, factory_function); |
| cache->MakeZeroSize(); |
| return cache; |
| } |
| @@ -1720,7 +1717,7 @@ void Genesis::InitializeNormalizedMapCaches() { |
| bool Bootstrapper::InstallExtensions(Handle<Context> global_context, |
| v8::ExtensionConfiguration* extensions) { |
| - Isolate* isolate = Isolate::Current(); |
| + Isolate* isolate = global_context->GetIsolate(); |
| BootstrapperActive active; |
| SaveContext saved_context(isolate); |
| isolate->set_context(*global_context); |
| @@ -1731,7 +1728,7 @@ bool Bootstrapper::InstallExtensions(Handle<Context> global_context, |
| void Genesis::InstallSpecialObjects(Handle<Context> global_context) { |
| - Factory* factory = Isolate::Current()->factory(); |
| + Factory* factory = global_context->GetIsolate()->factory(); |
| HandleScope scope; |
| Handle<JSGlobalObject> js_global( |
| JSGlobalObject::cast(global_context->global())); |
| @@ -1867,9 +1864,10 @@ bool Genesis::InstallExtension(v8::RegisteredExtension* current) { |
| bool Genesis::InstallJSBuiltins(Handle<JSBuiltinsObject> builtins) { |
| HandleScope scope; |
| + Factory* factory = builtins->GetIsolate()->factory(); |
| for (int i = 0; i < Builtins::NumberOfJavaScriptBuiltins(); i++) { |
| Builtins::JavaScript id = static_cast<Builtins::JavaScript>(i); |
| - Handle<String> name = FACTORY->LookupAsciiSymbol(Builtins::GetName(id)); |
| + Handle<String> name = factory->LookupAsciiSymbol(Builtins::GetName(id)); |
| Object* function_object = builtins->GetPropertyNoExceptionThrown(*name); |
| Handle<JSFunction> function |
| = Handle<JSFunction>(JSFunction::cast(function_object)); |
| @@ -1918,13 +1916,12 @@ bool Genesis::ConfigureApiObject(Handle<JSObject> object, |
| ASSERT(object->IsInstanceOf( |
| FunctionTemplateInfo::cast(object_template->constructor()))); |
| - Isolate* isolate = Isolate::Current(); |
| bool pending_exception = false; |
| Handle<JSObject> obj = |
| Execution::InstantiateObject(object_template, &pending_exception); |
| if (pending_exception) { |
| - ASSERT(isolate->has_pending_exception()); |
| - isolate->clear_pending_exception(); |
| + ASSERT(isolate()->has_pending_exception()); |
| + isolate()->clear_pending_exception(); |
| return false; |
| } |
| TransferObject(obj, object); |
| @@ -2023,6 +2020,7 @@ void Genesis::TransferIndexedProperties(Handle<JSObject> from, |
| void Genesis::TransferObject(Handle<JSObject> from, Handle<JSObject> to) { |
| HandleScope outer; |
| + Factory* factory = from->GetIsolate()->factory(); |
| ASSERT(!from->IsJSArray()); |
| ASSERT(!to->IsJSArray()); |
| @@ -2032,7 +2030,7 @@ void Genesis::TransferObject(Handle<JSObject> from, Handle<JSObject> to) { |
| // Transfer the prototype (new map is needed). |
| Handle<Map> old_to_map = Handle<Map>(to->map()); |
| - Handle<Map> new_to_map = FACTORY->CopyMapDropTransitions(old_to_map); |
| + Handle<Map> new_to_map = factory->CopyMapDropTransitions(old_to_map); |
| new_to_map->set_prototype(from->map()->prototype()); |
| to->set_map(*new_to_map); |
| } |
| @@ -2053,10 +2051,10 @@ void Genesis::MakeFunctionInstancePrototypeWritable() { |
| } |
| -Genesis::Genesis(Handle<Object> global_object, |
| +Genesis::Genesis(Isolate* isolate, |
| + Handle<Object> global_object, |
| v8::Handle<v8::ObjectTemplate> global_template, |
| v8::ExtensionConfiguration* extensions) { |
| - Isolate* isolate = Isolate::Current(); |
| result_ = Handle<Context>::null(); |
| // If V8 isn't running and cannot be initialized, just return. |
| if (!V8::IsRunning() && !V8::Initialize(NULL)) return; |
| @@ -2086,7 +2084,7 @@ Genesis::Genesis(Handle<Object> global_object, |
| } else { |
| // We get here if there was no context snapshot. |
| CreateRoots(); |
| - Handle<JSFunction> empty_function = CreateEmptyFunction(); |
| + Handle<JSFunction> empty_function = CreateEmptyFunction(isolate); |
| CreateStrictModeFunctionMaps(empty_function); |
| Handle<GlobalObject> inner_global; |
| Handle<JSGlobalProxy> global_proxy = |