xlua中lua对象到c#对象的转型
2021-03-02 06:27
标签:方法 function floor 初始化 htm short 自己 本质 val 基础类型 变体(或者说子类型) ??lua中的对象都是用TValue来描述的,TValue中的tt_成员变量代表着这个TValue的类型。关于类型的具体定义,上面贴的代码中的注释中已经讲的比较清楚了。 ??和c语言和lua交互其实没啥本质区别,就是通过lua提供的c函数操作lua栈,直接从栈中取就可以了。区别在于如何把取到的值转换为c#认识的值。 ??lua的类型中boolean、string、number这几个类型是clr所认识的类型,所以clr就可以直接把这些类型拿过来用。具体就是直接调用Lua提供的lua_tonumber之类的c接口。 ??这三个类上面已经说过了,直接用提供的接口转就可以,下面写几个需要注意的点: ??userData主要是lua对c#对象的引用,这里只简单说一下。 ??这两个类型都是通过lua的reference系统来让c#持有对lua对象的引用。 ??c#就是通过这个系统来持有不认识的lua对象的。 ??这样就可以用一个整数来让lua外的环境持有这个lua对象。 ??所有lua对象在c#中的基类,在初始化时通过luaL_ref生成lua对象的引用,在析构时通过luaL_unref移除引用。 ??一般情况下table在C#中被包装为LuaTable类,没啥特别的,只是在LuaBase的基础上增加了几个常用的函数。比如Get、Set之类的,让开发者可以避开一些不直观的栈操作。 ??这几个都差不多。都是把table中的key和value全部拿出来,组成Array或Dictionaray。 ??这两种转型是尝试把这个table看作对应的接口或类。 ??lua函数在c#中有两种表示: ??LuaFunction和luaTable差不多,也是在LuaBase的基础上增加了几个常用函数,Call、Action之类的。 ??为什么已经有LuaFunction还要一个DelegateBridge类? ??这里主要写了常用lua类型转型的简介和一些关键点。可能不够全面和细节。 xlua中lua对象到c#对象的转型 标签:方法 function floor 初始化 htm short 自己 本质 val 原文地址:https://www.cnblogs.com/blueberryzzz/p/13066922.htmllua中的类型
#define LUA_TNIL 0
#define LUA_TBOOLEAN 1
#define LUA_TLIGHTUSERDATA 2
#define LUA_TNUMBER 3
#define LUA_TSTRING 4
#define LUA_TTABLE 5
#define LUA_TFUNCTION 6
#define LUA_TUSERDATA 7
#define LUA_TTHREAD 8
/*
** tags for Tagged Values have the following use of bits:
** bits 0-3: actual tag (a LUA_T* value)
** bits 4-5: variant bits
** bit 6: whether value is collectable
*/
/*
** LUA_TFUNCTION variants:
** 0 - Lua function
** 1 - light C function
** 2 - regular C function (closure)
*/
/* Variant tags for functions */
#define LUA_TLCL (LUA_TFUNCTION | (0
??一个lua对象的类型是由一个7位的bits描述的。比如一个整数,这个对象的类型就是0011000(24)表示这个对象是数字类型中的整形,是一个不可回收对象。C#如何获取lua对象
如何在C#端描述这些类型
简介
??lightUserData、table、function、userData、thread是C#不认识的类,需要通过某种标识(lua自带的reference系统)来表示。boolean、string、number类
LUA_API lua_Integer lua_tointegerx (lua_State *L, int idx, int *pisnum) {
lua_Integer res;
const TValue *o = index2addr(L, idx);
int isnum = tointeger(o, &res);
if (!isnum)
res = 0; /* call to ‘tointeger‘ may change ‘n‘ even if it fails */
if (pisnum) *pisnum = isnum;
return res;
}
/*
** try to convert a value to an integer, rounding according to ‘mode‘:
** mode == 0: accepts only integral values
** mode == 1: takes the floor of the number
** mode == 2: takes the ceil of the number
*/
int luaV_tointeger (const TValue *obj, lua_Integer *p, int mode) {
TValue v;
again:
if (ttisfloat(obj)) {
lua_Number n = fltvalue(obj);
lua_Number f = l_floor(n);
if (n != f) { /* not an integral value? */
if (mode == 0) return 0; /* fails if mode demands integral value */
else if (mode > 1) /* needs ceil? */
f += 1; /* convert floor to ceil (remember: n != f) */
}
return lua_numbertointeger(f, p);
}
else if (ttisinteger(obj)) {
*p = ivalue(obj);
return 1;
}
else if (cvt2num(obj) &&
luaO_str2num(svalue(obj), &v) == vslen(obj) + 1) {
obj = &v;
goto again; /* convert result from ‘luaO_str2num‘ to an integer */
}
return 0; /* conversion failed */
}
userData
??代表c#对象的userData主要分两种。
对table与function的引用简介
lua reference系统
??一共就两个接口:
具体可以看下官方说明lua ReferencesluaBase类
对table的引用
LuaTable
Array、List、Dictionary
接口、其他类
??比如将一个table转为IEnumberator就是把table转为SystemCollectionsIEnumeratorBridge类(继承了LuaBase、实现了IEnumerator的类,由Xlua生成),这个类实现了MoveNext和Reset。实现方法就是调用一下table中对应名称的函数。对function的引用
LuaFunction
DelegateBridge
??因为我们在c#中拿到一个lua函数时,大多数时候是要作为一个委托来时用的。DelegateBridge就是用来化简这个转型操作的。
??DelegateBridge的功能就是在持有lua函数引用的同时,将这个函数包装成各种各样的委托,让整个转型过程对开发人员无感知。
??下面是一个不使用DelegateBridge,自己转型的例子,比较繁琐://将一个LuaFunction作为一个Action
DelegateBridge重要成员
xlua在将lua函数转型的时候做了什么
Tips
其他
??如果有什么错误或者问题可以在下面留言。
上一篇:ffmpeg新旧API对比
文章标题:xlua中lua对象到c#对象的转型
文章链接:http://soscw.com/index.php/essay/58909.html