uplev xlua

This commit is contained in:
2020-08-05 07:08:47 +08:00
parent 52cc2a59aa
commit b3f98bfda1
298 changed files with 444 additions and 250 deletions

46
Assets/XLua/Src/Utils.cs Executable file → Normal file
View File

@@ -407,7 +407,9 @@ namespace XLua
FieldInfo[] fields = type.GetFields(flag);
EventInfo[] all_events = type.GetEvents(flag | BindingFlags.Public | BindingFlags.NonPublic);
for (int i = 0; i < fields.Length; ++i)
LuaAPI.lua_checkstack(L, 2);
for (int i = 0; i < fields.Length; ++i)
{
FieldInfo field = fields[i];
string fieldName = field.Name;
@@ -578,14 +580,15 @@ namespace XLua
}
}
public static void loadUpvalue(RealStatePtr L, Type type, string metafunc, int num)
public static void loadUpvalue(RealStatePtr L, Type type, string metafunc, int index)
{
ObjectTranslator translator = ObjectTranslatorPool.Instance.Find(L);
LuaAPI.xlua_pushasciistring(L, metafunc);
LuaAPI.lua_rawget(L, LuaIndexes.LUA_REGISTRYINDEX);
translator.Push(L, type);
LuaAPI.lua_rawget(L, -2);
for (int i = 1; i <= num; i++)
LuaAPI.lua_remove(L, -2);
for (int i = 1; i <= index; i++)
{
LuaAPI.lua_getupvalue(L, -i, i);
if (LuaAPI.lua_isnil(L, -1))
@@ -596,15 +599,27 @@ namespace XLua
LuaAPI.lua_setupvalue(L, -i - 2, i);
}
}
for (int i = 0; i < num; i++)
for (int i = 0; i < index; i++)
{
LuaAPI.lua_remove(L, -num - 1);
LuaAPI.lua_remove(L, -2);
}
}
public static void MakePrivateAccessible(RealStatePtr L, Type type)
public static void RegisterEnumType(RealStatePtr L, Type type)
{
ObjectTranslator translator = ObjectTranslatorPool.Instance.Find(L);
foreach (var name in Enum.GetNames(type))
{
RegisterObject(L, translator, Utils.CLS_IDX, name, Enum.Parse(type, name));
}
}
public static void MakePrivateAccessible(RealStatePtr L, Type type)
{
int oldTop = LuaAPI.lua_gettop(L);
LuaAPI.lua_checkstack(L, 20);
int oldTop = LuaAPI.lua_gettop(L);
LuaAPI.luaL_getmetatable(L, type.FullName);
if (LuaAPI.lua_isnil(L, -1))
@@ -624,7 +639,8 @@ namespace XLua
loadUpvalue(L, type, LuaIndexsFieldName, 2);
int obj_getter = LuaAPI.lua_gettop(L);
int obj_field = obj_getter - 1;
loadUpvalue(L, type, LuaIndexsFieldName, 1);
int obj_field = LuaAPI.lua_gettop(L);
loadUpvalue(L, type, LuaNewIndexsFieldName, 1);
int obj_setter = LuaAPI.lua_gettop(L);
@@ -721,7 +737,6 @@ namespace XLua
if (memberType == LazyMemberTypes.FieldGet)
{
loadUpvalue(L, type, LuaIndexsFieldName, 2);
LuaAPI.lua_remove(L, -2);
}
else
{
@@ -755,7 +770,6 @@ namespace XLua
if (memberType == LazyMemberTypes.PropertyGet)
{
loadUpvalue(L, type, LuaIndexsFieldName, 2);
LuaAPI.lua_remove(L, -2);
}
else
{
@@ -808,7 +822,9 @@ namespace XLua
public static void ReflectionWrap(RealStatePtr L, Type type, bool privateAccessible)
{
int top_enter = LuaAPI.lua_gettop(L);
LuaAPI.lua_checkstack(L, 20);
int top_enter = LuaAPI.lua_gettop(L);
ObjectTranslator translator = ObjectTranslatorPool.Instance.Find(L);
//create obj meta table
LuaAPI.luaL_getmetatable(L, type.FullName);
@@ -841,7 +857,7 @@ namespace XLua
LuaAPI.lua_newtable(L);
int cls_setter = LuaAPI.lua_gettop(L);
LuaCSFunction item_getter;
LuaCSFunction item_getter;
LuaCSFunction item_setter;
makeReflectionWrap(L, type, cls_field, cls_getter, cls_setter, obj_field, obj_getter, obj_setter, obj_meta,
out item_getter, out item_setter, privateAccessible ? (BindingFlags.Public | BindingFlags.NonPublic) : BindingFlags.Public);
@@ -1352,8 +1368,9 @@ namespace XLua
LuaAPI.xlua_pushasciistring(L, path[i]);
if (0 != LuaAPI.xlua_pgettable(L, -2))
{
var err = LuaAPI.lua_tostring(L, -1);
LuaAPI.lua_settop(L, oldTop);
throw new Exception("SetCSTable for [" + type + "] error: " + LuaAPI.lua_tostring(L, -1));
throw new Exception("SetCSTable for [" + type + "] error: " + err);
}
if (LuaAPI.lua_isnil(L, -1))
{
@@ -1417,7 +1434,8 @@ namespace XLua
}
}
return true;
var lastPos = delegateParams.Length - 1;
return lastPos < 0 || delegateParams[lastPos].IsDefined(typeof(ParamArrayAttribute), false) == bridgeParams[lastPos].IsDefined(typeof(ParamArrayAttribute), false);
}
public static bool IsSupportedMethod(MethodInfo method)