Commit 1e96d4e1 authored by sanjoy@chromium.org's avatar sanjoy@chromium.org

Fix bug in compilation-handlescope.

BUG=
TEST=

Review URL: https://chromiumcodereview.appspot.com/10696125

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@12003 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 3e3160b0
......@@ -6457,6 +6457,12 @@ DeferredHandles* HandleScopeImplementer::Detach(Object** prev_limit) {
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;
ASSERT(last_handle_before_deferred_block_ != NULL);
......@@ -6466,6 +6472,13 @@ 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 +6513,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((first_block_limit_ >= blocks_.first()) &&
(first_block_limit_ < &(blocks_.first())[kHandleBlockSize]));
ASSERT((last_block_limit_ >= blocks_.last()) &&
(last_block_limit_ < &(blocks_.last())[kHandleBlockSize]));
v->VisitPointers(blocks_.first(), first_block_limit_);
v->VisitPointers(blocks_.last(), last_block_limit_);
for (int i = 1; i < blocks_.length(); i++) {
v->VisitPointers(blocks_[i], &blocks_[i][kHandleBlockSize]);
}
}
......
......@@ -397,9 +397,9 @@ class DeferredHandles {
~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 @@ class DeferredHandles {
List<Object**> blocks_;
DeferredHandles* next_;
DeferredHandles* previous_;
Object** last_block_limit_;
Object** first_block_limit_;
HandleScopeImplementer* impl_;
friend class HandleScopeImplementer;
......@@ -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();
......
......@@ -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
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment