您的位置:首页 > 其它

test02

2010-02-06 18:01 197 查看
HSQOBJECT *po = 0; // 用于保存 callback 函数(脚本函数对象)
// 调用脚本回调函数(并释放)
int doCallback(HSQUIRRELVM v)
{
if(po!=0) {
// 如果closure已经注册,那么将其压入堆栈
sq_pushobject(v, *po);
// 压入roottable作为closure执行“上下文”
sq_pushroottable(v);
// 发起调用(SQFalse,SQFalse表示不返回值,且不引发脚本异常)
if(SQ_FAILED(sq_call(v, 1, SQFalse, SQFalse))) {
printf("回调函数调用失败\n");
}
// 无论closure调用是否成功,closure本身仍然在栈上,因此弹出
sq_poptop(v);
// 减少closure的引用计数(解除C++对该closure的引用)
sq_release(v, po);
delete po;
po = 0;
}
return 0;
}
// 注册回调函数
int setCallback(HSQUIRRELVM v)
{
//printf("C::setCallback() top:%d toptype: %d\n", sq_gettop(v), sq_gettype(v, 2));
po = new HSQOBJECT;
// setCallback被调用时,第一参数是roottable,第二参数是一个closure回调(这里简单起见不做任何检查)
if (SQ_SUCCEEDED(sq_getstackobj(v, 2, po)))
{
// 增加po的引用计数,使其不会由于没有脚本对po的引用而被回收
sq_addref(v, po);
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: