Reviewers: Erik Corry,

Description:
Multi-page newspace.

Not growing or shrinking yet.
Also fixes compile bug in debug mode.


Please review this at http://codereview.chromium.org/7121009/

SVN Base: https://v8.googlecode.com/svn/branches/experimental/gc

Affected files:
  M src/spaces.cc


Index: src/spaces.cc
diff --git a/src/spaces.cc b/src/spaces.cc
index 7ea5947189a0750a3267ddaf6781148a1584897e..e0bc9b3eccdc85738863ded690a994b0fc0e8b75 100644
--- a/src/spaces.cc
+++ b/src/spaces.cc
@@ -1049,7 +1049,6 @@ void NewSpace::Verify() {
   NewSpacePage* page = to_space_.first_page();
   Address current = page->body();
   CHECK_EQ(current, to_space_.space_low());
-  CHECK(end_page->ContainsLimit(top()));

   while (current != top()) {
     if (current == page->body_limit()) {
@@ -1096,30 +1095,19 @@ void NewSpace::Verify() {

 bool SemiSpace::Commit() {
   ASSERT(!is_committed());
-  // TODO(gc): Rewrite completely when switching to n-page new-space.
-  // Create one page.
-  int pagesize = Page::kPageSize;
-  if (!heap()->isolate()->memory_allocator()->CommitBlock(
-      start_, pagesize, executable())) {
+  int pages = capacity_ / Page::kPageSize;
+  if (!heap()->isolate()->memory_allocator()->CommitBlock(start_,
+                                                          capacity_,
+                                                          executable())) {
     return false;
   }
-  NewSpacePage* page = NewSpacePage::Initialize(heap(), start_, this);
-  page->InsertAfter(&anchor_);
-
-  // Maybe create a second.
-  if (capacity_ >= 2 * pagesize) {
-    Address last_page_address =
-      start_ + ((capacity_ - pagesize) & ~Page::kPageAlignmentMask);
-    if (heap()->isolate()->memory_allocator()->CommitBlock(
-        last_page_address, pagesize, executable())) {
-      NewSpacePage* last_page = NewSpacePage::Initialize(heap(),
-                                                         last_page_address,
-                                                         this);
-      last_page->InsertAfter(page);
-    } else {
-      UNREACHABLE();  // TODO(gc): Don't rely on this. Splitting the commit
-                      // is only temporary.
-    }
+
+  NewSpacePage* page = anchor();
+  for (int i = 0; i < pages; i++) {
+    NewSpacePage* new_page =
+      NewSpacePage::Initialize(heap(), start_ + i * Page::kPageSize, this);
+    new_page->InsertAfter(page);
+    page = new_page;
   }

   committed_ = true;
@@ -1130,17 +1118,12 @@ bool SemiSpace::Commit() {

 bool SemiSpace::Uncommit() {
   ASSERT(is_committed());
-  // TODO(gc): Rewrite completely when switching to n-page new-space.
-  NewSpacePage* last_page = anchor()->prev_page();
-  while (last_page != anchor()) {
-    NewSpacePage* temp_page = last_page->prev_page();
-    last_page->Unlink();
-    if (!heap()->isolate()->memory_allocator()->UncommitBlock(
-      last_page->address(), Page::kPageSize)) {
-      return false;
-    }
-    last_page = temp_page;
+  if (!heap()->isolate()->memory_allocator()->UncommitBlock(start_,
+                                                            capacity_)) {
+    return false;
   }
+  anchor()->set_next_page(anchor());
+  anchor()->set_prev_page(anchor());

   committed_ = false;
   return true;


--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev

Reply via email to