C与lua交互--lua调用栈分析

Posted jaysonhome

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C与lua交互--lua调用栈分析相关的知识,希望对你有一定的参考价值。

0 预备知识:

 至少对Lua手册C API有简单的了解。lua5.3手册中文

1  Lua虚拟机的栈,如图:

假设虚拟机的栈有n个数据:

技术图片

 

 解释:

两种解释方式:

A,栈顶开始, -1 ...-n

B,栈底开始,1 ...n

 

二、运行原理和调用栈机制实例

创建main.lua

1 function LuaFunc(a)
2     return 1+a,2,3,4;
3 end

C++

 1 //①新建虚拟机  
 2     lua_State* L = luaL_newstate();
 3     //②载入库  
 4     luaL_openlibs(L);
 5 
 6     //③这里执行 test.lua  Lua文件  
 7     luaL_dofile(L, "main.lua");
 8 
 9     //④重新设置栈底
10     lua_settop(L, 0);
11 
12     //⑤获取 返回结果  
13     lua_getglobal(L, "LuaFunc");
14     // 打印结果:4
15     printf("栈顶的索引:%d
", lua_gettop(L));
16     lua_pushinteger(L, 14);
17 
18     //⑥操作栈调回结果
19     lua_pcall(L, 1, 4, 0);
20 
21     //此时你会发现栈内有4个元素
22     printf("lua_gettop %d
", lua_gettop(L));
23 
24     printf("%s
", lua_tostring(L, 1));
25     printf("%s
", lua_tostring(L, 2));
26     printf("%s
", lua_tostring(L, 3));
27     printf("%s
", lua_tostring(L, 4));
28 
29     //⑦一定记得关闭虚拟机  
30     lua_close(L); 
31 
32     system("pause");
33     return 0;

运行结果:

技术图片

 

分析:

1-3,准备环境,执行Lua文件

4,重新设置栈底

5,获取函数LuaFunc,并且压如栈(栈内有1个元素了),lua_pushinteger将14压入栈(栈内有2个元素了)

6,pop出栈的函数,参数(栈内有0个元素了),计算得到的结果,15,2,3,4 分别压入栈(栈内有4个元素了)

以上是关于C与lua交互--lua调用栈分析的主要内容,如果未能解决你的问题,请参考以下文章

lua C API

从lua的c源码了解lua栈结构和函数调用流程

Lua与C/C++交互——C/C++调用Lua脚本

lua 与 c++或者c 交互的底层原理谁能解释一下?最最底层的,为啥它们调用C或者C++的函数?

深入xLua实现原理之C#如何调用Lua

Lua与C/C++交互