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