Reviewers: Jakob,

Description:
Fix bug in compilation-handlescope.


BUG=
TEST=


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

SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge

Affected files:
  M src/api.h
  M src/api.cc
  M src/handles.cc


Index: src/api.cc
diff --git a/src/api.cc b/src/api.cc
index 376b29616b8b59fa02d391e153c680ed618ed062..1eb693caa56af60d246153cbca22a1a9ec4db8c1 100644
--- a/src/api.cc
+++ b/src/api.cc
@@ -6457,6 +6457,8 @@ DeferredHandles* HandleScopeImplementer::Detach(Object** prev_limit) {
     blocks_.RemoveLast();
   }

+  ASSERT(prev_limit == NULL || !blocks_.is_empty());
+
   ASSERT(!blocks_.is_empty() && prev_limit != NULL);
   deferred_handles_head_ = deferred;
   ASSERT(last_handle_before_deferred_block_ != NULL);
@@ -6466,6 +6468,12 @@ DeferredHandles* HandleScopeImplementer::Detach(Object** prev_limit) {


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 +6508,14 @@ DeferredHandles::~DeferredHandles() {
 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_.first()) &&
+         (last_block_limit_ < &(blocks_.first())[kHandleBlockSize]));

-  ASSERT((last_block_limit_ >= blocks_.last()) &&
-         (last_block_limit_ < &(blocks_.last())[kHandleBlockSize]));
+  v->VisitPointers(blocks_.first(), last_block_limit_);

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


Index: src/api.h
diff --git a/src/api.h b/src/api.h
index cd6c3da078af24b0a83bf640e950ca33c60ec884..6fab6a063e639064e30a121b4480598436b0d8fe 100644
--- a/src/api.h
+++ b/src/api.h
@@ -477,6 +477,8 @@ class HandleScopeImplementer {
     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 @@ class HandleScopeImplementer {
     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();
Index: src/handles.cc
diff --git a/src/handles.cc b/src/handles.cc
index 946c1008aae1975ce143aaaee9c2cbb3c0f88b6e..e98e8433b60ea3f230751fefbb0683439ac5eee3 100644
--- a/src/handles.cc
+++ b/src/handles.cc
@@ -961,13 +961,15 @@ int Utf8Length(Handle<String> str) {

 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