On Thu, Jun 19, 2014 at 2:04 PM, Danny Dorfman <[email protected]> wrote:
> Hello guys,
>
> I searched through the group, but couldn't find any responses on this
> subject.
> I'd like to run a script, and terminate it from C++ code, by the decision of
> a callback function.
> I tried using TerminateExectuion(isolate), but the program crashes.
>
> Here is a small sample. I assign values to the "specific" object using
> JavaScript.
> Whenever the "alfa" field is set to "666", I'd like the script to terminate.
>
> -----------------------------------------------------------------------------------------------------------------------------------------------------------------
>   1 #include <v8.h>
>   2 #include <stdio.h>
>   3 using namespace v8;
>   4
>   5 void SetAlfa(Local<String> property, Local<Value> value, const
> PropertyCallbackInfo<void>& info)
>   6 {
>   7     String::Utf8Value property_str(property);
>   8     String::Utf8Value value_str(value);
>   9     printf("SetAlfa: about to set %s=%s\n", *property_str, *value_str);
>  10     Handle<Value> show_stopper =
> String::NewFromUtf8(info.GetIsolate(),"666");
>  11     if (value->Equals(show_stopper))
>  12     {
>  13         printf("SetAlfa: STOPPING!\n");
>  14         V8::TerminateExecution(info.GetIsolate());
>  15     }
>  16 }
>  17
>  18 void RunIt(Isolate *isolate, const char *script_text)
>  19 {
>  20     printf("RunIt: about to run \"%s\"\n", script_text);
>  21     Handle<String> source = String::NewFromUtf8(isolate,script_text);
>  22     Handle<Script> script = Script::Compile(source);
>  23     Handle<Value> result = script->Run();
>  24     String::Utf8Value ascii(result);
>  25     printf("RunIt: returned \"%s\"\n", *ascii);
>  26 }
>  27
>  28
>  29 int main(int argc, char* argv[])
>  30 {
>  31     Isolate* isolate = Isolate::GetCurrent();
>  32     HandleScope handle_scope(isolate);
>  33     Handle<Context> context = Context::New(isolate);
>  34     Context::Scope context_scope(context);
>  35     Handle<String> alfa_str = String::NewFromUtf8(isolate,"alfa");
>  36     Handle<String> specific_str =
> String::NewFromUtf8(isolate,"specific");
>  37
>  38     Handle<Object> specific_obj = Object::New(isolate);
>  39     specific_obj->SetAccessor(alfa_str, NULL, SetAlfa);
>  40     context->Global()->Set(specific_str, specific_obj);
>  41
>  42     RunIt(isolate,"specific.alfa=123");
>  43     RunIt(isolate,"specific.alfa=666; specific.alfa=999");
>  44
>  45     return 0;
>  46 }
> -----------------------------------------------------------------------------------------------------------------------------------------------------------------
>
> The output I get is:
>
> -----------------------------------------------------------------------------------------------------------------------------------------------------------------
> RunIt: about to run "specific.alfa=123"
> SetAlfa: about to set alfa=123
> RunIt: returned "123"
> RunIt: about to run "specific.alfa=666; specific.alfa=999"
> SetAlfa: about to set alfa=666
> SetAlfa: STOPPING!
> SetAlfa: about to set alfa=(null)
>
>
> #
> # Fatal error in ../src/api.cc, line 2899
> # CHECK(!(isolate)->external_caught_exception()) failed
> #
>
> ==== C stack trace ===============================
>
>  1: V8_Fatal
>  2: v8::Value::Equals(v8::Handle<v8::Value>) const
>  3: SetAlfa(v8::Local<v8::String>, v8::Local<v8::Value>,
> v8::PropertyCallbackInfo<void> const&)
>  4: v8::internal::PropertyCallbackArguments::Call(void
> (*)(v8::Local<v8::String>, v8::Local<v8::Value>,
> v8::PropertyCallbackInfo<void> const&), v8::Local<v8::String>,
> v8::Local<v8::Value>)
>  5:
> v8::internal::JSObject::SetPropertyWithCallback(v8::internal::Handle<v8::internal::JSObject>,
> v8::internal::Handle<v8::internal::Object>,
> v8::internal::Handle<v8::internal::Name>,
> v8::internal::Handle<v8::internal::Object>,
> v8::internal::Handle<v8::internal::JSObject>, v8::internal::StrictModeFlag)
>  6:
> v8::internal::JSObject::SetPropertyForResult(v8::internal::Handle<v8::internal::JSObject>,
> v8::internal::LookupResult*, v8::internal::Handle<v8::internal::Name>,
> v8::internal::Handle<v8::internal::Object>, PropertyAttributes,
> v8::internal::StrictModeFlag, v8::internal::JSReceiver::StoreFromKeyed)
>  7:
> v8::internal::JSReceiver::SetProperty(v8::internal::Handle<v8::internal::JSReceiver>,
> v8::internal::LookupResult*, v8::internal::Handle<v8::internal::Name>,
> v8::internal::Handle<v8::internal::Object>, PropertyAttributes,
> v8::internal::StrictModeFlag, v8::internal::JSReceiver::StoreFromKeyed)
>  8:
> v8::internal::JSReceiver::SetProperty(v8::internal::Handle<v8::internal::JSReceiver>,
> v8::internal::Handle<v8::internal::Name>,
> v8::internal::Handle<v8::internal::Object>, PropertyAttributes,
> v8::internal::StrictModeFlag, v8::internal::JSReceiver::StoreFromKeyed)
>  9: v8::internal::StoreIC::Store(v8::internal::Handle<v8::internal::Object>,
> v8::internal::Handle<v8::internal::String>,
> v8::internal::Handle<v8::internal::Object>,
> v8::internal::JSReceiver::StoreFromKeyed)
> 10: ??
> 11: v8::internal::StoreIC_Miss(int, v8::internal::Object**,
> v8::internal::Isolate*)
> 12: ??
> -----------------------------------------------------------------------------------------------------------------------------------------------------------------
>
>
> Can anyone tell, what I'm doing wrong here?
> Thanks in advance,
> Danny

V8::TerminateExecution() doesn't terminate execution right away.  It
sets a 'is terminating' flag that is checked in the generated code in
function prologues and at loop edges.

The effect of the flag is that of a pending exception and that means
it's no longer allowed to call into the VM (which many V8 API
functions do, like Value::Equals().)

Try adding a V8::IsExecutionTerminating() guard at the top of your
SetAlfa() function.

-- 
-- 
v8-users mailing list
[email protected]
http://groups.google.com/group/v8-users
--- 
You received this message because you are subscribed to the Google Groups 
"v8-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to