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