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);
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_;
}
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]);
+ }
}
~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);
List<Object**> blocks_;
DeferredHandles* next_;
DeferredHandles* previous_;
- Object** last_block_limit_;
+ Object** first_block_limit_;
HandleScopeImplementer* impl_;
friend 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;
}
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();
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