UE4 Unlua源码解析1 - 读源码的前置知识

Posted 珞珈大胖强TURBO

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UE4 Unlua源码解析1 - 读源码的前置知识相关的知识,希望对你有一定的参考价值。

源码的前置知识

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使用原理

UE4 Unlua源码解析2 -源码中的重要类及核心函数逐行解释

UE4 Unlua源码解析2 -源码中的重要类及核心函数逐行解释