You appear to be using an old version of V8, have you tried building against a more current version?
It's also hard to tell what is wrong with your code just from a few snippets. SIGTRAP suggests that you're hitting a debug check. Have you tried compiling V8 in debug mode to get the message? best -jochen On Fri, Mar 4, 2016 at 1:39 PM Fay Wong <[email protected]> wrote: > Background: > > I need to integrate the functionality of v8 engine in a project written in > c. So i wrap a js object as: > > typedef struct { > v8::Persistent<v8::Object> obj; > } v8_obj; > > > typedef struct { > v8::Persistent<v8::Function> fun; > } v8_fn; > > > void* create_v8_obj(Persistent<Object> obj) { > v8_obj * _v8_obj = (v8_obj *)calloc(1, sizeof (v8_obj)); > _v8_obj->obj = obj; > return _v8_obj; > } > > > void* create_v8_fun(Persistent<Function> fun) { > v8_fn * _v8_fn = (v8_fn *)calloc(1, sizeof (v8_fn)); > _v8_fn->fun = fun; > return _v8_fn; > } > > > fb_script_cb_t* v8_obj_get(void *p_v8_obj, const char *key) { > if (p_v8_obj != NULL && key != NULL) { > v8_obj *_v8_obj = reinterpret_cast<v8_obj *>(p_v8_obj); > LOGE("_v8_obj: %p, *obj:%p", _v8_obj, *(_v8_obj->obj)); > Local<Value> val = _v8_obj->obj->Get(String::New(key)); // crashed > here > if (val.IsEmpty()) { > return NULL; > } > > fb_script_cb_t *cb = fb_script_cb_new(); > if (val->IsFunction()) { > void* v8_fun = > create_v8_fun(Persistent<Function>::New(Handle<Function>::Cast(val))); > fb_script_cb_set_js(cb, v8_fun); > } else if (val->IsObject()) { > void* v8_obj = > create_v8_obj(Persistent<Object>::New(Handle<Object>::Cast(val))); > fb_script_cb_set_obj(cb, v8_obj); > } else if (val->IsNumber()) { > fb_script_cb_set_int(cb, val->ToInt32()->Value()); > } > return cb; > } > return NULL; > } > > > My scenario is: > > > 1) in a accessor implement i create a v8_obj through create_v8_obj() to > persistent reference(let's call it R1) to a js object(such as > > { > > "cell": function() { > > > }, > > ... > > } > > ) > > > 2) after some time, i need to access the property of R1 through > v8_obj_get(..., "cell"), "cell" is one of the property of the js object > mentioned in 1) > > > then the Persistent<Object> can't be used anyway, and crashed at the line in > red. I verified that the address of the wrapper structure and the target > object in Persistent<Object> is right. But the target object is gone away. > > > " > > 3583 03-04 20:18:50.368 27163 27163 E faywong : _v8_obj: 0xafdb0ef0, > *obj:0x9f2bc050 > > 3584 03-04 20:18:50.368 27163 27163 F libc : Fatal signal 5 (SIGTRAP), > code 4 in tid 27163 > > " > > > > So what's the problem in my solution? What's the best practice to retain a js > object in c? > > > > -- > -- > 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. > -- -- 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.
