Chromium Code Reviews| Index: src/isolate.cc |
| diff --git a/src/isolate.cc b/src/isolate.cc |
| index cb73c26b98e8849d3ee1048a47e05e5f1d0b1d43..06a7f1e15416ba49ccdf774def7984d863fec6be 100644 |
| --- a/src/isolate.cc |
| +++ b/src/isolate.cc |
| @@ -477,6 +477,14 @@ void Isolate::Iterate(ObjectVisitor* v) { |
| Iterate(v, current_t); |
| } |
| +void Isolate::IterateDeferredHandles(ObjectVisitor* visitor) { |
| + for (DeferredHandles* deferred = deferred_handles_head_; |
| + deferred; |
|
danno
2012/07/18 13:36:17
Use explicit test against NULL
sanjoy
2012/07/18 14:00:44
Done.
|
| + deferred = deferred->next_) { |
| + deferred->Iterate(visitor); |
| + } |
| +} |
| + |
| void Isolate::RegisterTryCatchHandler(v8::TryCatch* that) { |
| // The ARM simulator has a separate JS stack. We therefore register |
| @@ -1484,7 +1492,8 @@ Isolate::Isolate() |
| string_tracker_(NULL), |
| regexp_stack_(NULL), |
| date_cache_(NULL), |
| - context_exit_happened_(false) { |
| + context_exit_happened_(false), |
| + deferred_handles_head_(NULL) { |
| TRACE_ISOLATE(constructor); |
| memset(isolate_addresses_, 0, |
| @@ -1989,6 +1998,33 @@ void Isolate::Exit() { |
| } |
| +void Isolate::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_; |
| + } |
| + if (deferred->next_ != NULL) { |
| + deferred->next_->previous_ = deferred->previous_; |
| + } |
| + if (deferred->previous_ != NULL) { |
| + deferred->previous_->next_ = deferred->next_; |
| + } |
| + for (int i = 0; i < deferred->blocks_.length(); i++) { |
| +#ifdef DEBUG |
| + HandleScope::ZapRange(deferred->blocks_[i], |
| + &deferred->blocks_[i][kHandleBlockSize]); |
| +#endif |
| + handle_scope_implementer()->ReturnBlock(deferred->blocks_[i]); |
| + } |
| +} |
| + |
| + |
| #ifdef DEBUG |
| #define ISOLATE_FIELD_OFFSET(type, name, ignored) \ |
| const intptr_t Isolate::name##_debug_offset_ = OFFSET_OF(Isolate, name##_); |