Index: runtime/vm/object.cc |
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc |
index 502e747371cf65c5ea75010f1ea648d27e5904a4..e57f9351610eaa783069667bd564321564a524c9 100644 |
--- a/runtime/vm/object.cc |
+++ b/runtime/vm/object.cc |
@@ -113,6 +113,7 @@ Instance* Object::null_instance_ = NULL; |
TypeArguments* Object::null_type_arguments_ = NULL; |
Array* Object::empty_array_ = NULL; |
Array* Object::zero_array_ = NULL; |
+Context* Object::empty_context_ = NULL; |
ContextScope* Object::empty_context_scope_ = NULL; |
ObjectPool* Object::empty_object_pool_ = NULL; |
PcDescriptors* Object::empty_descriptors_ = NULL; |
@@ -516,6 +517,7 @@ void Object::InitOnce(Isolate* isolate) { |
null_type_arguments_ = TypeArguments::ReadOnlyHandle(); |
empty_array_ = Array::ReadOnlyHandle(); |
zero_array_ = Array::ReadOnlyHandle(); |
+ empty_context_ = Context::ReadOnlyHandle(); |
empty_context_scope_ = ContextScope::ReadOnlyHandle(); |
empty_object_pool_ = ObjectPool::ReadOnlyHandle(); |
empty_descriptors_ = PcDescriptors::ReadOnlyHandle(); |
@@ -777,6 +779,17 @@ void Object::InitOnce(Isolate* isolate) { |
zero_array_->SetCanonical(); |
} |
+ // Allocate and initialize the empty context object. |
+ { |
+ uword address = heap->Allocate(Context::InstanceSize(0), Heap::kOld); |
+ InitializeObject(address, kContextCid, Context::InstanceSize(0), true); |
+ Context::initializeHandle(empty_context_, reinterpret_cast<RawContext*>( |
+ address + kHeapObjectTag)); |
+ empty_context_->StoreNonPointer(&empty_context_->raw_ptr()->num_variables_, |
+ 0); |
+ empty_context_->SetCanonical(); |
+ } |
+ |
// Allocate and initialize the canonical empty context scope object. |
{ |
uword address = heap->Allocate(ContextScope::InstanceSize(0), Heap::kOld); |
@@ -922,6 +935,8 @@ void Object::InitOnce(Isolate* isolate) { |
ASSERT(empty_array_->IsArray()); |
ASSERT(!zero_array_->IsSmi()); |
ASSERT(zero_array_->IsArray()); |
+ ASSERT(!empty_context_->IsSmi()); |
+ ASSERT(empty_context_->IsContext()); |
ASSERT(!empty_context_scope_->IsSmi()); |
ASSERT(empty_context_scope_->IsContextScope()); |
ASSERT(!empty_descriptors_->IsSmi()); |
@@ -1268,9 +1283,6 @@ RawError* Object::Init(Isolate* isolate, kernel::Program* kernel_program) { |
GrowableObjectArray::Handle(zone, GrowableObjectArray::New()); |
object_store->set_pending_classes(pending_classes); |
- Context& context = Context::Handle(zone, Context::New(0, Heap::kOld)); |
- object_store->set_empty_context(context); |
- |
// Now that the symbol table is initialized and that the core dictionary as |
// well as the core implementation dictionary have been setup, preallocate |
// remaining classes and register them by name in the dictionaries. |
@@ -1787,9 +1799,6 @@ RawError* Object::Init(Isolate* isolate, kernel::Program* kernel_program) { |
cls = Class::New<MirrorReference>(); |
cls = Class::New<UserTag>(); |
- |
- const Context& context = Context::Handle(zone, Context::New(0, Heap::kOld)); |
- object_store->set_empty_context(context); |
} |
return Error::null(); |
} |
@@ -6930,12 +6939,8 @@ void Function::BuildSignatureParameters( |
RawInstance* Function::ImplicitStaticClosure() const { |
if (implicit_static_closure() == Instance::null()) { |
- Thread* thread = Thread::Current(); |
- Isolate* isolate = thread->isolate(); |
- Zone* zone = thread->zone(); |
- ObjectStore* object_store = isolate->object_store(); |
- const Context& context = |
- Context::Handle(zone, object_store->empty_context()); |
+ Zone* zone = Thread::Current()->zone(); |
+ const Context& context = Object::empty_context(); |
const TypeArguments& instantiator = TypeArguments::Handle(zone); |
Instance& closure = Instance::Handle( |
zone, Closure::New(instantiator, *this, context, Heap::kOld)); |