On Sun, Jun 6, 2010 at 10:04 AM, Starlon <[email protected]> wrote:
> I figured it out. I needed to close out the handle scope in
> function_cos.

In this particular case, I would recommend just getting rid of the
HandleScope in function_cos instead. All C++ callbacks run in their
own HandleScope provided by V8, so it's really not needed here.

Cheers,
Kasper

> On Jun 6, 1:29 am, Starlon <[email protected]> wrote:
>> I'm not sure what in the world's causing this crash. The stack trace
>> from gdb isn't much help.
>>
>> Program received signal SIGSEGV, Segmentation fault.
>> 0x003a2ab9 in ?? ()
>> (gdb) bt
>> #0  0x003a2ab9 in ?? ()
>> #1  0x003a2a94 in ?? ()
>> #2  0xb6072389 in ?? ()
>> #3  0x0baddead in ?? ()
>> #4  0x003a29e1 in ?? ()
>> #5  0x0000000a in ?? ()
>>
>> Valgrind gives a little more info;
>>
>> ==14169== Invalid read of size 4
>> ==14169==    at 0x4B1C599: ???
>> ==14169==    by 0x4B1C95D: ???
>> ==14169==    by 0x4B02CDA: ???
>> ==14169==    by 0x4B022E1: ???
>> ==14169==    by 0x480E21A: v8::internal::Invoke(bool,
>> v8::internal::Handle<v8::internal::JSFunction>,
>> v8::internal::Handle<v8::internal::Object>, int,
>> v8::internal::Object***, bool*) (execution.cc:94)
>> ==14169==    by 0x480E306:
>> v8::internal::Execution::Call(v8::internal::Handle<v8::internal::JSFunction>,
>> v8::internal::Handle<v8::internal::Object>, int,
>> v8::internal::Object***, bool*) (execution.cc:121)
>> ==14169==    by 0x47D01D6: v8::Script::Run() (api.cc:1242)
>> ==14169==    by 0x47CAE02: scope_run(SuperScopePrivate*,
>> scope_runnable) (actor_avs_superscope.cpp:190)
>> ==14169==    by 0x47CC0BC: lv_superscope_render
>> (actor_avs_superscope.cpp:499)
>> ==14169==    by 0x402FCB0: visual_actor_run (lv_actor.c:777)
>> ==14169==    by 0x4072EEF: pipeline_container_run (lvavs_pipeline.c:
>> 506)
>> ==14169==    by 0x40725EE: lvavs_pipeline_run (lvavs_pipeline.c:209)
>> ==14169==  Address 0xbaddeac is not stack'd, malloc'd or (recently)
>> free'd
>>
>> Here's the script that's being run when the crash happens:
>> d=i+v*0.2; r=t+i*PI*4; x=cos(r)*d; y=sin(r)*d
>>
>> It crashes right before assigning x.
>>
>> Here's where I compile and run the script:
>> int scope_load_runnable(SuperScopePrivate *priv, ScopeRunnable
>> runnable, char *buf)
>> {
>>     printf("buf ------- %s %d\n", buf, (int)runnable);
>>     HandleScope handle_scope;
>>
>>     Handle<Context> context = Context::New(NULL, priv->global);
>>     Context::Scope context_scope(context);
>>     Handle<String> source_obj = String::New(buf);
>>     Persistent<Script> script =
>> Persistent<Script>::New(Script::Compile(source_obj));
>>     priv->runnable[runnable] = script;
>>
>>     return 0;
>>
>> }
>>
>> int scope_run(SuperScopePrivate *priv, ScopeRunnable runnable)
>> {
>>     printf("scope_run ---------- %d\n", (int)runnable);
>>     HandleScope handle_scope;
>>
>>     Handle<Context> context = Context::New(NULL, priv->global);
>>     Context::Scope context_scope(context);
>>     priv->runnable[runnable]->Run();
>>
>>     return 0;
>>
>> }
>>
>> Here's the getter and setter:
>> #define GETTER(name) \
>>     static Handle<Value> prop_getter_##name(Local<String> property,
>> const AccessorInfo &info) { \
>>         Handle<Value> obj(*info.Data()); \
>>         SuperScopePrivate *priv = (SuperScopePrivate
>> *)External::Unwrap(obj); \
>>         printf("getter for %s = %f\n", *String::Value(property), 
>> priv->name); \
>>
>>         return Number::New(priv->name); \
>>     }
>>
>> #define SETTER(name) \
>>     static void prop_setter_##name(Local<String> property,
>> Local<Value> val, const AccessorInfo &info) { \
>>         Handle<Value> obj(*info.Data()); \
>>         SuperScopePrivate *priv = (SuperScopePrivate
>> *)External::Unwrap(obj); \
>>         priv->name = val->ToNumber()->Value(); \
>>         printf("setter for %s = %f\n", *String::Value(property), 
>> priv->name);\
>>
>>     }
>>
>> Here's cos:
>> static Handle<Value> function_cos(const Arguments &args)
>> {
>>         printf("function_cos\n");
>>         HandleScope handle_scope;
>>
>>         if (args.Length() != 1)
>>                 return v8::Undefined();
>>
>>         Handle<Value> val = Number::New(log(args[0]->NumberValue()));
>>
>>         return val;
>>
>> }
>>
>> And here's some output:
>> getter for i = 0.000000
>> getter for v = 0.199020
>> setter for d = 0.039804
>> getter for t = -0.050000
>> getter for i = 0.000000
>> getter PI
>> function_cos
>> getter for d = 0.039804
>
> --
> v8-users mailing list
> [email protected]
> http://groups.google.com/group/v8-users
>

-- 
v8-users mailing list
[email protected]
http://groups.google.com/group/v8-users

Reply via email to