mirror of
https://github.com/wechat-miniprogram/minigame-tuanjie-transform-sdk.git
synced 2025-11-13 03:35:55 +08:00
161 lines
3.5 KiB
C
161 lines
3.5 KiB
C
|
|
#include "lua_adaptor_import.h"
|
||
|
|
|
||
|
|
#if LUA_VERSION_NUM == 503
|
||
|
|
|
||
|
|
#define GETTVALUE(v) v
|
||
|
|
#define tvtype(o) ttnov(o)
|
||
|
|
#define LUA_PROTO LUA_TPROTO
|
||
|
|
#define LUA_UPVAL LUA_TUPVAL
|
||
|
|
#define LUA_TABLE LUA_TTABLE
|
||
|
|
#define LUA_THREAD LUA_TTHREAD
|
||
|
|
#define LUA_USERDATA LUA_TUSERDATA
|
||
|
|
#define LUA_LIGHTUSERDATA LUA_TLIGHTUSERDATA
|
||
|
|
#define LUA_SHRSTR LUA_TSHRSTR
|
||
|
|
#define LUA_LNGSTR LUA_TLNGSTR
|
||
|
|
#define LUA_LCL LUA_TLCL
|
||
|
|
#define LUA_CCL LUA_TCCL
|
||
|
|
#define LUA_LCF LUA_TLCF
|
||
|
|
#define LUA_IS_LUA_C_FUNCTION(f) (ttislcf(f))
|
||
|
|
#define LUA_C_CLUSTER_VALUE(f) (clCvalue(f))
|
||
|
|
|
||
|
|
static TValue* lua_index2addr(lua_State* L, int idx)
|
||
|
|
{
|
||
|
|
CallInfo* ci = L->ci;
|
||
|
|
if (idx > 0)
|
||
|
|
{
|
||
|
|
TValue* o = GETTVALUE(ci->func + idx);
|
||
|
|
api_check(L, idx <= ci->top - (ci->func + 1), "unacceptable index");
|
||
|
|
if (o >= GETTVALUE(L->top)) return NONVALIDVALUE;
|
||
|
|
else return o;
|
||
|
|
}
|
||
|
|
else if (!ispseudo(idx))
|
||
|
|
{
|
||
|
|
/* negative index */
|
||
|
|
api_check(L, idx != 0 && -idx <= L->top - (ci->func + 1), "invalid index");
|
||
|
|
return GETTVALUE(L->top + idx);
|
||
|
|
}
|
||
|
|
else if (idx == LUA_REGISTRYINDEX)
|
||
|
|
return &G(L)->l_registry;
|
||
|
|
else
|
||
|
|
{
|
||
|
|
/* upvalues */
|
||
|
|
idx = LUA_REGISTRYINDEX - idx;
|
||
|
|
api_check(L, idx <= MAXUPVAL + 1, "upvalue index too large");
|
||
|
|
if (LUA_IS_LUA_C_FUNCTION(GETTVALUE(ci->func)))
|
||
|
|
return NONVALIDVALUE;
|
||
|
|
else
|
||
|
|
{
|
||
|
|
CClosure* func = LUA_C_CLUSTER_VALUE(GETTVALUE(ci->func));
|
||
|
|
return (idx <= func->nupvalues) ? &func->upvalue[idx - 1] : NONVALIDVALUE;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
uintptr_t lua_getaddr(lua_State* L, int idx) {
|
||
|
|
TValue* o = lua_index2addr(L, idx);
|
||
|
|
if (!o)
|
||
|
|
return (uintptr_t)(lua_topointer(L, -1));
|
||
|
|
|
||
|
|
switch (tvtype(o))
|
||
|
|
{
|
||
|
|
case LUA_TPROTO:
|
||
|
|
{
|
||
|
|
return (uintptr_t)(pvalue(o));
|
||
|
|
}
|
||
|
|
case LUA_SHRSTR:
|
||
|
|
case LUA_LNGSTR:
|
||
|
|
{
|
||
|
|
return (uintptr_t)(tsvalue(o));
|
||
|
|
}
|
||
|
|
case LUA_TTABLE:
|
||
|
|
case LUA_LCL:
|
||
|
|
case LUA_CCL:
|
||
|
|
case LUA_LCF:
|
||
|
|
case LUA_TTHREAD:
|
||
|
|
case LUA_TUSERDATA:
|
||
|
|
case LUA_TLIGHTUSERDATA:
|
||
|
|
default: {
|
||
|
|
return (uintptr_t)(lua_topointer(L, -1));
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
size_t lua_sizeof(lua_State* L, int idx){
|
||
|
|
const char* tn = lua_typename(L, lua_type(L, -1));
|
||
|
|
TValue* o = lua_index2addr(L, idx);
|
||
|
|
if (!o)
|
||
|
|
return 0;
|
||
|
|
|
||
|
|
switch (tvtype(o))
|
||
|
|
{
|
||
|
|
|
||
|
|
case LUA_TABLE:
|
||
|
|
{
|
||
|
|
luaL_checkstack(L, LUA_MINSTACK, NULL);
|
||
|
|
Table* h = hvalue(o);
|
||
|
|
if (h == NULL) {
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
return (sizeof(Table) + sizeof(TValue) * h->sizearray +
|
||
|
|
sizeof(Node) * (isdummy(h) ? 0 : sizenode(h)));
|
||
|
|
}
|
||
|
|
case LUA_LCL:
|
||
|
|
{
|
||
|
|
LClosure* cl = clLvalue(o);
|
||
|
|
return sizeLclosure(cl->nupvalues);
|
||
|
|
}
|
||
|
|
case LUA_CCL:
|
||
|
|
{
|
||
|
|
CClosure* cl = clCvalue(o);
|
||
|
|
return sizeCclosure(cl->nupvalues);
|
||
|
|
}
|
||
|
|
case LUA_TTHREAD:
|
||
|
|
{
|
||
|
|
lua_State* th = thvalue(o);
|
||
|
|
|
||
|
|
return (sizeof(lua_State) + sizeof(TValue) * th->stacksize +
|
||
|
|
sizeof(CallInfo) * th->nci);
|
||
|
|
}
|
||
|
|
case LUA_PROTO:
|
||
|
|
{
|
||
|
|
Proto* p = (Proto*)pvalue(o);
|
||
|
|
return (sizeof(Proto) +
|
||
|
|
sizeof(Instruction) * p->sizecode +
|
||
|
|
sizeof(Proto*) * p->sizep +
|
||
|
|
sizeof(TValue) * p->sizek +
|
||
|
|
sizeof(int) * p->sizelineinfo +
|
||
|
|
sizeof(LocVar) * p->sizelocvars +
|
||
|
|
sizeof(TString*) * p->sizeupvalues);
|
||
|
|
}
|
||
|
|
|
||
|
|
case LUA_USERDATA:
|
||
|
|
{
|
||
|
|
return sizeudata(uvalue(o));
|
||
|
|
}
|
||
|
|
case LUA_SHRSTR:
|
||
|
|
{
|
||
|
|
TString* ts = gco2ts(o);
|
||
|
|
return sizelstring(ts->shrlen);
|
||
|
|
}
|
||
|
|
case LUA_LNGSTR:
|
||
|
|
{
|
||
|
|
TString* ts = gco2ts(o);
|
||
|
|
return sizelstring(ts->u.lnglen);
|
||
|
|
}
|
||
|
|
case LUA_TNUMBER:
|
||
|
|
{
|
||
|
|
return sizeof(lua_Number);
|
||
|
|
}
|
||
|
|
case LUA_TBOOLEAN:
|
||
|
|
{
|
||
|
|
return sizeof(int);
|
||
|
|
}
|
||
|
|
case LUA_LIGHTUSERDATA:
|
||
|
|
{
|
||
|
|
return sizeof(void*);
|
||
|
|
}
|
||
|
|
default: return (size_t)(0);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
#endif
|