| Index: vm/object.cc
|
| ===================================================================
|
| --- vm/object.cc (revision 16415)
|
| +++ vm/object.cc (working copy)
|
| @@ -59,11 +59,11 @@
|
| #error RAW_NULL should not be defined.
|
| #endif
|
| #define RAW_NULL kHeapObjectTag
|
| -RawObject* Object::null_ = reinterpret_cast<RawInstance*>(RAW_NULL);
|
| -RawArray* Object::empty_array_ = reinterpret_cast<RawArray*>(RAW_NULL);
|
| -RawInstance* Object::sentinel_ = reinterpret_cast<RawInstance*>(RAW_NULL);
|
| -RawInstance* Object::transition_sentinel_ =
|
| - reinterpret_cast<RawInstance*>(RAW_NULL);
|
| +Array* Object::empty_array_ = NULL;
|
| +Instance* Object::sentinel_ = NULL;
|
| +Instance* Object::transition_sentinel_ = NULL;
|
| +
|
| +RawObject* Object::null_ = reinterpret_cast<RawObject*>(RAW_NULL);
|
| RawClass* Object::class_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
|
| RawClass* Object::null_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
|
| RawClass* Object::dynamic_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
|
| @@ -240,6 +240,12 @@
|
| Smi::handle_vtable_ = fake_smi.vtable();
|
| }
|
|
|
| + // Allocate the read only object handles here.
|
| + empty_array_ = reinterpret_cast<Array*>(Dart::AllocateReadOnlyHandle());
|
| + sentinel_ = reinterpret_cast<Instance*>(Dart::AllocateReadOnlyHandle());
|
| + transition_sentinel_ =
|
| + reinterpret_cast<Instance*>(Dart::AllocateReadOnlyHandle());
|
| +
|
| Isolate* isolate = Isolate::Current();
|
| Heap* heap = isolate->heap();
|
| // Allocate and initialize the null instance.
|
| @@ -252,9 +258,9 @@
|
| InitializeObject(address, kNullCid, Instance::InstanceSize());
|
| }
|
|
|
| - // Initialize object_store empty array to null_ in order to be able to check
|
| + // Initialize the empty array handle to null_ in order to be able to check
|
| // if the empty array was allocated (RAW_NULL is not available).
|
| - empty_array_ = Array::null();
|
| + *empty_array_ = Array::null();
|
|
|
| Class& cls = Class::Handle();
|
|
|
| @@ -294,15 +300,11 @@
|
|
|
| // Allocate and initialize the sentinel values of Null class.
|
| {
|
| - Instance& sentinel = Instance::Handle();
|
| - sentinel ^=
|
| + *sentinel_ ^=
|
| Object::Allocate(kNullCid, Instance::InstanceSize(), Heap::kOld);
|
| - sentinel_ = sentinel.raw();
|
|
|
| - Instance& transition_sentinel = Instance::Handle();
|
| - transition_sentinel ^=
|
| + *transition_sentinel_ ^=
|
| Object::Allocate(kNullCid, Instance::InstanceSize(), Heap::kOld);
|
| - transition_sentinel_ = transition_sentinel.raw();
|
| }
|
|
|
| cls = Class::New<Instance>(kDynamicCid);
|
| @@ -420,9 +422,9 @@
|
| // Allocate and initialize the empty_array instance.
|
| {
|
| uword address = heap->Allocate(Array::InstanceSize(0), Heap::kOld);
|
| - empty_array_ = reinterpret_cast<RawArray*>(address + kHeapObjectTag);
|
| + *empty_array_ = reinterpret_cast<RawArray*>(address + kHeapObjectTag);
|
| InitializeObject(address, kArrayCid, Array::InstanceSize(0));
|
| - empty_array_->ptr()->length_ = Smi::New(0);
|
| + empty_array_->raw()->ptr()->length_ = Smi::New(0);
|
| }
|
| }
|
|
|
| @@ -1253,9 +1255,13 @@
|
| };
|
|
|
|
|
| +bool Object::IsReadOnlyHandle() const {
|
| + return Dart::IsReadOnlyHandle(reinterpret_cast<uword>(this));
|
| +}
|
| +
|
| +
|
| bool Object::IsNotTemporaryScopedHandle() const {
|
| - return (IsZoneHandle() ||
|
| - Symbols::IsPredefinedHandle(reinterpret_cast<uword>(this)));
|
| + return (IsZoneHandle() || IsReadOnlyHandle());
|
| }
|
|
|
|
|
| @@ -1418,15 +1424,15 @@
|
|
|
| // Initialize class fields of type Array with empty array.
|
| void Class::InitEmptyFields() {
|
| - if (Object::empty_array() == Array::null()) {
|
| + if (Object::empty_array().raw() == Array::null()) {
|
| // The empty array has not been initialized yet.
|
| return;
|
| }
|
| - StorePointer(&raw_ptr()->interfaces_, Object::empty_array());
|
| - StorePointer(&raw_ptr()->constants_, Object::empty_array());
|
| - StorePointer(&raw_ptr()->canonical_types_, Object::empty_array());
|
| - StorePointer(&raw_ptr()->functions_, Object::empty_array());
|
| - StorePointer(&raw_ptr()->fields_, Object::empty_array());
|
| + StorePointer(&raw_ptr()->interfaces_, Object::empty_array().raw());
|
| + StorePointer(&raw_ptr()->constants_, Object::empty_array().raw());
|
| + StorePointer(&raw_ptr()->canonical_types_, Object::empty_array().raw());
|
| + StorePointer(&raw_ptr()->functions_, Object::empty_array().raw());
|
| + StorePointer(&raw_ptr()->fields_, Object::empty_array().raw());
|
| }
|
|
|
|
|
| @@ -1840,15 +1846,14 @@
|
| const intptr_t token_pos = signature_function.token_pos();
|
| Class& result = Class::Handle(New<Instance>(name, script, token_pos));
|
| const Type& super_type = Type::Handle(Type::ObjectType());
|
| - const Array& empty_array = Array::Handle(Object::empty_array());
|
| ASSERT(!super_type.IsNull());
|
| result.set_instance_size(Closure::InstanceSize());
|
| result.set_next_field_offset(Closure::InstanceSize());
|
| result.set_super_type(super_type);
|
| result.set_signature_function(signature_function);
|
| result.set_type_parameters(type_parameters);
|
| - result.SetFields(empty_array);
|
| - result.SetFunctions(empty_array);
|
| + result.SetFields(Object::empty_array());
|
| + result.SetFunctions(Object::empty_array());
|
| result.set_type_arguments_field_offset(
|
| Closure::type_arguments_offset());
|
| // Implements interface "Function".
|
| @@ -1886,10 +1891,9 @@
|
| int field_count) {
|
| Class& cls = Class::Handle(library.LookupClass(name));
|
| if (cls.IsNull()) {
|
| - const Array& empty_array = Array::Handle(Object::empty_array());
|
| cls = New<Instance>(name, Script::Handle(), Scanner::kDummyTokenIndex);
|
| - cls.SetFields(empty_array);
|
| - cls.SetFunctions(empty_array);
|
| + cls.SetFields(Object::empty_array());
|
| + cls.SetFunctions(Object::empty_array());
|
| // Set super class to Object.
|
| cls.set_super_type(Type::Handle(Type::ObjectType()));
|
| // Compute instance size. First word contains a pointer to a properly
|
| @@ -3939,9 +3943,8 @@
|
| ASSERT(name.IsOneByteString());
|
| ASSERT(!owner.IsNull());
|
| const Function& result = Function::Handle(Function::New());
|
| - const Array& empty_array = Array::Handle(Object::empty_array());
|
| - result.set_parameter_types(empty_array);
|
| - result.set_parameter_names(empty_array);
|
| + result.set_parameter_types(Object::empty_array());
|
| + result.set_parameter_names(Object::empty_array());
|
| result.set_name(name);
|
| result.set_kind(kind);
|
| result.set_is_static(is_static);
|
| @@ -5959,7 +5962,7 @@
|
| // Convenience function to determine whether the export list is
|
| // non-empty.
|
| bool Library::HasExports() const {
|
| - return exports() != Object::empty_array();
|
| + return exports() != Object::empty_array().raw();
|
| }
|
|
|
|
|
| @@ -6010,11 +6013,11 @@
|
| result.StorePointer(&result.raw_ptr()->name_, url.raw());
|
| result.StorePointer(&result.raw_ptr()->url_, url.raw());
|
| result.raw_ptr()->private_key_ = Scanner::AllocatePrivateKey(result);
|
| - result.raw_ptr()->dictionary_ = Object::empty_array();
|
| - result.raw_ptr()->anonymous_classes_ = Object::empty_array();
|
| + result.raw_ptr()->dictionary_ = Object::empty_array().raw();
|
| + result.raw_ptr()->anonymous_classes_ = Object::empty_array().raw();
|
| result.raw_ptr()->num_anonymous_ = 0;
|
| - result.raw_ptr()->imports_ = Object::empty_array();
|
| - result.raw_ptr()->exports_ = Object::empty_array();
|
| + result.raw_ptr()->imports_ = Object::empty_array().raw();
|
| + result.raw_ptr()->exports_ = Object::empty_array().raw();
|
| result.raw_ptr()->loaded_scripts_ = Array::null();
|
| result.set_native_entry_resolver(NULL);
|
| result.raw_ptr()->corelib_imported_ = true;
|
| @@ -7068,7 +7071,8 @@
|
| if (count == 0) {
|
| comments = new Comments(Object::empty_array());
|
| } else {
|
| - comments = new Comments(Array::New(count * kNumberOfEntries));
|
| + const Array& data = Array::Handle(Array::New(count * kNumberOfEntries));
|
| + comments = new Comments(data);
|
| }
|
| return *comments;
|
| }
|
| @@ -7105,8 +7109,8 @@
|
| }
|
|
|
|
|
| -Code::Comments::Comments(RawArray* comments)
|
| - : comments_(Array::Handle(comments)) {
|
| +Code::Comments::Comments(const Array& comments)
|
| + : comments_(comments) {
|
| }
|
|
|
|
|
| @@ -7164,7 +7168,7 @@
|
|
|
|
|
| const Code::Comments& Code::comments() const {
|
| - Comments* comments = new Code::Comments(raw_ptr()->comments_);
|
| + Comments* comments = new Code::Comments(Array::Handle(raw_ptr()->comments_));
|
| return *comments;
|
| }
|
|
|
| @@ -8418,8 +8422,8 @@
|
| // Object::transition_sentinel() if type checks were not eliminated at
|
| // compile time. Both sentinels are instances of the Null class, but they
|
| // are not the Object::null() instance.
|
| - ASSERT((raw() == Object::transition_sentinel()) ||
|
| - (raw() == Object::sentinel()));
|
| + ASSERT((raw() == Object::transition_sentinel().raw()) ||
|
| + (raw() == Object::sentinel().raw()));
|
| ASSERT(!FLAG_eliminate_type_checks);
|
| return true; // We are doing an instance of test as part of a type check.
|
| }
|
| @@ -8572,9 +8576,9 @@
|
| const char* Instance::ToCString() const {
|
| if (IsNull()) {
|
| return "null";
|
| - } else if (raw() == Object::sentinel()) {
|
| + } else if (raw() == Object::sentinel().raw()) {
|
| return "sentinel";
|
| - } else if (raw() == Object::transition_sentinel()) {
|
| + } else if (raw() == Object::transition_sentinel().raw()) {
|
| return "transition_sentinel";
|
| } else if (Isolate::Current()->no_gc_scope_depth() > 0) {
|
| // Can occur when running disassembler.
|
| @@ -11473,7 +11477,6 @@
|
| intptr_t capacity_len = growable_array.Capacity();
|
| Isolate* isolate = Isolate::Current();
|
| const Array& array = Array::Handle(isolate, growable_array.data());
|
| - const Array& new_array = Array::Handle(isolate, Object::empty_array());
|
| intptr_t capacity_size = Array::InstanceSize(capacity_len);
|
| intptr_t used_size = Array::InstanceSize(used_len);
|
| NoGCScope no_gc;
|
| @@ -11487,7 +11490,7 @@
|
|
|
| // Null the GrowableObjectArray, we are removing it's backing array.
|
| growable_array.SetLength(0);
|
| - growable_array.SetData(new_array);
|
| + growable_array.SetData(Object::empty_array());
|
|
|
| // If there is any left over space fill it with either an Array object or
|
| // just a plain object (depending on the amount of left over space) so
|
|
|