mirror of
https://github.com/phpv8/v8js.git
synced 2025-03-11 21:08:45 +00:00
Enter endless loop after V8::TerminateExecution call, fixes #135
The V8::TerminateExecution does *not* immediately terminate execution as its name might suggest. It just marks the given isolate as "to terminate" and the execution thread checks - from time to time - whether to terminate. For v8 itself this is not problematic as the call is thought to stop long-running scripts executed in the browser context. As v8js exposes this function to JavaScript with the exit() method, this behaviour is confusing. In order to stop code execution right at the exit() call, v8js enters an endless loop and waits for v8 to terminate execution within it.
This commit is contained in:
parent
eafa458620
commit
72cb2da9ba
@ -27,7 +27,21 @@ void v8js_commonjs_normalise_identifier(char *base, char *identifier, char *norm
|
||||
/* global.exit - terminate execution */
|
||||
V8JS_METHOD(exit) /* {{{ */
|
||||
{
|
||||
v8::V8::TerminateExecution(info.GetIsolate());
|
||||
v8::Isolate *isolate = info.GetIsolate();
|
||||
|
||||
/* Unfortunately just calling TerminateExecution on the isolate is not
|
||||
* enough, since v8 just marks the thread as "to be aborted" and doesn't
|
||||
* immediately do so. Hence we enter an endless loop after signalling
|
||||
* termination, so we definitely don't execute JS code after the exit()
|
||||
* statement. */
|
||||
v8::Locker locker(isolate);
|
||||
v8::Isolate::Scope isolate_scope(isolate);
|
||||
v8::HandleScope handle_scope(isolate);
|
||||
|
||||
v8::Local<v8::String> source = V8JS_STR("for(;;);");
|
||||
v8::Local<v8::Script> script = v8::Script::Compile(source);
|
||||
v8::V8::TerminateExecution(isolate);
|
||||
script->Run();
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user