lua c如何退出当前执行的lua脚本
- 设置钩子函数
lua_sethook(currL, exitLuaScript, LUA_MASKCALL , 0);
参数说明:
LUA_MASKCALL 调用函数时回调: 在调用一个函数对象之前,都会先调用luaD_precall,在这个函数里触发事件。
LUA_MASKRET 函数返回时回调:完成一个函数时,会先调用luaD_poscall,在这个函数里触发事件。
LUA_MASKLINE 执行一行时代码时回调,vmfetch中每执行一条指令,都会调用luaG_traceexec函数,在其中判断新行并触发事件
LUA_MASKCOUNT 每执行count条指令时回调,vmfetch中每执行一条指令,都会调用luaG_traceexec函数,在其中判断是否执行了count条件指令并触发事件。
- 在钩子函数中使用c库的longjmp()
static int exitLuaScript_flag = 0;
static jmp_buf place;
static void exitLuaScript(lua_State* L, lua_Debug *ar)
{
if(exitLuaScript_flag==1){
exitLuaScript_flag = 0;
longjmp(place, 1);
}
}
- 在需要跳转到的点设置setjmp
ret = setjmp(place);
if(ret==0){
//设置place,
}else{
//有值表示longjmp返回.
}
longjmp setjmp 使用demo
#include <stdio.h>
#include <stdlib.h>
#include <setjmp.h>
jmp_buf env;
int my_test(int a, int b) {
if (b == 0) {
printf("test 0\n");
longjmp(env, 1);
}
return a / b;
}
int main(int argc, char const *argv[]) {
int res = setjmp(env);
if (res == 0) { //执行my_func方法
printf("return from setjmp\n");
my_func(10, 0);
} else {//遇到longjmp,则进入该分支
printf("return from longjmp: %d\n", res);
}
return 0;
}