Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(658)

Unified Diff: vm/object.cc

Issue 11648006: Create read only handles for empty_array and sentinel objects (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/runtime/
Patch Set: Created 8 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « vm/object.h ('k') | vm/object_store.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « vm/object.h ('k') | vm/object_store.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698