关于SpiderMonkey使用的问题(!!)(JSGen生成的代码)

21 views
Skip to first unread message

邱戈川

unread,
Apr 2, 2006, 11:29:33 PM4/2/06
to 基于ACE和SpiderMonkey的SMS虚拟运营系统
使用SpiderMonkey(带JS_THREADSAFE编译)的时候,我用JSGen来生成代码,但是发现一下问题:

1、_JSinternalStruct结构的析构函数调用if (o)
JS_SetPrivate(NULL,o,
NULL);会出错,具体原因不了解,大家可以讨论一下。(我现在暂时去掉了)

2、如果想在C++生成好对象,然后用JS_DefineProperty设置给Script使用,则这个对象必须用new生成,且不可以delete。问题出在,用JS_DefineProperty的时候调用了getJSObject,则会将this设置在Private中,在对象消失的时候,会在JSDestructor中被delete掉,所以不可以用实例。如果这个对象需要保存(对于使用状态机的机制,这个是必须的)则必须先生成一个临时变量,然后将这个对象copy到临时变量中,运行完后,在讲这个临时变量copy到对象中,这样可以避免被JSDestructor
delete掉。这样是否会有效率问题?有没有更好的方法?

3、对于多线程的使用是否对于JS函数的调用都要用JS_BeginRequest
和 JS_EndRequest包含起来?

candid Qiu

unread,
Apr 2, 2006, 11:48:38 PM4/2/06
to 基于ACE和SpiderMonkey的SMS虚拟运营系统
JSGen的作者给我发来了两个别人改过的JSGen的代码,用于支持thread safe,不过我看了,好像用处不大,大家可以给些意见。(依然存在上面的问题)
CodeGeneratorMods.zip

邱戈川

unread,
Apr 3, 2006, 12:31:06 PM4/3/06
to 基于ACE和SpiderMonkey的SMS虚拟运营系统
通过多次试验,找到一个解决第二问题的方法,就是在wrapper类中增加一个clearReference函数,将this从private中去掉。如:

JSBool Customer::clearReference(JSContext *cx){
if(!_JSinternal.o || !cx) return JS_FALSE;
return JS_SetPrivate(cx, _JSinternal.o, NULL);
}

在删除对象或对象实例失效前调用这个函数。

这样自己new的类就可以自己delete了,同时也可以支持实例了。

还有一个问题:如果是在js外生成对象,然后通过JS_DefineProperty设置给Script使用,则要设置这个属性为:JSPROP_ENUMERATE|JSPROP_PERMANENT,从而避免被GC收集。如果不用JSPROP_PERMANENT,则调用JS_GC()的
时候会被调用JSDestructor(),这样也会将this删除掉。

邱戈川

unread,
Apr 3, 2006, 12:34:24 PM4/3/06
to 基于ACE和SpiderMonkey的SMS虚拟运营系统
通过这几天的学习发现使用SpiderMoney要注意的地方实在是太多:

1、对于线程安全的使用。
2、GC的垃圾回收
3、C++和JS间的对象共享

我前面给出的一些经验未必正确,希望大家多给建议!!

对于提出的问题同时希望大家能找找答案,谢谢!

candid Qiu

unread,
Apr 3, 2006, 12:37:52 PM4/3/06
to 基于ACE和SpiderMonkey的SMS虚拟运营系统
这个是我更新的JSGen,增加了clearReference函数。
js.rar
Reply all
Reply to author
Forward
0 new messages