diff options
Diffstat (limited to 'src/3rdparty/v8/src/v8.cc')
-rw-r--r-- | src/3rdparty/v8/src/v8.cc | 26 |
1 files changed, 19 insertions, 7 deletions
diff --git a/src/3rdparty/v8/src/v8.cc b/src/3rdparty/v8/src/v8.cc index 2910a07..7d01582 100644 --- a/src/3rdparty/v8/src/v8.cc +++ b/src/3rdparty/v8/src/v8.cc @@ -38,6 +38,7 @@ #include "hydrogen.h" #include "lithium-allocator.h" #include "log.h" +#include "objects.h" #include "once.h" #include "platform.h" #include "runtime-profiler.h" @@ -106,13 +107,16 @@ void V8::TearDown() { if (!has_been_set_up_ || has_been_disposed_) return; + // The isolate has to be torn down before clearing the LOperand + // caches so that the optimizing compiler thread (if running) + // doesn't see an inconsistent view of the lithium instructions. + isolate->TearDown(); + delete isolate; + ElementsAccessor::TearDown(); LOperand::TearDownCaches(); RegisteredExtension::UnregisterAll(); - isolate->TearDown(); - delete isolate; - is_running_ = false; has_been_disposed_ = true; @@ -166,7 +170,7 @@ void V8::SetReturnAddressLocationResolver( // Used by JavaScript APIs uint32_t V8::Random(Context* context) { - ASSERT(context->IsGlobalContext()); + ASSERT(context->IsNativeContext()); ByteArray* seed = context->random_seed(); return random_base(reinterpret_cast<uint32_t*>(seed->GetDataStartAddress())); } @@ -213,14 +217,22 @@ void V8::RemoveCallCompletedCallback(CallCompletedCallback callback) { void V8::FireCallCompletedCallback(Isolate* isolate) { - if (call_completed_callbacks_ == NULL) return; + bool has_call_completed_callbacks = call_completed_callbacks_ != NULL; + bool observer_delivery_pending = + FLAG_harmony_observation && isolate->observer_delivery_pending(); + if (!has_call_completed_callbacks && !observer_delivery_pending) return; HandleScopeImplementer* handle_scope_implementer = isolate->handle_scope_implementer(); if (!handle_scope_implementer->CallDepthIsZero()) return; // Fire callbacks. Increase call depth to prevent recursive callbacks. handle_scope_implementer->IncrementCallDepth(); - for (int i = 0; i < call_completed_callbacks_->length(); i++) { - call_completed_callbacks_->at(i)(); + if (observer_delivery_pending) { + JSObject::DeliverChangeRecords(isolate); + } + if (has_call_completed_callbacks) { + for (int i = 0; i < call_completed_callbacks_->length(); i++) { + call_completed_callbacks_->at(i)(); + } } handle_scope_implementer->DecrementCallDepth(); } |