| Index: runtime/vm/gc_sweeper.cc
|
| ===================================================================
|
| --- runtime/vm/gc_sweeper.cc (revision 44565)
|
| +++ runtime/vm/gc_sweeper.cc (working copy)
|
| @@ -28,10 +28,10 @@
|
| if (raw_obj->IsMarked()) {
|
| // Found marked object. Clear the mark bit and update swept bytes.
|
| raw_obj->ClearMarkBit();
|
| - obj_size = raw_obj->Size();
|
| + obj_size = raw_obj->Size(class_table_);
|
| in_use = true;
|
| } else {
|
| - uword free_end = current + raw_obj->Size();
|
| + uword free_end = current + raw_obj->Size(class_table_);
|
| while (free_end < end) {
|
| RawObject* next_obj = RawObject::FromAddr(free_end);
|
| if (next_obj->IsMarked()) {
|
| @@ -39,7 +39,7 @@
|
| break;
|
| }
|
| // Expand the free block by the size of this object.
|
| - free_end += next_obj->Size();
|
| + free_end += next_obj->Size(class_table_);
|
| }
|
| obj_size = free_end - current;
|
| if (is_executable) {
|
| @@ -71,17 +71,17 @@
|
| RawObject* raw_obj = RawObject::FromAddr(page->object_start());
|
| if (raw_obj->IsMarked()) {
|
| raw_obj->ClearMarkBit();
|
| - words_to_end = (raw_obj->Size() >> kWordSizeLog2);
|
| + words_to_end = (raw_obj->Size(class_table_) >> kWordSizeLog2);
|
| }
|
| #ifdef DEBUG
|
| // String::MakeExternal and Array::MakeArray create trailing filler objects,
|
| // but they are always unreachable. Verify that they are not marked.
|
| - uword current = RawObject::ToAddr(raw_obj) + raw_obj->Size();
|
| + uword current = RawObject::ToAddr(raw_obj) + raw_obj->Size(class_table_);
|
| uword end = page->object_end();
|
| while (current < end) {
|
| RawObject* cur_obj = RawObject::FromAddr(current);
|
| ASSERT(!cur_obj->IsMarked());
|
| - intptr_t obj_size = cur_obj->Size();
|
| + intptr_t obj_size = cur_obj->Size(class_table_);
|
| memset(reinterpret_cast<void*>(current), Heap::kZapByte, obj_size);
|
| current += obj_size;
|
| }
|
| @@ -92,17 +92,17 @@
|
|
|
| class SweeperTask : public ThreadPool::Task {
|
| public:
|
| - SweeperTask(Isolate* isolate,
|
| + SweeperTask(ClassTable* class_table,
|
| PageSpace* old_space,
|
| HeapPage* first,
|
| HeapPage* last,
|
| FreeList* freelist)
|
| - : task_isolate_(isolate),
|
| + : class_table_(class_table),
|
| old_space_(old_space),
|
| first_(first),
|
| last_(last),
|
| freelist_(freelist) {
|
| - ASSERT(task_isolate_ != NULL);
|
| + ASSERT(class_table_ != NULL);
|
| ASSERT(first_ != NULL);
|
| ASSERT(old_space_ != NULL);
|
| ASSERT(last_ != NULL);
|
| @@ -113,8 +113,7 @@
|
| }
|
|
|
| virtual void Run() {
|
| - Isolate::SetCurrent(task_isolate_);
|
| - GCSweeper sweeper;
|
| + GCSweeper sweeper(class_table_);
|
|
|
| HeapPage* page = first_;
|
| HeapPage* prev_page = NULL;
|
| @@ -143,12 +142,10 @@
|
| old_space_->set_tasks(old_space_->tasks() - 1);
|
| ml.Notify();
|
| }
|
| - Isolate::SetCurrent(NULL);
|
| - delete task_isolate_;
|
| }
|
|
|
| private:
|
| - Isolate* task_isolate_;
|
| + ClassTable* class_table_;
|
| PageSpace* old_space_;
|
| HeapPage* first_;
|
| HeapPage* last_;
|
| @@ -161,7 +158,7 @@
|
| HeapPage* last,
|
| FreeList* freelist) {
|
| SweeperTask* task =
|
| - new SweeperTask(isolate->ShallowCopy(),
|
| + new SweeperTask(isolate->class_table(),
|
| isolate->heap()->old_space(),
|
| first, last,
|
| freelist);
|
|
|