static void RemoveMemoryAllocationCallback(MemoryAllocationCallback callback);
/**
- * Adds a callback to notify the host application when a script finished
- * running. If a script re-enters the runtime during executing, the
- * CallCompletedCallback is only invoked when the outer-most script
- * execution ends. Executing scripts inside the callback do not trigger
- * further callbacks.
- *
- * Will be deprecated soon. Use Isolate::AddCallCompletedCallback.
- */
- static void AddCallCompletedCallback(CallCompletedCallback callback);
-
- /**
- * Removes callback that was installed by AddCallCompletedCallback.
- *
- * Will be deprecated soon. Use Isolate::RemoveCallCompletedCallback.
- */
- static void RemoveCallCompletedCallback(CallCompletedCallback callback);
-
- /**
* Experimental: Runs the Microtask Work Queue until empty
*/
static void RunMicrotasks(Isolate* isolate);
#define EXCEPTION_BAILOUT_CHECK_DO_CALLBACK(isolate, value) \
EXCEPTION_BAILOUT_CHECK_GENERIC( \
- isolate, value, i::V8::FireCallCompletedCallback(isolate);)
+ isolate, value, isolate->FireCallCompletedCallback();)
#define EXCEPTION_BAILOUT_CHECK(isolate, value) \
}
-void V8::AddCallCompletedCallback(CallCompletedCallback callback) {
- if (callback == NULL) return;
- i::V8::AddCallCompletedCallback(callback);
-}
-
-
void V8::RunMicrotasks(Isolate* isolate) {
i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
i::HandleScope scope(i_isolate);
}
-void V8::RemoveCallCompletedCallback(CallCompletedCallback callback) {
- i::V8::RemoveCallCompletedCallback(callback);
-}
-
-
void V8::TerminateExecution(Isolate* isolate) {
reinterpret_cast<i::Isolate*>(isolate)->stack_guard()->TerminateExecution();
}
void Isolate::AddCallCompletedCallback(CallCompletedCallback callback) {
if (callback == NULL) return;
- // TODO(jochen): Make this per isolate.
- i::V8::AddCallCompletedCallback(callback);
+ i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this);
+ isolate->AddCallCompletedCallback(callback);
}
void Isolate::RemoveCallCompletedCallback(CallCompletedCallback callback) {
- // TODO(jochen): Make this per isolate.
- i::V8::RemoveCallCompletedCallback(callback);
+ i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this);
+ isolate->RemoveCallCompletedCallback(callback);
}
}
+void Isolate::AddCallCompletedCallback(CallCompletedCallback callback) {
+ for (int i = 0; i < call_completed_callbacks_.length(); i++) {
+ if (callback == call_completed_callbacks_.at(i)) return;
+ }
+ call_completed_callbacks_.Add(callback);
+}
+
+
+void Isolate::RemoveCallCompletedCallback(CallCompletedCallback callback) {
+ for (int i = 0; i < call_completed_callbacks_.length(); i++) {
+ if (callback == call_completed_callbacks_.at(i)) {
+ call_completed_callbacks_.Remove(i);
+ }
+ }
+}
+
+
+void Isolate::FireCallCompletedCallback() {
+ bool has_call_completed_callbacks = !call_completed_callbacks_.is_empty();
+ bool run_microtasks = autorun_microtasks() && microtask_pending();
+ if (!has_call_completed_callbacks && !run_microtasks) return;
+
+ if (!handle_scope_implementer()->CallDepthIsZero()) return;
+ // Fire callbacks. Increase call depth to prevent recursive callbacks.
+ handle_scope_implementer()->IncrementCallDepth();
+ if (run_microtasks) Execution::RunMicrotasks(this);
+ for (int i = 0; i < call_completed_callbacks_.length(); i++) {
+ call_completed_callbacks_.at(i)();
+ }
+ handle_scope_implementer()->DecrementCallDepth();
+}
+
+
} } // namespace v8::internal
// Get (and lazily initialize) the registry for per-isolate symbols.
Handle<JSObject> GetSymbolRegistry();
+ void AddCallCompletedCallback(CallCompletedCallback callback);
+ void RemoveCallCompletedCallback(CallCompletedCallback callback);
+ void FireCallCompletedCallback();
+
private:
Isolate();
int next_optimization_id_;
+ // List of callbacks when a Call completes.
+ List<CallCompletedCallback> call_completed_callbacks_;
+
friend class ExecutionAccess;
friend class HandleScopeImplementer;
friend class IsolateInitializer;
V8_DECLARE_ONCE(init_once);
-List<CallCompletedCallback>* V8::call_completed_callbacks_ = NULL;
v8::ArrayBuffer::Allocator* V8::array_buffer_allocator_ = NULL;
v8::Platform* V8::platform_ = NULL;
RegisteredExtension::UnregisterAll();
Isolate::GlobalTearDown();
- delete call_completed_callbacks_;
- call_completed_callbacks_ = NULL;
-
Sampler::TearDown();
Serializer::TearDown();
}
-void V8::AddCallCompletedCallback(CallCompletedCallback callback) {
- if (call_completed_callbacks_ == NULL) { // Lazy init.
- call_completed_callbacks_ = new List<CallCompletedCallback>();
- }
- for (int i = 0; i < call_completed_callbacks_->length(); i++) {
- if (callback == call_completed_callbacks_->at(i)) return;
- }
- call_completed_callbacks_->Add(callback);
-}
-
-
-void V8::RemoveCallCompletedCallback(CallCompletedCallback callback) {
- if (call_completed_callbacks_ == NULL) return;
- for (int i = 0; i < call_completed_callbacks_->length(); i++) {
- if (callback == call_completed_callbacks_->at(i)) {
- call_completed_callbacks_->Remove(i);
- }
- }
-}
-
-
-void V8::FireCallCompletedCallback(Isolate* isolate) {
- bool has_call_completed_callbacks = call_completed_callbacks_ != NULL;
- bool run_microtasks = isolate->autorun_microtasks() &&
- isolate->microtask_pending();
- if (!has_call_completed_callbacks && !run_microtasks) 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();
- if (run_microtasks) Execution::RunMicrotasks(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();
-}
-
-
void V8::RunMicrotasks(Isolate* isolate) {
if (!isolate->microtask_pending())
return;
// Support for entry hooking JITed code.
static void SetFunctionEntryHook(FunctionEntryHook entry_hook);
- static void AddCallCompletedCallback(CallCompletedCallback callback);
- static void RemoveCallCompletedCallback(CallCompletedCallback callback);
- static void FireCallCompletedCallback(Isolate* isolate);
-
static void RunMicrotasks(Isolate* isolate);
static v8::ArrayBuffer::Allocator* ArrayBufferAllocator() {
static void InitializeOncePerProcessImpl();
static void InitializeOncePerProcess();
- // List of callbacks when a Call completes.
- static List<CallCompletedCallback>* call_completed_callbacks_;
// Allocator for external array buffers.
static v8::ArrayBuffer::Allocator* array_buffer_allocator_;
// v8::Platform to use.
env->Global()->Set(v8_str("recursion"),
recursive_runtime->GetFunction());
// Adding the same callback a second time has no effect.
- v8::V8::AddCallCompletedCallback(CallCompletedCallback1);
- v8::V8::AddCallCompletedCallback(CallCompletedCallback1);
- v8::V8::AddCallCompletedCallback(CallCompletedCallback2);
+ env->GetIsolate()->AddCallCompletedCallback(CallCompletedCallback1);
+ env->GetIsolate()->AddCallCompletedCallback(CallCompletedCallback1);
+ env->GetIsolate()->AddCallCompletedCallback(CallCompletedCallback2);
i::OS::Print("--- Script (1) ---\n");
Local<Script> script = v8::Script::Compile(
v8::String::NewFromUtf8(env->GetIsolate(), "recursion(0)"));
i::OS::Print("\n--- Script (2) ---\n");
callback_fired = 0;
- v8::V8::RemoveCallCompletedCallback(CallCompletedCallback1);
+ env->GetIsolate()->RemoveCallCompletedCallback(CallCompletedCallback1);
script->Run();
CHECK_EQ(2, callback_fired);
TEST(CallCompletedCallbackOneException) {
LocalContext env;
v8::HandleScope scope(env->GetIsolate());
- v8::V8::AddCallCompletedCallback(CallCompletedCallbackNoException);
+ env->GetIsolate()->AddCallCompletedCallback(CallCompletedCallbackNoException);
CompileRun("throw 'exception';");
}
TEST(CallCompletedCallbackTwoExceptions) {
LocalContext env;
v8::HandleScope scope(env->GetIsolate());
- v8::V8::AddCallCompletedCallback(CallCompletedCallbackException);
+ env->GetIsolate()->AddCallCompletedCallback(CallCompletedCallbackException);
CompileRun("throw 'first exception';");
}