UE4 Unlua源码解析1 - 读源码的前置知识
Posted 珞珈大胖强TURBO
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UE4 Unlua源码解析1 - 读源码的前置知识相关的知识,希望对你有一定的参考价值。
源码的前置知识
- 1 lua.h内的方法 lua和C交互的API
- 1.1 lua_register
- 1.2 lua_gettop
- 1.3 lua_pop
- 1.4 lua_tolstring
- 1.5 lua_tostring
- 1.6 lua_getfield
- 1.7 luaL_getmetatable
- 1.8 luaL_newmetatable
- 1.9 lua_getmetatable
- 1.10 lua_pushstring
- 1.11 lua_settable
- 1.12 lua_rawset
- 1.13 lua_gettable
- 1.14 lua_rawget
- 1.15 lua_pushinteger
- 1.16 lua_pushlightuserdata
- 1.17 lua_pushcclosure
- 1.18 lua_pushvalue
- 1.19 lua_setmetatable
- 1.20 lua_getglobal
- 1.21 lua_setglobal
- 1.22 lua_pushnil
- 1.23 lua_upvalueindex
- 1.24 lua_touserdata
- 1.25 lua_newtable
- 1.26 lua_createtable
- 1.27 lua_next
- 1.28 lua_tolstring
- 1.29 lua_tostring
- 1.30 lua_newuserdata
- 2 lua中的全局方法
- 3 Lua C++ 调用机制
1 lua.h内的方法 lua和C交互的API
1.1 lua_register
void lua_register (lua_State *L,
const char *name,
lua_CFunction f);
将C函数f设置为全局名称name的新值,
lua端可以通过name调用C方法f
1.2 lua_gettop
int lua_gettop (lua_State *L);
返回虚拟栈的顶部元素的索引,因为虚拟栈底是1,所以返回的是栈的大小
1.3 lua_pop
void lua_pop (lua_State *L, int n);
弹出n个值
1.4 lua_tolstring
const char *lua_tolstring (lua_State *L, int index, size_t *len);
栈index位置的值value转成C string , len不为空的时候,设置len为string的长度,value必须为string或者number,否则返回null。(不要在遍历的时候对key使用此方法)
返回对齐指针,指向虚拟机内的string,有终止符\\0,但是可以包括其他0,因为Lua有垃圾收集功能。注意!当value从虚拟栈中移除后不能保证string还有效!
1.5 lua_tostring
const char *lua_tostring (lua_State *L, int index);
相当于lua_tolstring,只是len为NULL
1.6 lua_getfield
void lua_getfield (lua_State *L, int index, const char *k);
将值t[k]压入虚拟栈,其中t是给定有效索引处的值。和Lua一样,这个函数可能会触发index事件的元方法(见2.8)。
1.7 luaL_getmetatable
void luaL_getmetatable (lua_State *L, const char *tname);
将注册表registry中与名称tname关联的元表推入堆栈
1.8 luaL_newmetatable
int luaL_newmetatable (lua_State *L, const char *tname);
如果注册表已经有键tname,则返回0。否则,创建一个新表作为userdata的元表,将它添加到注册表registry中使用键tname,返回1。
在这两种情况下,都将注册表中与tname相关的最终值推入堆栈。
1.9 lua_getmetatable
int lua_getmetatable (lua_State *L, int index);
将index索引处的表的元表入虚拟栈,如果索引无效,或者值没有元表,则函数返回0,并且不向堆栈上压入任何东西。
1.10 lua_pushstring
void lua_pushstring (lua_State *L, const char *s);
把字符串s推入虚拟栈,lua会做拷贝,所以参数s可以释放,切记传入字符串不能包含embedded zeros,我猜是终止符的意思,如果有会结束
1.11 lua_settable
void lua_settable (lua_State *L, int index);
t[k] = v,t是index在虚拟栈中取到的值,v是栈顶,k是栈顶下的东西,也就是-2索引对应的值,-1是栈顶
然后弹出k和v
1.12 lua_rawset
void lua_rawset (lua_State *L, int index);
和lua_settable一样,区别是此方法不使用元方法
1.13 lua_gettable
void lua_gettable (lua_State *L, int index);
k出栈,t[k]入栈,t是index在虚拟栈中取到的值,k是栈顶
1.14 lua_rawget
void lua_rawget (lua_State *L, int index);
和lua_gettable一样,区别是此方法不使用元方法
1.15 lua_pushinteger
void lua_pushinteger (lua_State *L, lua_Integer n);
数字n入虚拟栈
1.16 lua_pushlightuserdata
void lua_pushlightuserdata (lua_State *L, void *p);
lightuserdata 入虚拟栈
userdata是C 的value,lightuserdata是指针
1.17 lua_pushcclosure
void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n);
C 闭包入虚拟栈
当创建一个C函数时,可以将一些值与它关联起来,从而创建一个C闭包
然后,每当函数调用时,这些值都可以访问,要将值与C函数相关联,首先应该将这些值压入堆栈(当有多个值时,第一个值先压入)。
然后调用lua pushcclosure来创建C函数并将其推入堆栈,参数n告诉函数应该关联多少值,Lua pushcclosure也会从堆栈中弹出这些值。
n的最大值为255。
1.18 lua_pushvalue
void lua_pushvalue (lua_State *L, int index);
把index位置的值复制一份入虚拟栈
1.19 lua_setmetatable
int lua_setmetatable (lua_State *L, int index);
弹出栈顶的表,设置index位置的表的元表为弹出的表
1.20 lua_getglobal
void lua_getglobal (lua_State *L, const char *name);
将全局的name对应的值入虚拟栈,lua端可访问
1.21 lua_setglobal
void lua_setglobal (lua_State *L, const char *name);
弹出栈顶,设置其为全局表键为name的值
1.22 lua_pushnil
void lua_pushnil (lua_State *L);
nil入虚拟栈
1.23 lua_upvalueindex
拿闭包中的upvalue
1.24 lua_touserdata
void *lua_touserdata (lua_State *L, int index);
如果给定可接受索引处的值是完整的userdata,则返回其块地址。如果值是light userdata,则返回它的指针。否则,返回NULL。
1.25 lua_newtable
void lua_newtable (lua_State *L);
创建一个新的空表并将其推入堆栈
1.26 lua_createtable
void lua_createtable (lua_State *L, int narr, int nrec);
创建一个新的空表并将其推入堆栈,新表为narr数组元素和nrec非数组元素预先分配了空间。当确切地知道表将有多少个元素时,这种预分配是有用的
1.27 lua_next
int lua_next (lua_State *L, int index);
1.28 lua_tolstring
const char *lua_tolstring (lua_State *L, int index, size_t *len);
将给定可接受索引处的Lua值转换为C字符串,如果len不是NULL,它也将*len设置为字符串长度。Lua值必须是字符串或数字
否则,函数返回NULL。如果值是一个数字,那么lua tolstring也将堆栈中的实际值更改为字符串。
1.29 lua_tostring
const char *lua_tostring (lua_State *L, int index);
相当于lua tolstring, len等于NULL。
1.30 lua_newuserdata
void *lua_newuserdata (lua_State *L, size_t size);
此函数分配一个具有给定大小的新内存块,将一个新的完整userdata和块地址压入堆栈,并返回该地址
当Lua使用gc元方法收集完整的用户数据时,Lua调用该元方法并将用户数据标记为已完成。当再次收集用户数据时,Lua释放相应的内存。
2 lua中的全局方法
rawset (table, index, value)
屏蔽 __newindex
元方法的写值方法,设置table【index】= value,返回table
rawget (table, index)
屏蔽 __index
元方法的读值方法,返回table【index】
3 Lua C++ 调用机制
根据Lua和C++交互机制,调用开始时,Lua会把从左到右的Lua参数依次压入栈;
调用结束时,C++会把返回值依次压入栈中,同时return返回值个数,lua会根据return的返回值个数,依次去栈顶取出返回值。
以上是关于UE4 Unlua源码解析1 - 读源码的前置知识的主要内容,如果未能解决你的问题,请参考以下文章
UE4 Unlua源码解析7 - Lua通过UE命名空间访问C++类型的实现原理
UE4 Unlua源码解析7 - Lua通过UE命名空间访问C++类型的实现原理
UE4 Unlua源码解析7 - Lua通过UE命名空间访问C++类型的实现原理
UE4 Unlua源码解析11 - 非UE4反射支持的静态类导出给Lua使用原理