Hello Ben,
I already tried that, but  V8::IsExecutionTerminating() returned false.
I don't know if it's a bug or a feature.

On Thursday, June 19, 2014 11:39:04 PM UTC+3, Ben Noordhuis wrote:
>
> On Thu, Jun 19, 2014 at 2:04 PM, Danny Dorfman <[email protected] 
> <javascript:>> 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