Revision: 12003
Author:   [email protected]
Date:     Fri Jul  6 07:09:11 2012
Log:      Fix bug in compilation-handlescope.

BUG=
TEST=

Review URL: https://chromiumcodereview.appspot.com/10696125
http://code.google.com/p/v8/source/detail?r=12003

Modified:
 /branches/bleeding_edge/src/api.cc
 /branches/bleeding_edge/src/api.h
 /branches/bleeding_edge/src/handles.cc

=======================================
--- /branches/bleeding_edge/src/api.cc  Fri Jul  6 02:31:31 2012
+++ /branches/bleeding_edge/src/api.cc  Fri Jul  6 07:09:11 2012
@@ -6456,6 +6456,12 @@
     deferred->blocks_.Add(blocks_.last());
     blocks_.RemoveLast();
   }
+
+  // deferred->blocks_ now contains the blocks installed on the
+  // HandleScope stack since BeginDeferredScope was called, but in
+  // reverse order.
+
+  ASSERT(prev_limit == NULL || !blocks_.is_empty());

   ASSERT(!blocks_.is_empty() && prev_limit != NULL);
   deferred_handles_head_ = deferred;
@@ -6466,6 +6472,13 @@


void HandleScopeImplementer::DestroyDeferredHandles(DeferredHandles* deferred) {
+#ifdef DEBUG
+  DeferredHandles* deferred_iterator = deferred;
+  while (deferred_iterator->previous_ != NULL) {
+    deferred_iterator = deferred_iterator->previous_;
+  }
+  ASSERT(deferred_handles_head_ == deferred_iterator);
+#endif
   if (deferred_handles_head_ == deferred) {
     deferred_handles_head_ = deferred_handles_head_->next_;
   }
@@ -6500,14 +6513,14 @@
 void DeferredHandles::Iterate(ObjectVisitor* v) {
   ASSERT(!blocks_.is_empty());

-  for (int i = 0; i < (blocks_.length() - 1); i++) {
-    v->VisitPointers(blocks_[i], &blocks_[i][kHandleBlockSize]);
-  }
-
-  ASSERT((last_block_limit_ >= blocks_.last()) &&
-         (last_block_limit_ < &(blocks_.last())[kHandleBlockSize]));
-
-  v->VisitPointers(blocks_.last(), last_block_limit_);
+  ASSERT((first_block_limit_ >= blocks_.first()) &&
+         (first_block_limit_ < &(blocks_.first())[kHandleBlockSize]));
+
+  v->VisitPointers(blocks_.first(), first_block_limit_);
+
+  for (int i = 1; i < blocks_.length(); i++) {
+    v->VisitPointers(blocks_[i], &blocks_[i][kHandleBlockSize]);
+  }
 }


=======================================
--- /branches/bleeding_edge/src/api.h   Fri Jul  6 02:31:31 2012
+++ /branches/bleeding_edge/src/api.h   Fri Jul  6 07:09:11 2012
@@ -397,9 +397,9 @@
   ~DeferredHandles();

  private:
-  DeferredHandles(DeferredHandles* next, Object** last_block_limit,
+  DeferredHandles(DeferredHandles* next, Object** first_block_limit,
                   HandleScopeImplementer* impl)
-      : next_(next), previous_(NULL), last_block_limit_(last_block_limit),
+ : next_(next), previous_(NULL), first_block_limit_(first_block_limit),
         impl_(impl) {}

   void Iterate(ObjectVisitor* v);
@@ -407,7 +407,7 @@
   List<Object**> blocks_;
   DeferredHandles* next_;
   DeferredHandles* previous_;
-  Object** last_block_limit_;
+  Object** first_block_limit_;
   HandleScopeImplementer* impl_;

   friend class HandleScopeImplementer;
@@ -477,6 +477,8 @@
     entered_contexts_.Initialize(0);
     saved_contexts_.Initialize(0);
     spare_ = NULL;
+    deferred_handles_head_ = NULL;
+    last_handle_before_deferred_block_ = NULL;
     call_depth_ = 0;
   }

@@ -484,6 +486,7 @@
     ASSERT(blocks_.length() == 0);
     ASSERT(entered_contexts_.length() == 0);
     ASSERT(saved_contexts_.length() == 0);
+    ASSERT(deferred_handles_head_ == NULL);
     blocks_.Free();
     entered_contexts_.Free();
     saved_contexts_.Free();
=======================================
--- /branches/bleeding_edge/src/handles.cc      Fri Jul  6 02:31:31 2012
+++ /branches/bleeding_edge/src/handles.cc      Fri Jul  6 07:09:11 2012
@@ -961,13 +961,15 @@

 DeferredHandleScope::DeferredHandleScope(Isolate* isolate)
     : impl_(isolate->handle_scope_implementer()) {
+  ASSERT(impl_->isolate() == Isolate::Current());
   impl_->BeginDeferredScope();
+  v8::ImplementationUtilities::HandleScopeData* data =
+      impl_->isolate()->handle_scope_data();
   Object** new_next = impl_->GetSpareOrNewBlock();
   Object** new_limit = &new_next[kHandleBlockSize];
+  ASSERT(data->limit == &impl_->blocks()->last()[kHandleBlockSize]);
   impl_->blocks()->Add(new_next);

-  v8::ImplementationUtilities::HandleScopeData* data =
-      impl_->isolate()->handle_scope_data();
 #ifdef DEBUG
   prev_level_ = data->level;
 #endif

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

Reply via email to