lua c如何退出当前执行的lua脚本

lua c如何退出当前执行的lua脚本

  1. 设置钩子函数
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条件指令并触发事件。
  1. 在钩子函数中使用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);
		}
}
  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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值