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

Unified Diff: runtime/vm/raw_object.cc

Issue 10538022: Do not reuse tags_ field to store next_ pointer of FreeListElement. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 8 years, 6 months 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
« runtime/vm/freelist.h ('K') | « runtime/vm/raw_object.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/raw_object.cc
diff --git a/runtime/vm/raw_object.cc b/runtime/vm/raw_object.cc
index b800066f9635971d65f3651a5560bf982e5a5611..a22adbe63ff0fd3365b82157b5b2ba65e5a265e8 100644
--- a/runtime/vm/raw_object.cc
+++ b/runtime/vm/raw_object.cc
@@ -38,11 +38,6 @@ intptr_t RawObject::SizeFromClass() const {
// Only reasonable to be called on heap objects.
ASSERT(IsHeapObject());
- // TODO(vegorov): this should be moved to fast path when class_ is eliminated.
- if (FreeBit::decode(ptr()->tags_)) {
- return reinterpret_cast<FreeListElement*>(ptr())->size();
- }
-
RawClass* raw_class = Isolate::Current()->class_table()->At(GetClassId());
intptr_t instance_size = raw_class->ptr()->instance_size_;
ObjectKind instance_kind = raw_class->ptr()->instance_kind_;
@@ -233,7 +228,7 @@ intptr_t RawObject::SizeFromClass() const {
ASSERT(FreeBit::decode(ptr()->tags_));
uword addr = RawObject::ToAddr(const_cast<RawObject*>(this));
FreeListElement* element = reinterpret_cast<FreeListElement*>(addr);
- instance_size = element->size();
+ instance_size = element->Size();
break;
}
default:
@@ -244,8 +239,7 @@ intptr_t RawObject::SizeFromClass() const {
ASSERT(instance_size != 0);
uword tags = ptr()->tags_;
ASSERT((instance_size == SizeTag::decode(tags)) ||
- (SizeTag::decode(tags) == 0) ||
- FreeBit::decode(tags));
+ (SizeTag::decode(tags) == 0));
return instance_size;
}
@@ -257,13 +251,6 @@ intptr_t RawObject::VisitPointers(ObjectPointerVisitor* visitor) {
// Only reasonable to be called on heap objects.
ASSERT(IsHeapObject());
- if (FreeBit::decode(ptr()->tags_)) {
- // Nothing to visit for free list elements.
- uword addr = RawObject::ToAddr(this);
- FreeListElement* element = reinterpret_cast<FreeListElement*>(addr);
- return element->size();
- }
-
// Read the necessary data out of the class before visting the class itself.
intptr_t class_id = GetClassId();
ObjectKind kind;
@@ -284,6 +271,13 @@ intptr_t RawObject::VisitPointers(ObjectPointerVisitor* visitor) {
}
CLASS_LIST_NO_OBJECT(RAW_VISITPOINTERS)
#undef RAW_VISITPOINTERS
+ case kFreeListElement: {
+ ASSERT(FreeBit::decode(ptr()->tags_));
+ uword addr = RawObject::ToAddr(const_cast<RawObject*>(this));
+ FreeListElement* element = reinterpret_cast<FreeListElement*>(addr);
+ size = element->Size();
+ break;
+ }
default:
OS::Print("Kind: %d\n", kind);
UNREACHABLE();
« runtime/vm/freelist.h ('K') | « runtime/vm/raw_object.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698