| Index: src/bootstrapper.cc
|
| ===================================================================
|
| --- src/bootstrapper.cc (revision 7267)
|
| +++ src/bootstrapper.cc (working copy)
|
| @@ -44,100 +44,54 @@
|
| namespace v8 {
|
| namespace internal {
|
|
|
| -// A SourceCodeCache uses a FixedArray to store pairs of
|
| -// (AsciiString*, JSFunction*), mapping names of native code files
|
| -// (runtime.js, etc.) to precompiled functions. Instead of mapping
|
| -// names to functions it might make sense to let the JS2C tool
|
| -// generate an index for each native JS file.
|
| -class SourceCodeCache BASE_EMBEDDED {
|
| - public:
|
| - explicit SourceCodeCache(Script::Type type): type_(type), cache_(NULL) { }
|
|
|
| - void Initialize(bool create_heap_objects) {
|
| - cache_ = create_heap_objects ? Heap::empty_fixed_array() : NULL;
|
| - }
|
| -
|
| - void Iterate(ObjectVisitor* v) {
|
| - v->VisitPointer(BitCast<Object**>(&cache_));
|
| - }
|
| -
|
| -
|
| - bool Lookup(Vector<const char> name, Handle<SharedFunctionInfo>* handle) {
|
| - for (int i = 0; i < cache_->length(); i+=2) {
|
| - SeqAsciiString* str = SeqAsciiString::cast(cache_->get(i));
|
| - if (str->IsEqualTo(name)) {
|
| - *handle = Handle<SharedFunctionInfo>(
|
| - SharedFunctionInfo::cast(cache_->get(i + 1)));
|
| - return true;
|
| - }
|
| - }
|
| - return false;
|
| - }
|
| -
|
| -
|
| - void Add(Vector<const char> name, Handle<SharedFunctionInfo> shared) {
|
| - HandleScope scope;
|
| - int length = cache_->length();
|
| - Handle<FixedArray> new_array =
|
| - Factory::NewFixedArray(length + 2, TENURED);
|
| - cache_->CopyTo(0, *new_array, 0, cache_->length());
|
| - cache_ = *new_array;
|
| - Handle<String> str = Factory::NewStringFromAscii(name, TENURED);
|
| - cache_->set(length, *str);
|
| - cache_->set(length + 1, *shared);
|
| - Script::cast(shared->script())->set_type(Smi::FromInt(type_));
|
| - }
|
| -
|
| - private:
|
| - Script::Type type_;
|
| - FixedArray* cache_;
|
| - DISALLOW_COPY_AND_ASSIGN(SourceCodeCache);
|
| -};
|
| -
|
| -static SourceCodeCache extensions_cache(Script::TYPE_EXTENSION);
|
| -// This is for delete, not delete[].
|
| -static List<char*>* delete_these_non_arrays_on_tear_down = NULL;
|
| -// This is for delete[]
|
| -static List<char*>* delete_these_arrays_on_tear_down = NULL;
|
| -
|
| -
|
| -NativesExternalStringResource::NativesExternalStringResource(const char* source)
|
| +NativesExternalStringResource::NativesExternalStringResource(
|
| + Bootstrapper* bootstrapper,
|
| + const char* source)
|
| : data_(source), length_(StrLength(source)) {
|
| - if (delete_these_non_arrays_on_tear_down == NULL) {
|
| - delete_these_non_arrays_on_tear_down = new List<char*>(2);
|
| + if (bootstrapper->delete_these_non_arrays_on_tear_down_ == NULL) {
|
| + bootstrapper->delete_these_non_arrays_on_tear_down_ = new List<char*>(2);
|
| }
|
| // The resources are small objects and we only make a fixed number of
|
| // them, but let's clean them up on exit for neatness.
|
| - delete_these_non_arrays_on_tear_down->
|
| + bootstrapper->delete_these_non_arrays_on_tear_down_->
|
| Add(reinterpret_cast<char*>(this));
|
| }
|
|
|
|
|
| +Bootstrapper::Bootstrapper()
|
| + : nesting_(0),
|
| + extensions_cache_(Script::TYPE_EXTENSION),
|
| + delete_these_non_arrays_on_tear_down_(NULL),
|
| + delete_these_arrays_on_tear_down_(NULL) {
|
| +}
|
| +
|
| +
|
| Handle<String> Bootstrapper::NativesSourceLookup(int index) {
|
| ASSERT(0 <= index && index < Natives::GetBuiltinsCount());
|
| - if (Heap::natives_source_cache()->get(index)->IsUndefined()) {
|
| + if (HEAP->natives_source_cache()->get(index)->IsUndefined()) {
|
| if (!Snapshot::IsEnabled() || FLAG_new_snapshot) {
|
| // We can use external strings for the natives.
|
| NativesExternalStringResource* resource =
|
| - new NativesExternalStringResource(
|
| + new NativesExternalStringResource(this,
|
| Natives::GetScriptSource(index).start());
|
| Handle<String> source_code =
|
| - Factory::NewExternalStringFromAscii(resource);
|
| - Heap::natives_source_cache()->set(index, *source_code);
|
| + FACTORY->NewExternalStringFromAscii(resource);
|
| + HEAP->natives_source_cache()->set(index, *source_code);
|
| } else {
|
| // Old snapshot code can't cope with external strings at all.
|
| Handle<String> source_code =
|
| - Factory::NewStringFromAscii(Natives::GetScriptSource(index));
|
| - Heap::natives_source_cache()->set(index, *source_code);
|
| + FACTORY->NewStringFromAscii(Natives::GetScriptSource(index));
|
| + HEAP->natives_source_cache()->set(index, *source_code);
|
| }
|
| }
|
| - Handle<Object> cached_source(Heap::natives_source_cache()->get(index));
|
| + Handle<Object> cached_source(HEAP->natives_source_cache()->get(index));
|
| return Handle<String>::cast(cached_source);
|
| }
|
|
|
|
|
| void Bootstrapper::Initialize(bool create_heap_objects) {
|
| - extensions_cache.Initialize(create_heap_objects);
|
| + extensions_cache_.Initialize(create_heap_objects);
|
| GCExtension::Register();
|
| ExternalizeStringExtension::Register();
|
| }
|
| @@ -146,39 +100,39 @@
|
| char* Bootstrapper::AllocateAutoDeletedArray(int bytes) {
|
| char* memory = new char[bytes];
|
| if (memory != NULL) {
|
| - if (delete_these_arrays_on_tear_down == NULL) {
|
| - delete_these_arrays_on_tear_down = new List<char*>(2);
|
| + if (delete_these_arrays_on_tear_down_ == NULL) {
|
| + delete_these_arrays_on_tear_down_ = new List<char*>(2);
|
| }
|
| - delete_these_arrays_on_tear_down->Add(memory);
|
| + delete_these_arrays_on_tear_down_->Add(memory);
|
| }
|
| return memory;
|
| }
|
|
|
|
|
| void Bootstrapper::TearDown() {
|
| - if (delete_these_non_arrays_on_tear_down != NULL) {
|
| - int len = delete_these_non_arrays_on_tear_down->length();
|
| + if (delete_these_non_arrays_on_tear_down_ != NULL) {
|
| + int len = delete_these_non_arrays_on_tear_down_->length();
|
| ASSERT(len < 20); // Don't use this mechanism for unbounded allocations.
|
| for (int i = 0; i < len; i++) {
|
| - delete delete_these_non_arrays_on_tear_down->at(i);
|
| - delete_these_non_arrays_on_tear_down->at(i) = NULL;
|
| + delete delete_these_non_arrays_on_tear_down_->at(i);
|
| + delete_these_non_arrays_on_tear_down_->at(i) = NULL;
|
| }
|
| - delete delete_these_non_arrays_on_tear_down;
|
| - delete_these_non_arrays_on_tear_down = NULL;
|
| + delete delete_these_non_arrays_on_tear_down_;
|
| + delete_these_non_arrays_on_tear_down_ = NULL;
|
| }
|
|
|
| - if (delete_these_arrays_on_tear_down != NULL) {
|
| - int len = delete_these_arrays_on_tear_down->length();
|
| + if (delete_these_arrays_on_tear_down_ != NULL) {
|
| + int len = delete_these_arrays_on_tear_down_->length();
|
| ASSERT(len < 1000); // Don't use this mechanism for unbounded allocations.
|
| for (int i = 0; i < len; i++) {
|
| - delete[] delete_these_arrays_on_tear_down->at(i);
|
| - delete_these_arrays_on_tear_down->at(i) = NULL;
|
| + delete[] delete_these_arrays_on_tear_down_->at(i);
|
| + delete_these_arrays_on_tear_down_->at(i) = NULL;
|
| }
|
| - delete delete_these_arrays_on_tear_down;
|
| - delete_these_arrays_on_tear_down = NULL;
|
| + delete delete_these_arrays_on_tear_down_;
|
| + delete_these_arrays_on_tear_down_ = NULL;
|
| }
|
|
|
| - extensions_cache.Initialize(false); // Yes, symmetrical
|
| + extensions_cache_.Initialize(false); // Yes, symmetrical
|
| }
|
|
|
|
|
| @@ -306,7 +260,7 @@
|
|
|
|
|
| void Bootstrapper::Iterate(ObjectVisitor* v) {
|
| - extensions_cache.Iterate(v);
|
| + extensions_cache_.Iterate(v);
|
| v->Synchronize("Extensions");
|
| }
|
|
|
| @@ -331,16 +285,16 @@
|
| static void SetObjectPrototype(Handle<JSObject> object, Handle<Object> proto) {
|
| // object.__proto__ = proto;
|
| 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) {
|
| - JSGlobalProxy::cast(env->global_proxy())->set_context(*Factory::null_value());
|
| + JSGlobalProxy::cast(env->global_proxy())->set_context(*FACTORY->null_value());
|
| SetObjectPrototype(Handle<JSObject>(env->global_proxy()),
|
| - Factory::null_value());
|
| + FACTORY->null_value());
|
| env->set_global_proxy(env->global());
|
| env->global()->set_global_receiver(env->global());
|
| }
|
| @@ -364,11 +318,12 @@
|
| Handle<JSObject> prototype,
|
| Builtins::Name call,
|
| bool is_ecma_native) {
|
| - Handle<String> symbol = Factory::LookupAsciiSymbol(name);
|
| - Handle<Code> call_code = Handle<Code>(Builtins::builtin(call));
|
| + Handle<String> symbol = FACTORY->LookupAsciiSymbol(name);
|
| + Handle<Code> call_code = Handle<Code>(
|
| + Isolate::Current()->builtins()->builtin(call));
|
| Handle<JSFunction> function = prototype.is_null() ?
|
| - Factory::NewFunctionWithoutPrototype(symbol, call_code) :
|
| - Factory::NewFunctionWithPrototype(symbol,
|
| + FACTORY->NewFunctionWithoutPrototype(symbol, call_code) :
|
| + FACTORY->NewFunctionWithPrototype(symbol,
|
| type,
|
| instance_size,
|
| prototype,
|
| @@ -385,28 +340,28 @@
|
| Handle<DescriptorArray> Genesis::ComputeFunctionInstanceDescriptor(
|
| PrototypePropertyMode prototypeMode) {
|
| 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) {
|
| @@ -414,8 +369,8 @@
|
| 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();
|
| @@ -424,7 +379,7 @@
|
|
|
|
|
| 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);
|
| @@ -458,41 +413,43 @@
|
| function_instance_map_writable_prototype_ =
|
| CreateFunctionMap(ADD_WRITEABLE_PROTOTYPE);
|
|
|
| - Handle<String> object_name = Handle<String>(Heap::Object_symbol());
|
| + Handle<String> object_name = Handle<String>(HEAP->Object_symbol());
|
|
|
| { // --- O b j e c t ---
|
| Handle<JSFunction> object_fun =
|
| - Factory::NewFunction(object_name, Factory::null_value());
|
| + FACTORY->NewFunction(object_name, FACTORY->null_value());
|
| Handle<Map> object_function_map =
|
| - Factory::NewMap(JS_OBJECT_TYPE, JSObject::kHeaderSize);
|
| + FACTORY->NewMap(JS_OBJECT_TYPE, JSObject::kHeaderSize);
|
| object_fun->set_initial_map(*object_function_map);
|
| object_function_map->set_constructor(*object_fun);
|
|
|
| global_context()->set_object_function(*object_fun);
|
|
|
| // Allocate a new prototype for the object function.
|
| - Handle<JSObject> prototype = Factory::NewJSObject(Top::object_function(),
|
| - TENURED);
|
| + Handle<JSObject> prototype = FACTORY->NewJSObject(
|
| + Isolate::Current()->object_function(),
|
| + TENURED);
|
|
|
| global_context()->set_initial_object_prototype(*prototype);
|
| SetPrototype(object_fun, prototype);
|
| object_function_map->
|
| - set_instance_descriptors(Heap::empty_descriptor_array());
|
| + set_instance_descriptors(HEAP->empty_descriptor_array());
|
| }
|
|
|
| // Allocate the empty function as the prototype for function ECMAScript
|
| // 262 15.3.4.
|
| - Handle<String> symbol = Factory::LookupAsciiSymbol("Empty");
|
| + Handle<String> symbol = FACTORY->LookupAsciiSymbol("Empty");
|
| Handle<JSFunction> empty_function =
|
| - Factory::NewFunctionWithoutPrototype(symbol, kNonStrictMode);
|
| + FACTORY->NewFunctionWithoutPrototype(symbol, kNonStrictMode);
|
|
|
| // --- E m p t y ---
|
| Handle<Code> code =
|
| - Handle<Code>(Builtins::builtin(Builtins::EmptyFunction));
|
| + Handle<Code>(Isolate::Current()->builtins()->builtin(
|
| + Builtins::EmptyFunction));
|
| empty_function->set_code(*code);
|
| empty_function->shared()->set_code(*code);
|
| - Handle<String> source = Factory::NewStringFromAscii(CStrVector("() {}"));
|
| - Handle<Script> script = Factory::NewScript(source);
|
| + Handle<String> source = FACTORY->NewStringFromAscii(CStrVector("() {}"));
|
| + Handle<Script> script = FACTORY->NewScript(source);
|
| script->set_type(Smi::FromInt(Script::TYPE_NATIVE));
|
| empty_function->shared()->set_script(*script);
|
| empty_function->shared()->set_start_position(0);
|
| @@ -509,7 +466,7 @@
|
| // Allocate the function map first and then patch the prototype later
|
| Handle<Map> function_without_prototype_map(
|
| global_context()->function_without_prototype_map());
|
| - Handle<Map> empty_fm = Factory::CopyMapDropDescriptors(
|
| + Handle<Map> empty_fm = FACTORY->CopyMapDropDescriptors(
|
| function_without_prototype_map);
|
| empty_fm->set_instance_descriptors(
|
| function_without_prototype_map->instance_descriptors());
|
| @@ -524,26 +481,26 @@
|
| Handle<FixedArray> arguments,
|
| Handle<FixedArray> caller) {
|
| 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);
|
| }
|
|
|
| @@ -552,8 +509,8 @@
|
| 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);
|
| }
|
|
|
| @@ -565,10 +522,11 @@
|
| // ECMAScript 5th Edition, 13.2.3
|
| Handle<JSFunction> Genesis::CreateThrowTypeErrorFunction(
|
| Builtins::Name builtin) {
|
| - Handle<String> name = Factory::LookupAsciiSymbol("ThrowTypeError");
|
| + Handle<String> name = FACTORY->LookupAsciiSymbol("ThrowTypeError");
|
| Handle<JSFunction> throw_type_error =
|
| - Factory::NewFunctionWithoutPrototype(name, kStrictMode);
|
| - Handle<Code> code = Handle<Code>(Builtins::builtin(builtin));
|
| + FACTORY->NewFunctionWithoutPrototype(name, kStrictMode);
|
| + Handle<Code> code = Handle<Code>(
|
| + Isolate::Current()->builtins()->builtin(builtin));
|
|
|
| throw_type_error->set_map(global_context()->strict_mode_function_map());
|
| throw_type_error->set_code(*code);
|
| @@ -586,7 +544,7 @@
|
| 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,
|
| @@ -601,8 +559,8 @@
|
| 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.
|
| - Handle<FixedArray> arguments = Factory::NewFixedArray(2, TENURED);
|
| - Handle<FixedArray> caller = Factory::NewFixedArray(2, TENURED);
|
| + Handle<FixedArray> arguments = FACTORY->NewFixedArray(2, TENURED);
|
| + Handle<FixedArray> caller = FACTORY->NewFixedArray(2, TENURED);
|
|
|
| // Allocate map for the strict mode function instances.
|
| global_context()->set_strict_mode_function_instance_map(
|
| @@ -643,32 +601,33 @@
|
|
|
| static void AddToWeakGlobalContextList(Context* context) {
|
| ASSERT(context->IsGlobalContext());
|
| + Heap* heap = Isolate::Current()->heap();
|
| #ifdef DEBUG
|
| { // NOLINT
|
| ASSERT(context->get(Context::NEXT_CONTEXT_LINK)->IsUndefined());
|
| // Check that context is not in the list yet.
|
| - for (Object* current = Heap::global_contexts_list();
|
| + for (Object* current = heap->global_contexts_list();
|
| !current->IsUndefined();
|
| current = Context::cast(current)->get(Context::NEXT_CONTEXT_LINK)) {
|
| ASSERT(current != context);
|
| }
|
| }
|
| #endif
|
| - context->set(Context::NEXT_CONTEXT_LINK, Heap::global_contexts_list());
|
| - Heap::set_global_contexts_list(context);
|
| + context->set(Context::NEXT_CONTEXT_LINK, heap->global_contexts_list());
|
| + heap->set_global_contexts_list(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(
|
| - GlobalHandles::Create(*Factory::NewGlobalContext()));
|
| + global_context_ = Handle<Context>::cast(isolate->global_handles()->Create(
|
| + *isolate->factory()->NewGlobalContext()));
|
| AddToWeakGlobalContextList(*global_context_);
|
| - Top::set_context(*global_context());
|
| + isolate->set_context(*global_context());
|
|
|
| // Allocate the message listeners object.
|
| {
|
| @@ -712,10 +671,11 @@
|
| }
|
|
|
| if (js_global_template.is_null()) {
|
| - Handle<String> name = Handle<String>(Heap::empty_symbol());
|
| - Handle<Code> code = Handle<Code>(Builtins::builtin(Builtins::Illegal));
|
| + Handle<String> name = Handle<String>(HEAP->empty_symbol());
|
| + Handle<Code> code = Handle<Code>(Isolate::Current()->builtins()->builtin(
|
| + Builtins::Illegal));
|
| js_global_function =
|
| - Factory::NewFunction(name, JS_GLOBAL_OBJECT_TYPE,
|
| + FACTORY->NewFunction(name, JS_GLOBAL_OBJECT_TYPE,
|
| JSGlobalObject::kSize, code, true);
|
| // Change the constructor property of the prototype of the
|
| // hidden global function to refer to the Object function.
|
| @@ -723,18 +683,21 @@
|
| Handle<JSObject>(
|
| JSObject::cast(js_global_function->instance_prototype()));
|
| SetLocalPropertyNoThrow(
|
| - prototype, Factory::constructor_symbol(), Top::object_function(), NONE);
|
| + prototype,
|
| + FACTORY->constructor_symbol(),
|
| + Isolate::Current()->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;
|
| }
|
| @@ -742,10 +705,11 @@
|
| // 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>(Builtins::builtin(Builtins::Illegal));
|
| + Handle<String> name = Handle<String>(HEAP->empty_symbol());
|
| + Handle<Code> code = Handle<Code>(Isolate::Current()->builtins()->builtin(
|
| + Builtins::Illegal));
|
| global_proxy_function =
|
| - Factory::NewFunction(name, JS_GLOBAL_PROXY_TYPE,
|
| + FACTORY->NewFunction(name, JS_GLOBAL_PROXY_TYPE,
|
| JSGlobalProxy::kSize, code, true);
|
| } else {
|
| Handle<ObjectTemplateInfo> data =
|
| @@ -753,11 +717,11 @@
|
| 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);
|
|
|
| @@ -771,7 +735,7 @@
|
| Handle<JSGlobalProxy>::cast(global_object));
|
| } else {
|
| return Handle<JSGlobalProxy>::cast(
|
| - Factory::NewJSObject(global_proxy_function, TENURED));
|
| + FACTORY->NewJSObject(global_proxy_function, TENURED));
|
| }
|
| }
|
|
|
| @@ -796,7 +760,7 @@
|
| 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.
|
| @@ -824,9 +788,9 @@
|
| // object reinitialization.
|
| global_context()->set_security_token(*inner_global);
|
|
|
| - Handle<String> object_name = Handle<String>(Heap::Object_symbol());
|
| + Handle<String> object_name = Handle<String>(HEAP->Object_symbol());
|
| SetLocalPropertyNoThrow(inner_global, object_name,
|
| - Top::object_function(), DONT_ENUM);
|
| + Isolate::Current()->object_function(), DONT_ENUM);
|
|
|
| Handle<JSObject> global = Handle<JSObject>(global_context()->global());
|
|
|
| @@ -837,20 +801,20 @@
|
| { // --- A r r a y ---
|
| Handle<JSFunction> array_function =
|
| InstallFunction(global, "Array", JS_ARRAY_TYPE, JSArray::kSize,
|
| - Top::initial_object_prototype(), Builtins::ArrayCode,
|
| - true);
|
| + Isolate::Current()->initial_object_prototype(),
|
| + Builtins::ArrayCode, true);
|
| array_function->shared()->set_construct_stub(
|
| - Builtins::builtin(Builtins::ArrayConstructCode));
|
| + Isolate::Current()->builtins()->builtin(Builtins::ArrayConstructCode));
|
| array_function->shared()->DontAdaptArguments();
|
|
|
| // This seems a bit hackish, but we need to make sure Array.length
|
| // is 1.
|
| array_function->shared()->set_length(1);
|
| 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));
|
|
|
| // Cache the fast JavaScript array map
|
| @@ -867,33 +831,33 @@
|
| { // --- N u m b e r ---
|
| Handle<JSFunction> number_fun =
|
| InstallFunction(global, "Number", JS_VALUE_TYPE, JSValue::kSize,
|
| - Top::initial_object_prototype(), Builtins::Illegal,
|
| - true);
|
| + Isolate::Current()->initial_object_prototype(),
|
| + Builtins::Illegal, true);
|
| global_context()->set_number_function(*number_fun);
|
| }
|
|
|
| { // --- B o o l e a n ---
|
| Handle<JSFunction> boolean_fun =
|
| InstallFunction(global, "Boolean", JS_VALUE_TYPE, JSValue::kSize,
|
| - Top::initial_object_prototype(), Builtins::Illegal,
|
| - true);
|
| + Isolate::Current()->initial_object_prototype(),
|
| + Builtins::Illegal, true);
|
| global_context()->set_boolean_function(*boolean_fun);
|
| }
|
|
|
| { // --- S t r i n g ---
|
| Handle<JSFunction> string_fun =
|
| InstallFunction(global, "String", JS_VALUE_TYPE, JSValue::kSize,
|
| - Top::initial_object_prototype(), Builtins::Illegal,
|
| - true);
|
| + Isolate::Current()->initial_object_prototype(),
|
| + Builtins::Illegal, true);
|
| string_fun->shared()->set_construct_stub(
|
| - Builtins::builtin(Builtins::StringConstructCode));
|
| + Isolate::Current()->builtins()->builtin(Builtins::StringConstructCode));
|
| global_context()->set_string_function(*string_fun);
|
| // Add 'length' property to strings.
|
| Handle<DescriptorArray> string_descriptors =
|
| - Factory::CopyAppendProxyDescriptor(
|
| - Factory::empty_descriptor_array(),
|
| - Factory::length_symbol(),
|
| - Factory::NewProxy(&Accessors::StringLength),
|
| + FACTORY->CopyAppendProxyDescriptor(
|
| + FACTORY->empty_descriptor_array(),
|
| + FACTORY->length_symbol(),
|
| + FACTORY->NewProxy(&Accessors::StringLength),
|
| static_cast<PropertyAttributes>(DONT_ENUM |
|
| DONT_DELETE |
|
| READ_ONLY));
|
| @@ -907,8 +871,8 @@
|
| // Builtin functions for Date.prototype.
|
| Handle<JSFunction> date_fun =
|
| InstallFunction(global, "Date", JS_VALUE_TYPE, JSValue::kSize,
|
| - Top::initial_object_prototype(), Builtins::Illegal,
|
| - true);
|
| + Isolate::Current()->initial_object_prototype(),
|
| + Builtins::Illegal, true);
|
|
|
| global_context()->set_date_function(*date_fun);
|
| }
|
| @@ -918,8 +882,8 @@
|
| // Builtin functions for RegExp.prototype.
|
| Handle<JSFunction> regexp_fun =
|
| InstallFunction(global, "RegExp", JS_REGEXP_TYPE, JSRegExp::kSize,
|
| - Top::initial_object_prototype(), Builtins::Illegal,
|
| - true);
|
| + Isolate::Current()->initial_object_prototype(),
|
| + Builtins::Illegal, true);
|
| global_context()->set_regexp_function(*regexp_fun);
|
|
|
| ASSERT(regexp_fun->has_initial_map());
|
| @@ -927,13 +891,13 @@
|
|
|
| ASSERT_EQ(0, initial_map->inobject_properties());
|
|
|
| - Handle<DescriptorArray> descriptors = Factory::NewDescriptorArray(5);
|
| + Handle<DescriptorArray> descriptors = FACTORY->NewDescriptorArray(5);
|
| PropertyAttributes final =
|
| static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY);
|
| int enum_index = 0;
|
| {
|
| // ECMA-262, section 15.10.7.1.
|
| - FieldDescriptor field(Heap::source_symbol(),
|
| + FieldDescriptor field(HEAP->source_symbol(),
|
| JSRegExp::kSourceFieldIndex,
|
| final,
|
| enum_index++);
|
| @@ -941,7 +905,7 @@
|
| }
|
| {
|
| // ECMA-262, section 15.10.7.2.
|
| - FieldDescriptor field(Heap::global_symbol(),
|
| + FieldDescriptor field(HEAP->global_symbol(),
|
| JSRegExp::kGlobalFieldIndex,
|
| final,
|
| enum_index++);
|
| @@ -949,7 +913,7 @@
|
| }
|
| {
|
| // ECMA-262, section 15.10.7.3.
|
| - FieldDescriptor field(Heap::ignore_case_symbol(),
|
| + FieldDescriptor field(HEAP->ignore_case_symbol(),
|
| JSRegExp::kIgnoreCaseFieldIndex,
|
| final,
|
| enum_index++);
|
| @@ -957,7 +921,7 @@
|
| }
|
| {
|
| // ECMA-262, section 15.10.7.4.
|
| - FieldDescriptor field(Heap::multiline_symbol(),
|
| + FieldDescriptor field(HEAP->multiline_symbol(),
|
| JSRegExp::kMultilineFieldIndex,
|
| final,
|
| enum_index++);
|
| @@ -967,7 +931,7 @@
|
| // ECMA-262, section 15.10.7.5.
|
| PropertyAttributes writable =
|
| static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE);
|
| - FieldDescriptor field(Heap::last_index_symbol(),
|
| + FieldDescriptor field(HEAP->last_index_symbol(),
|
| JSRegExp::kLastIndexFieldIndex,
|
| writable,
|
| enum_index++);
|
| @@ -986,13 +950,13 @@
|
| }
|
|
|
| { // -- J S O N
|
| - Handle<String> name = Factory::NewStringFromAscii(CStrVector("JSON"));
|
| - Handle<JSFunction> cons = Factory::NewFunction(
|
| + Handle<String> name = FACTORY->NewStringFromAscii(CStrVector("JSON"));
|
| + Handle<JSFunction> cons = FACTORY->NewFunction(
|
| name,
|
| - Factory::the_hole_value());
|
| + FACTORY->the_hole_value());
|
| cons->SetInstancePrototype(global_context()->initial_object_prototype());
|
| cons->SetInstanceClassName(*name);
|
| - Handle<JSObject> json_object = Factory::NewJSObject(cons, TENURED);
|
| + Handle<JSObject> json_object = FACTORY->NewJSObject(cons, TENURED);
|
| ASSERT(json_object->IsJSObject());
|
| SetLocalPropertyNoThrow(global, name, json_object, DONT_ENUM);
|
| global_context()->set_json_object(*json_object);
|
| @@ -1002,14 +966,15 @@
|
| // Make sure we can recognize argument objects at runtime.
|
| // This is done by introducing an anonymous function with
|
| // class_name equals 'Arguments'.
|
| - Handle<String> symbol = Factory::LookupAsciiSymbol("Arguments");
|
| - Handle<Code> code = Handle<Code>(Builtins::builtin(Builtins::Illegal));
|
| + Handle<String> symbol = FACTORY->LookupAsciiSymbol("Arguments");
|
| + Handle<Code> code = Handle<Code>(
|
| + Isolate::Current()->builtins()->builtin(Builtins::Illegal));
|
| Handle<JSObject> prototype =
|
| Handle<JSObject>(
|
| JSObject::cast(global_context()->object_function()->prototype()));
|
|
|
| Handle<JSFunction> function =
|
| - Factory::NewFunctionWithPrototype(symbol,
|
| + FACTORY->NewFunctionWithPrototype(symbol,
|
| JS_OBJECT_TYPE,
|
| JSObject::kHeaderSize,
|
| prototype,
|
| @@ -1018,25 +983,25 @@
|
| ASSERT(!function->has_initial_map());
|
| function->shared()->set_instance_class_name(*symbol);
|
| function->shared()->set_expected_nof_properties(2);
|
| - Handle<JSObject> result = Factory::NewJSObject(function);
|
| + Handle<JSObject> result = FACTORY->NewJSObject(function);
|
|
|
| global_context()->set_arguments_boilerplate(*result);
|
| // Note: length must be added as the first property and
|
| // callee must be added as the second property.
|
| - SetLocalPropertyNoThrow(result, Factory::length_symbol(),
|
| - Factory::undefined_value(),
|
| + SetLocalPropertyNoThrow(result, FACTORY->length_symbol(),
|
| + FACTORY->undefined_value(),
|
| DONT_ENUM);
|
| - SetLocalPropertyNoThrow(result, Factory::callee_symbol(),
|
| - Factory::undefined_value(),
|
| + SetLocalPropertyNoThrow(result, FACTORY->callee_symbol(),
|
| + FACTORY->undefined_value(),
|
| DONT_ENUM);
|
|
|
| #ifdef DEBUG
|
| LookupResult lookup;
|
| - result->LocalLookup(Heap::callee_symbol(), &lookup);
|
| + result->LocalLookup(HEAP->callee_symbol(), &lookup);
|
| ASSERT(lookup.IsProperty() && (lookup.type() == FIELD));
|
| ASSERT(lookup.GetFieldIndex() == Heap::kArgumentsCalleeIndex);
|
|
|
| - result->LocalLookup(Heap::length_symbol(), &lookup);
|
| + result->LocalLookup(HEAP->length_symbol(), &lookup);
|
| ASSERT(lookup.IsProperty() && (lookup.type() == FIELD));
|
| ASSERT(lookup.GetFieldIndex() == Heap::kArgumentsLengthIndex);
|
|
|
| @@ -1054,8 +1019,8 @@
|
| static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY);
|
|
|
| // Create the ThrowTypeError functions.
|
| - Handle<FixedArray> callee = Factory::NewFixedArray(2, TENURED);
|
| - Handle<FixedArray> caller = Factory::NewFixedArray(2, TENURED);
|
| + Handle<FixedArray> callee = FACTORY->NewFixedArray(2, TENURED);
|
| + Handle<FixedArray> caller = FACTORY->NewFixedArray(2, TENURED);
|
|
|
| Handle<JSFunction> callee_throw =
|
| CreateThrowTypeErrorFunction(Builtins::StrictArgumentsCallee);
|
| @@ -1069,23 +1034,23 @@
|
| caller->set(1, *caller_throw);
|
|
|
| // Create the descriptor array for the arguments object.
|
| - Handle<DescriptorArray> descriptors = Factory::NewDescriptorArray(3);
|
| + Handle<DescriptorArray> descriptors = FACTORY->NewDescriptorArray(3);
|
| { // length
|
| - FieldDescriptor d(*Factory::length_symbol(), 0, DONT_ENUM);
|
| + FieldDescriptor d(*FACTORY->length_symbol(), 0, DONT_ENUM);
|
| descriptors->Set(0, &d);
|
| }
|
| { // callee
|
| - CallbacksDescriptor d(*Factory::callee_symbol(), *callee, attributes);
|
| + CallbacksDescriptor d(*FACTORY->callee_symbol(), *callee, attributes);
|
| descriptors->Set(1, &d);
|
| }
|
| { // caller
|
| - CallbacksDescriptor d(*Factory::caller_symbol(), *caller, attributes);
|
| + CallbacksDescriptor d(*FACTORY->caller_symbol(), *caller, attributes);
|
| descriptors->Set(2, &d);
|
| }
|
| descriptors->Sort();
|
|
|
| // Create the map. Allocate one in-object field for length.
|
| - Handle<Map> map = Factory::NewMap(JS_OBJECT_TYPE,
|
| + Handle<Map> map = FACTORY->NewMap(JS_OBJECT_TYPE,
|
| Heap::kArgumentsObjectSizeStrict);
|
| map->set_instance_descriptors(*descriptors);
|
| map->set_function_with_prototype(true);
|
| @@ -1098,17 +1063,17 @@
|
| global_context()->arguments_boilerplate()->map()->constructor());
|
|
|
| // Allocate the arguments boilerplate object.
|
| - Handle<JSObject> result = Factory::NewJSObjectFromMap(map);
|
| + Handle<JSObject> result = FACTORY->NewJSObjectFromMap(map);
|
| global_context()->set_strict_mode_arguments_boilerplate(*result);
|
|
|
| // Add length property only for strict mode boilerplate.
|
| - SetLocalPropertyNoThrow(result, Factory::length_symbol(),
|
| - Factory::undefined_value(),
|
| + SetLocalPropertyNoThrow(result, FACTORY->length_symbol(),
|
| + FACTORY->undefined_value(),
|
| DONT_ENUM);
|
|
|
| #ifdef DEBUG
|
| LookupResult lookup;
|
| - result->LocalLookup(Heap::length_symbol(), &lookup);
|
| + result->LocalLookup(HEAP->length_symbol(), &lookup);
|
| ASSERT(lookup.IsProperty() && (lookup.type() == FIELD));
|
| ASSERT(lookup.GetFieldIndex() == Heap::kArgumentsLengthIndex);
|
|
|
| @@ -1122,15 +1087,16 @@
|
|
|
| { // --- context extension
|
| // Create a function for the context extension objects.
|
| - Handle<Code> code = Handle<Code>(Builtins::builtin(Builtins::Illegal));
|
| + Handle<Code> code = Handle<Code>(
|
| + Isolate::Current()->builtins()->builtin(Builtins::Illegal));
|
| Handle<JSFunction> context_extension_fun =
|
| - Factory::NewFunction(Factory::empty_symbol(),
|
| + FACTORY->NewFunction(FACTORY->empty_symbol(),
|
| JS_CONTEXT_EXTENSION_OBJECT_TYPE,
|
| JSObject::kHeaderSize,
|
| code,
|
| true);
|
|
|
| - Handle<String> name = Factory::LookupAsciiSymbol("context_extension");
|
| + Handle<String> name = FACTORY->LookupAsciiSymbol("context_extension");
|
| context_extension_fun->shared()->set_instance_class_name(*name);
|
| global_context()->set_context_extension_function(*context_extension_fun);
|
| }
|
| @@ -1139,9 +1105,10 @@
|
| {
|
| // Setup the call-as-function delegate.
|
| Handle<Code> code =
|
| - Handle<Code>(Builtins::builtin(Builtins::HandleApiCallAsFunction));
|
| + Handle<Code>(Isolate::Current()->builtins()->builtin(
|
| + Builtins::HandleApiCallAsFunction));
|
| Handle<JSFunction> delegate =
|
| - Factory::NewFunction(Factory::empty_symbol(), JS_OBJECT_TYPE,
|
| + FACTORY->NewFunction(FACTORY->empty_symbol(), JS_OBJECT_TYPE,
|
| JSObject::kHeaderSize, code, true);
|
| global_context()->set_call_as_function_delegate(*delegate);
|
| delegate->shared()->DontAdaptArguments();
|
| @@ -1150,44 +1117,47 @@
|
| {
|
| // Setup the call-as-constructor delegate.
|
| Handle<Code> code =
|
| - Handle<Code>(Builtins::builtin(Builtins::HandleApiCallAsConstructor));
|
| + Handle<Code>(Isolate::Current()->builtins()->builtin(
|
| + Builtins::HandleApiCallAsConstructor));
|
| Handle<JSFunction> delegate =
|
| - Factory::NewFunction(Factory::empty_symbol(), JS_OBJECT_TYPE,
|
| + FACTORY->NewFunction(FACTORY->empty_symbol(), JS_OBJECT_TYPE,
|
| JSObject::kHeaderSize, code, true);
|
| global_context()->set_call_as_constructor_delegate(*delegate);
|
| delegate->shared()->DontAdaptArguments();
|
| }
|
|
|
| // Initialize the out of memory slot.
|
| - global_context()->set_out_of_memory(Heap::false_value());
|
| + global_context()->set_out_of_memory(HEAP->false_value());
|
|
|
| // Initialize the data slot.
|
| - global_context()->set_data(Heap::undefined_value());
|
| + global_context()->set_data(HEAP->undefined_value());
|
| }
|
|
|
|
|
| bool Genesis::CompileBuiltin(int index) {
|
| Vector<const char> name = Natives::GetScriptName(index);
|
| - Handle<String> source_code = Bootstrapper::NativesSourceLookup(index);
|
| + Handle<String> source_code =
|
| + Isolate::Current()->bootstrapper()->NativesSourceLookup(index);
|
| return CompileNative(name, source_code);
|
| }
|
|
|
|
|
| bool Genesis::CompileNative(Vector<const char> name, Handle<String> source) {
|
| HandleScope scope;
|
| + Isolate* isolate = Isolate::Current();
|
| #ifdef ENABLE_DEBUGGER_SUPPORT
|
| - Debugger::set_compiling_natives(true);
|
| + isolate->debugger()->set_compiling_natives(true);
|
| #endif
|
| bool result = CompileScriptCached(name,
|
| source,
|
| NULL,
|
| NULL,
|
| - Handle<Context>(Top::context()),
|
| + Handle<Context>(isolate->context()),
|
| true);
|
| - ASSERT(Top::has_pending_exception() != result);
|
| - if (!result) Top::clear_pending_exception();
|
| + ASSERT(isolate->has_pending_exception() != result);
|
| + if (!result) isolate->clear_pending_exception();
|
| #ifdef ENABLE_DEBUGGER_SUPPORT
|
| - Debugger::set_compiling_natives(false);
|
| + isolate->debugger()->set_compiling_natives(false);
|
| #endif
|
| return result;
|
| }
|
| @@ -1206,7 +1176,7 @@
|
| // function and insert it into the cache.
|
| if (cache == NULL || !cache->Lookup(name, &function_info)) {
|
| ASSERT(source->IsAsciiRepresentation());
|
| - Handle<String> script_name = Factory::NewStringFromUtf8(name);
|
| + Handle<String> script_name = FACTORY->NewStringFromUtf8(name);
|
| function_info = Compiler::Compile(
|
| source,
|
| script_name,
|
| @@ -1229,7 +1199,7 @@
|
| ? Handle<Context>(top_context->runtime_context())
|
| : top_context);
|
| Handle<JSFunction> fun =
|
| - Factory::NewFunctionFromSharedFunctionInfo(function_info, context);
|
| + FACTORY->NewFunctionFromSharedFunctionInfo(function_info, context);
|
|
|
| // Call function using either the runtime object or the global
|
| // object as the receiver. Provide no parameters.
|
| @@ -1246,10 +1216,11 @@
|
|
|
|
|
| #define INSTALL_NATIVE(Type, name, var) \
|
| - Handle<String> var##_name = Factory::LookupAsciiSymbol(name); \
|
| + Handle<String> var##_name = FACTORY->LookupAsciiSymbol(name); \
|
| global_context()->set_##var(Type::cast( \
|
| global_context()->builtins()->GetPropertyNoExceptionThrown(*var##_name)));
|
|
|
| +
|
| void Genesis::InstallNativeFunctions() {
|
| HandleScope scope;
|
| INSTALL_NATIVE(JSFunction, "CreateDate", create_date_fun);
|
| @@ -1273,21 +1244,24 @@
|
|
|
| bool Genesis::InstallNatives() {
|
| HandleScope scope;
|
| + Isolate* isolate = Isolate::Current();
|
| + Factory* factory = isolate->factory();
|
|
|
| // 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>(Builtins::builtin(Builtins::Illegal));
|
| + Handle<Code> code = Handle<Code>(
|
| + isolate->builtins()->builtin(Builtins::Illegal));
|
| Handle<JSFunction> builtins_fun =
|
| - Factory::NewFunction(Factory::empty_symbol(), JS_BUILTINS_OBJECT_TYPE,
|
| + 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);
|
| @@ -1298,7 +1272,7 @@
|
| // 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);
|
|
|
| @@ -1307,12 +1281,12 @@
|
|
|
| // 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() == *Top::global_context());
|
| + factory->NewFunction(factory->empty_symbol(), factory->undefined_value());
|
| + 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);
|
| @@ -1321,113 +1295,113 @@
|
| // Builtin functions for Script.
|
| Handle<JSFunction> script_fun =
|
| InstallFunction(builtins, "Script", JS_VALUE_TYPE, JSValue::kSize,
|
| - Top::initial_object_prototype(), Builtins::Illegal,
|
| - false);
|
| + isolate->initial_object_prototype(),
|
| + Builtins::Illegal, false);
|
| Handle<JSObject> prototype =
|
| - Factory::NewJSObject(Top::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);
|
|
|
| @@ -1435,9 +1409,9 @@
|
| 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,
|
| @@ -1445,10 +1419,11 @@
|
| // objects, that JavaScript code may not access.
|
| Handle<JSFunction> opaque_reference_fun =
|
| InstallFunction(builtins, "OpaqueReference", JS_VALUE_TYPE,
|
| - JSValue::kSize, Top::initial_object_prototype(),
|
| + JSValue::kSize,
|
| + isolate->initial_object_prototype(),
|
| Builtins::Illegal, false);
|
| Handle<JSObject> prototype =
|
| - Factory::NewJSObject(Top::object_function(), TENURED);
|
| + factory->NewJSObject(isolate->object_function(), TENURED);
|
| SetPrototype(opaque_reference_fun, prototype);
|
| global_context()->set_opaque_reference_function(*opaque_reference_fun);
|
| }
|
| @@ -1467,23 +1442,23 @@
|
| "InternalArray",
|
| JS_ARRAY_TYPE,
|
| JSArray::kSize,
|
| - Top::initial_object_prototype(),
|
| + isolate->initial_object_prototype(),
|
| Builtins::ArrayCode,
|
| true);
|
| Handle<JSObject> prototype =
|
| - Factory::NewJSObject(Top::object_function(), TENURED);
|
| + factory->NewJSObject(isolate->object_function(), TENURED);
|
| SetPrototype(array_function, prototype);
|
|
|
| array_function->shared()->set_construct_stub(
|
| - Builtins::builtin(Builtins::ArrayConstructCode));
|
| + isolate->builtins()->builtin(Builtins::ArrayConstructCode));
|
| 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(
|
| @@ -1520,9 +1495,9 @@
|
| 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(Top::global(), key));
|
| + Handle<JSFunction>::cast(GetProperty(isolate->global(), key));
|
| Handle<JSObject> proto =
|
| Handle<JSObject>(JSObject::cast(function->instance_prototype()));
|
|
|
| @@ -1564,7 +1539,7 @@
|
|
|
| // 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.
|
| @@ -1578,13 +1553,13 @@
|
| 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++);
|
| @@ -1592,7 +1567,7 @@
|
| }
|
|
|
| {
|
| - FieldDescriptor input_field(Heap::input_symbol(),
|
| + FieldDescriptor input_field(HEAP->input_symbol(),
|
| JSRegExpResult::kInputIndex,
|
| NONE,
|
| enum_index++);
|
| @@ -1624,13 +1599,13 @@
|
| const char* period_pos = strchr(holder_expr, '.');
|
| if (period_pos == NULL) {
|
| return Handle<JSObject>::cast(
|
| - GetProperty(global, Factory::LookupAsciiSymbol(holder_expr)));
|
| + GetProperty(global, FACTORY->LookupAsciiSymbol(holder_expr)));
|
| }
|
| ASSERT_EQ(".prototype", period_pos);
|
| Vector<const char> property(holder_expr,
|
| static_cast<int>(period_pos - holder_expr));
|
| Handle<JSFunction> function = Handle<JSFunction>::cast(
|
| - GetProperty(global, Factory::LookupSymbol(property)));
|
| + GetProperty(global, FACTORY->LookupSymbol(property)));
|
| return Handle<JSObject>(JSObject::cast(function->prototype()));
|
| }
|
|
|
| @@ -1638,7 +1613,7 @@
|
| static void InstallBuiltinFunctionId(Handle<JSObject> holder,
|
| const char* function_name,
|
| BuiltinFunctionId id) {
|
| - Handle<String> name = Factory::LookupAsciiSymbol(function_name);
|
| + 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));
|
| @@ -1670,7 +1645,7 @@
|
| 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));
|
| + *FACTORY->NewFixedArrayWithHoles(array_size, TENURED));
|
| cache->set(JSFunctionResultCache::kFactoryIndex, factory);
|
| cache->MakeZeroSize();
|
| return cache;
|
| @@ -1684,7 +1659,7 @@
|
| #undef F
|
| ;
|
|
|
| - Handle<FixedArray> caches = Factory::NewFixedArray(kNumberOfCaches, TENURED);
|
| + Handle<FixedArray> caches = FACTORY->NewFixedArray(kNumberOfCaches, TENURED);
|
|
|
| int index = 0;
|
|
|
| @@ -1703,19 +1678,17 @@
|
|
|
| void Genesis::InitializeNormalizedMapCaches() {
|
| Handle<FixedArray> array(
|
| - Factory::NewFixedArray(NormalizedMapCache::kEntries, TENURED));
|
| + FACTORY->NewFixedArray(NormalizedMapCache::kEntries, TENURED));
|
| global_context()->set_normalized_map_cache(NormalizedMapCache::cast(*array));
|
| }
|
|
|
|
|
| -int BootstrapperActive::nesting_ = 0;
|
| -
|
| -
|
| bool Bootstrapper::InstallExtensions(Handle<Context> global_context,
|
| v8::ExtensionConfiguration* extensions) {
|
| + Isolate* isolate = Isolate::Current();
|
| BootstrapperActive active;
|
| - SaveContext saved_context;
|
| - Top::set_context(*global_context);
|
| + SaveContext saved_context(isolate);
|
| + isolate->set_context(*global_context);
|
| if (!Genesis::InstallExtensions(global_context, extensions)) return false;
|
| Genesis::InstallSpecialObjects(global_context);
|
| return true;
|
| @@ -1729,14 +1702,14 @@
|
| // Expose the natives in global if a name for it is specified.
|
| if (FLAG_expose_natives_as != NULL && strlen(FLAG_expose_natives_as) != 0) {
|
| Handle<String> natives_string =
|
| - Factory::LookupAsciiSymbol(FLAG_expose_natives_as);
|
| + FACTORY->LookupAsciiSymbol(FLAG_expose_natives_as);
|
| SetLocalPropertyNoThrow(js_global, natives_string,
|
| Handle<JSObject>(js_global->builtins()), DONT_ENUM);
|
| }
|
|
|
| Handle<Object> Error = GetProperty(js_global, "Error");
|
| if (Error->IsJSObject()) {
|
| - Handle<String> name = Factory::LookupAsciiSymbol("stackTraceLimit");
|
| + Handle<String> name = FACTORY->LookupAsciiSymbol("stackTraceLimit");
|
| SetLocalPropertyNoThrow(Handle<JSObject>::cast(Error),
|
| name,
|
| Handle<Smi>(Smi::FromInt(FLAG_stack_trace_limit)),
|
| @@ -1746,18 +1719,19 @@
|
| #ifdef ENABLE_DEBUGGER_SUPPORT
|
| // Expose the debug global object in global if a name for it is specified.
|
| if (FLAG_expose_debug_as != NULL && strlen(FLAG_expose_debug_as) != 0) {
|
| + Debug* debug = Isolate::Current()->debug();
|
| // If loading fails we just bail out without installing the
|
| // debugger but without tanking the whole context.
|
| - if (!Debug::Load()) return;
|
| + if (!debug->Load()) return;
|
| // Set the security token for the debugger context to the same as
|
| // the shell global context to allow calling between these (otherwise
|
| // exposing debug global object doesn't make much sense).
|
| - Debug::debug_context()->set_security_token(
|
| + debug->debug_context()->set_security_token(
|
| global_context->security_token());
|
|
|
| Handle<String> debug_string =
|
| - Factory::LookupAsciiSymbol(FLAG_expose_debug_as);
|
| - Handle<Object> global_proxy(Debug::debug_context()->global_proxy());
|
| + FACTORY->LookupAsciiSymbol(FLAG_expose_debug_as);
|
| + Handle<Object> global_proxy(debug->debug_context()->global_proxy());
|
| SetLocalPropertyNoThrow(js_global, debug_string, global_proxy, DONT_ENUM);
|
| }
|
| #endif
|
| @@ -1766,6 +1740,10 @@
|
|
|
| bool Genesis::InstallExtensions(Handle<Context> global_context,
|
| v8::ExtensionConfiguration* extensions) {
|
| + // TODO(isolates): Extensions on multiple isolates may take a little more
|
| + // effort. (The external API reads 'ignore'-- does that mean
|
| + // we can break the interface?)
|
| +
|
| // Clear coloring of extension list
|
| v8::RegisteredExtension* current = v8::RegisteredExtension::first_extension();
|
| while (current != NULL) {
|
| @@ -1834,16 +1812,18 @@
|
| if (!InstallExtension(extension->dependencies()[i])) return false;
|
| }
|
| Vector<const char> source = CStrVector(extension->source());
|
| - Handle<String> source_code = Factory::NewStringFromAscii(source);
|
| + Handle<String> source_code = FACTORY->NewStringFromAscii(source);
|
| bool result = CompileScriptCached(CStrVector(extension->name()),
|
| source_code,
|
| - &extensions_cache,
|
| + Isolate::Current()->bootstrapper()->
|
| + extensions_cache(),
|
| extension,
|
| - Handle<Context>(Top::context()),
|
| + Handle<Context>(
|
| + Isolate::Current()->context()),
|
| false);
|
| - ASSERT(Top::has_pending_exception() != result);
|
| + ASSERT(Isolate::Current()->has_pending_exception() != result);
|
| if (!result) {
|
| - Top::clear_pending_exception();
|
| + Isolate::Current()->clear_pending_exception();
|
| }
|
| current->set_state(v8::INSTALLED);
|
| return result;
|
| @@ -1854,7 +1834,7 @@
|
| HandleScope scope;
|
| 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));
|
| @@ -1907,8 +1887,8 @@
|
| Handle<JSObject> obj =
|
| Execution::InstantiateObject(object_template, &pending_exception);
|
| if (pending_exception) {
|
| - ASSERT(Top::has_pending_exception());
|
| - Top::clear_pending_exception();
|
| + ASSERT(Isolate::Current()->has_pending_exception());
|
| + Isolate::Current()->clear_pending_exception();
|
| return false;
|
| }
|
| TransferObject(obj, object);
|
| @@ -1999,7 +1979,7 @@
|
| // Cloning the elements array is sufficient.
|
| Handle<FixedArray> from_elements =
|
| Handle<FixedArray>(FixedArray::cast(from->elements()));
|
| - Handle<FixedArray> to_elements = Factory::CopyFixedArray(from_elements);
|
| + Handle<FixedArray> to_elements = FACTORY->CopyFixedArray(from_elements);
|
| to->set_elements(*to_elements);
|
| }
|
|
|
| @@ -2015,7 +1995,7 @@
|
|
|
| // 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);
|
| }
|
| @@ -2039,6 +2019,7 @@
|
| Genesis::Genesis(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;
|
| @@ -2046,15 +2027,15 @@
|
| // Before creating the roots we must save the context and restore it
|
| // on all function exits.
|
| HandleScope scope;
|
| - SaveContext saved_context;
|
| + SaveContext saved_context(isolate);
|
|
|
| Handle<Context> new_context = Snapshot::NewContextFromSnapshot();
|
| if (!new_context.is_null()) {
|
| global_context_ =
|
| - Handle<Context>::cast(GlobalHandles::Create(*new_context));
|
| + Handle<Context>::cast(isolate->global_handles()->Create(*new_context));
|
| AddToWeakGlobalContextList(*global_context_);
|
| - Top::set_context(*global_context_);
|
| - i::Counters::contexts_created_by_snapshot.Increment();
|
| + isolate->set_context(*global_context_);
|
| + isolate->counters()->contexts_created_by_snapshot()->Increment();
|
| Handle<GlobalObject> inner_global;
|
| Handle<JSGlobalProxy> global_proxy =
|
| CreateNewGlobals(global_template,
|
| @@ -2082,7 +2063,7 @@
|
| MakeFunctionInstancePrototypeWritable();
|
|
|
| if (!ConfigureGlobalObjects(global_template)) return;
|
| - i::Counters::contexts_created_from_scratch.Increment();
|
| + isolate->counters()->contexts_created_from_scratch()->Increment();
|
| }
|
|
|
| result_ = global_context_;
|
| @@ -2093,46 +2074,28 @@
|
|
|
| // Reserve space for statics needing saving and restoring.
|
| int Bootstrapper::ArchiveSpacePerThread() {
|
| - return BootstrapperActive::ArchiveSpacePerThread();
|
| + return sizeof(NestingCounterType);
|
| }
|
|
|
|
|
| // Archive statics that are thread local.
|
| char* Bootstrapper::ArchiveState(char* to) {
|
| - return BootstrapperActive::ArchiveState(to);
|
| + *reinterpret_cast<NestingCounterType*>(to) = nesting_;
|
| + nesting_ = 0;
|
| + return to + sizeof(NestingCounterType);
|
| }
|
|
|
|
|
| // Restore statics that are thread local.
|
| char* Bootstrapper::RestoreState(char* from) {
|
| - return BootstrapperActive::RestoreState(from);
|
| + nesting_ = *reinterpret_cast<NestingCounterType*>(from);
|
| + return from + sizeof(NestingCounterType);
|
| }
|
|
|
|
|
| // Called when the top-level V8 mutex is destroyed.
|
| void Bootstrapper::FreeThreadResources() {
|
| - ASSERT(!BootstrapperActive::IsActive());
|
| + ASSERT(!IsActive());
|
| }
|
|
|
| -
|
| -// Reserve space for statics needing saving and restoring.
|
| -int BootstrapperActive::ArchiveSpacePerThread() {
|
| - return sizeof(nesting_);
|
| -}
|
| -
|
| -
|
| -// Archive statics that are thread local.
|
| -char* BootstrapperActive::ArchiveState(char* to) {
|
| - *reinterpret_cast<int*>(to) = nesting_;
|
| - nesting_ = 0;
|
| - return to + sizeof(nesting_);
|
| -}
|
| -
|
| -
|
| -// Restore statics that are thread local.
|
| -char* BootstrapperActive::RestoreState(char* from) {
|
| - nesting_ = *reinterpret_cast<int*>(from);
|
| - return from + sizeof(nesting_);
|
| -}
|
| -
|
| } } // namespace v8::internal
|
|
|