public void __Gen_Delegate_Imp17(object p0, CardType p1, ElementType p2) { #if THREAD_SAFE || HOTFIX_ENABLE lock (luaEnv.luaEnvLock) { #endif RealStatePtr L = luaEnv.rawL; int errFunc = LuaAPI.pcall_prepare(L, errorFuncRef, luaReference); ObjectTranslator translator = luaEnv.translator; translator.PushAny(L, p0); translator.PushCardType(L, p1); translator.PushElementType(L, p2); PCall(L, 3, 0, errFunc); LuaAPI.lua_settop(L, errFunc - 1); #if THREAD_SAFE || HOTFIX_ENABLE } #endif }
public void __Gen_Delegate_Imp4(XLua.LuaTable p0, float p1, object p2) { #if THREAD_SAFE || HOTFIX_ENABLE lock (luaEnv.luaEnvLock) { #endif RealStatePtr L = luaEnv.rawL; int errFunc = LuaAPI.pcall_prepare(L, errorFuncRef, luaReference); ObjectTranslator translator = luaEnv.translator; translator.Push(L, p0); LuaAPI.lua_pushnumber(L, p1); translator.PushAny(L, p2); PCall(L, 3, 0, errFunc); LuaAPI.lua_settop(L, errFunc - 1); #if THREAD_SAFE || HOTFIX_ENABLE } #endif }
public UnityEngine.Vector3 __Gen_Delegate_Imp16(object p0, int p1) { #if THREAD_SAFE || HOTFIX_ENABLE lock (luaEnv.luaEnvLock) { #endif RealStatePtr L = luaEnv.rawL; int errFunc = LuaAPI.pcall_prepare(L, errorFuncRef, luaReference); ObjectTranslator translator = luaEnv.translator; translator.PushAny(L, p0); LuaAPI.xlua_pushinteger(L, p1); PCall(L, 2, 1, errFunc); UnityEngine.Vector3 __gen_ret; translator.Get(L, errFunc + 1, out __gen_ret); LuaAPI.lua_settop(L, errFunc - 1); return(__gen_ret); #if THREAD_SAFE || HOTFIX_ENABLE } #endif }
public decimal __Gen_Delegate_Imp23(object p0, decimal p1) { #if THREAD_SAFE || HOTFIX_ENABLE lock (luaEnv.luaEnvLock) { #endif RealStatePtr L = luaEnv.rawL; int errFunc = LuaAPI.pcall_prepare(L, errorFuncRef, luaReference); ObjectTranslator translator = luaEnv.translator; translator.PushAny(L, p0); translator.PushDecimal(L, p1); PCall(L, 2, 1, errFunc); decimal __gen_ret; translator.Get(L, errFunc + 1, out __gen_ret); LuaAPI.lua_settop(L, errFunc - 1); return(__gen_ret); #if THREAD_SAFE || HOTFIX_ENABLE } #endif }
public float __Gen_Delegate_Imp19(object p0, float p1) { #if THREAD_SAFE || HOTFIX_ENABLE lock (luaEnv.luaEnvLock) { #endif RealStatePtr L = luaEnv.rawL; int errFunc = LuaAPI.pcall_prepare(L, errorFuncRef, luaReference); ObjectTranslator translator = luaEnv.translator; translator.PushAny(L, p0); LuaAPI.lua_pushnumber(L, p1); PCall(L, 2, 1, errFunc); float __gen_ret = (float)LuaAPI.lua_tonumber(L, errFunc + 1); LuaAPI.lua_settop(L, errFunc - 1); return(__gen_ret); #if THREAD_SAFE || HOTFIX_ENABLE } #endif }
public int __Gen_Delegate_Imp13(object p0, int p1, int p2) { #if THREAD_SAFE || HOTFIX_ENABLE lock (luaEnv.luaEnvLock) { #endif RealStatePtr L = luaEnv.rawL; int errFunc = LuaAPI.pcall_prepare(L, errorFuncRef, luaReference); ObjectTranslator translator = luaEnv.translator; translator.PushAny(L, p0); LuaAPI.xlua_pushinteger(L, p1); LuaAPI.xlua_pushinteger(L, p2); PCall(L, 3, 1, errFunc); int __gen_ret = LuaAPI.xlua_tointeger(L, errFunc + 1); LuaAPI.lua_settop(L, errFunc - 1); return __gen_ret; #if THREAD_SAFE || HOTFIX_ENABLE } #endif }
public UnityEngine.GameObject __Gen_Delegate_Imp19(IFramework.Hotfix.Lua.StructTest p0, int p1, object p2) { #if THREAD_SAFE || HOTFIX_ENABLE lock (luaEnv.luaEnvLock) { #endif RealStatePtr L = luaEnv.rawL; int errFunc = LuaAPI.pcall_prepare(L, errorFuncRef, luaReference); ObjectTranslator translator = luaEnv.translator; translator.Push(L, p0); LuaAPI.xlua_pushinteger(L, p1); translator.PushAny(L, p2); PCall(L, 3, 1, errFunc); UnityEngine.GameObject __gen_ret = (UnityEngine.GameObject)translator.GetObject(L, errFunc + 1, typeof(UnityEngine.GameObject)); LuaAPI.lua_settop(L, errFunc - 1); return __gen_ret; #if THREAD_SAFE || HOTFIX_ENABLE } #endif }
public byte[] __Gen_Delegate_Imp7(object p0, ref string p1) { #if THREAD_SAFE || HOTFIX_ENABLE lock (luaEnv.luaEnvLock) { #endif RealStatePtr L = luaEnv.rawL; int errFunc = LuaAPI.pcall_prepare(L, errorFuncRef, luaReference); ObjectTranslator translator = luaEnv.translator; translator.PushAny(L, p0); LuaAPI.lua_pushstring(L, p1); PCall(L, 2, 2, errFunc); p1 = LuaAPI.lua_tostring(L, errFunc + 2); byte[] __gen_ret = LuaAPI.lua_tobytes(L, errFunc + 1); LuaAPI.lua_settop(L, errFunc - 1); return(__gen_ret); #if THREAD_SAFE || HOTFIX_ENABLE } #endif }
public object __Gen_Delegate_Imp6(System.IntPtr p0, int p1, object p2) { #if THREAD_SAFE || HOTFIX_ENABLE lock (luaEnv.luaEnvLock) { #endif RealStatePtr L = luaEnv.rawL; int errFunc = LuaAPI.pcall_prepare(L, errorFuncRef, luaReference); ObjectTranslator translator = luaEnv.translator; LuaAPI.lua_pushlightuserdata(L, p0); LuaAPI.xlua_pushinteger(L, p1); translator.PushAny(L, p2); PCall(L, 3, 1, errFunc); object __gen_ret = translator.GetObject(L, errFunc + 1, typeof(object)); LuaAPI.lua_settop(L, errFunc - 1); return(__gen_ret); #if THREAD_SAFE || HOTFIX_ENABLE } #endif }
public void __Gen_Delegate_Imp7(string p0, GameFramework.Resource.LoadResourceStatus p1, string p2, object p3) { #if THREAD_SAFE || HOTFIX_ENABLE lock (luaEnv.luaEnvLock) { #endif RealStatePtr L = luaEnv.rawL; int errFunc = LuaAPI.pcall_prepare(L, errorFuncRef, luaReference); ObjectTranslator translator = luaEnv.translator; LuaAPI.lua_pushstring(L, p0); translator.Push(L, p1); LuaAPI.lua_pushstring(L, p2); translator.PushAny(L, p3); PCall(L, 4, 0, errFunc); LuaAPI.lua_settop(L, errFunc - 1); #if THREAD_SAFE || HOTFIX_ENABLE } #endif }
public void __Gen_Delegate_Imp15(object p0, ElementType p1, float p2, UnityEngine.Vector3 p3) { #if THREAD_SAFE || HOTFIX_ENABLE lock (luaEnv.luaEnvLock) { #endif RealStatePtr L = luaEnv.rawL; int errFunc = LuaAPI.pcall_prepare(L, errorFuncRef, luaReference); ObjectTranslator translator = luaEnv.translator; translator.PushAny(L, p0); translator.PushElementType(L, p1); LuaAPI.lua_pushnumber(L, p2); translator.PushUnityEngineVector3(L, p3); PCall(L, 4, 0, errFunc); LuaAPI.lua_settop(L, errFunc - 1); #if THREAD_SAFE || HOTFIX_ENABLE } #endif }
public bool __Gen_Delegate_Imp22(object p0, string p1, object[] p2) { #if THREAD_SAFE || HOTFIX_ENABLE lock (luaEnv.luaEnvLock) { #endif RealStatePtr L = luaEnv.rawL; int errFunc = LuaAPI.pcall_prepare(L, errorFuncRef, luaReference); ObjectTranslator translator = luaEnv.translator; translator.PushAny(L, p0); LuaAPI.lua_pushstring(L, p1); translator.Push(L, p2); PCall(L, 3, 1, errFunc); bool __gen_ret = LuaAPI.lua_toboolean(L, errFunc + 1); LuaAPI.lua_settop(L, errFunc - 1); return(__gen_ret); #if THREAD_SAFE || HOTFIX_ENABLE } #endif }
public void __Gen_Delegate_Imp24(object p0, bool p1, int p2, int p3) { #if THREAD_SAFE || HOTFIX_ENABLE lock (luaEnv.luaEnvLock) { #endif RealStatePtr L = luaEnv.rawL; int errFunc = LuaAPI.pcall_prepare(L, errorFuncRef, luaReference); ObjectTranslator translator = luaEnv.translator; translator.PushAny(L, p0); LuaAPI.lua_pushboolean(L, p1); LuaAPI.xlua_pushinteger(L, p2); LuaAPI.xlua_pushinteger(L, p3); PCall(L, 4, 0, errFunc); LuaAPI.lua_settop(L, errFunc - 1); #if THREAD_SAFE || HOTFIX_ENABLE } #endif }
public Unity.Entities.Entity __Gen_Delegate_Imp47(object p0, long p1, UnityMMO.SceneObjectType p2) { #if THREAD_SAFE || HOTFIX_ENABLE lock (luaEnv.luaEnvLock) { #endif RealStatePtr L = luaEnv.rawL; int errFunc = LuaAPI.pcall_prepare(L, errorFuncRef, luaReference); ObjectTranslator translator = luaEnv.translator; translator.PushAny(L, p0); LuaAPI.lua_pushint64(L, p1); translator.PushUnityMMOSceneObjectType(L, p2); PCall(L, 3, 1, errFunc); Unity.Entities.Entity __gen_ret; translator.Get(L, errFunc + 1, out __gen_ret); LuaAPI.lua_settop(L, errFunc - 1); return(__gen_ret); #if THREAD_SAFE || HOTFIX_ENABLE } #endif }
public static int XLuaAccess(RealStatePtr L) { try { ObjectTranslator translator = ObjectTranslatorPool.Instance.Find(L); Type type = getType(L, translator, 1); object obj = null; if (type == null && LuaAPI.lua_type(L, 1) == LuaTypes.LUA_TUSERDATA) { obj = translator.SafeGetCSObj(L, 1); if (obj == null) { return(LuaAPI.luaL_error(L, "xlua.access, #1 parameter must a type/c# object/string")); } type = obj.GetType(); } if (type == null) { return(LuaAPI.luaL_error(L, "xlua.access, can not find c# type")); } string fieldName = LuaAPI.lua_tostring(L, 2); BindingFlags bindingFlags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static; if (LuaAPI.lua_gettop(L) > 2) // set { var field = type.GetField(fieldName, bindingFlags); if (field != null) { field.SetValue(obj, translator.GetObject(L, 3, field.FieldType)); return(0); } var prop = type.GetProperty(fieldName, bindingFlags); if (prop != null) { prop.SetValue(obj, translator.GetObject(L, 3, prop.PropertyType), null); return(0); } } else { var field = type.GetField(fieldName, bindingFlags); if (field != null) { translator.PushAny(L, field.GetValue(obj)); return(1); } var prop = type.GetProperty(fieldName, bindingFlags); if (prop != null) { translator.PushAny(L, prop.GetValue(obj, null)); return(1); } } return(LuaAPI.luaL_error(L, "xlua.access, no field " + fieldName)); } catch (Exception e) { return(LuaAPI.luaL_error(L, "c# exception in xlua.access: " + e)); } }
public static void ReflectionWrap(RealStatePtr L, Type type) { int top_enter = LuaAPI.lua_gettop(L); ObjectTranslator translator = ObjectTranslatorPool.Instance.Find(L); //create obj meta table LuaAPI.luaL_getmetatable(L, type.FullName); if (LuaAPI.lua_isnil(L, -1)) { LuaAPI.lua_pop(L, 1); LuaAPI.luaL_newmetatable(L, type.FullName); } LuaAPI.lua_pushlightuserdata(L, LuaAPI.xlua_tag()); LuaAPI.lua_pushnumber(L, 1); LuaAPI.lua_rawset(L, -3); int obj_meta = LuaAPI.lua_gettop(L); LuaAPI.lua_newtable(L); int cls_meta = LuaAPI.lua_gettop(L); LuaAPI.lua_newtable(L); int obj_field = LuaAPI.lua_gettop(L); LuaAPI.lua_newtable(L); int obj_getter = LuaAPI.lua_gettop(L); LuaAPI.lua_newtable(L); int obj_setter = LuaAPI.lua_gettop(L); LuaAPI.lua_newtable(L); int cls_field = LuaAPI.lua_gettop(L); LuaAPI.lua_newtable(L); int cls_getter = LuaAPI.lua_gettop(L); LuaAPI.lua_newtable(L); int cls_setter = LuaAPI.lua_gettop(L); 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); // init obj metatable LuaAPI.xlua_pushasciistring(L, "__gc"); LuaAPI.lua_pushstdcallcfunction(L, translator.metaFunctions.GcMeta); LuaAPI.lua_rawset(L, obj_meta); LuaAPI.xlua_pushasciistring(L, "__tostring"); LuaAPI.lua_pushstdcallcfunction(L, translator.metaFunctions.ToStringMeta); LuaAPI.lua_rawset(L, obj_meta); LuaAPI.xlua_pushasciistring(L, "__index"); LuaAPI.lua_pushvalue(L, obj_field); LuaAPI.lua_pushvalue(L, obj_getter); translator.PushFixCSFunction(L, item_getter); translator.PushAny(L, type.BaseType); LuaAPI.xlua_pushasciistring(L, Utils.LuaIndexsFieldName); LuaAPI.lua_rawget(L, LuaIndexes.LUA_REGISTRYINDEX); LuaAPI.lua_pushnil(L); LuaAPI.gen_obj_indexer(L); //store in lua indexs function tables LuaAPI.xlua_pushasciistring(L, Utils.LuaIndexsFieldName); LuaAPI.lua_rawget(L, LuaIndexes.LUA_REGISTRYINDEX); translator.Push(L, type); LuaAPI.lua_pushvalue(L, -3); LuaAPI.lua_rawset(L, -3); LuaAPI.lua_pop(L, 1); LuaAPI.lua_rawset(L, obj_meta); // set __index LuaAPI.xlua_pushasciistring(L, "__newindex"); LuaAPI.lua_pushvalue(L, obj_setter); translator.PushFixCSFunction(L, item_setter); translator.Push(L, type.BaseType); LuaAPI.xlua_pushasciistring(L, Utils.LuaNewIndexsFieldName); LuaAPI.lua_rawget(L, LuaIndexes.LUA_REGISTRYINDEX); LuaAPI.lua_pushnil(L); LuaAPI.gen_obj_newindexer(L); //store in lua newindexs function tables LuaAPI.xlua_pushasciistring(L, Utils.LuaNewIndexsFieldName); LuaAPI.lua_rawget(L, LuaIndexes.LUA_REGISTRYINDEX); translator.Push(L, type); LuaAPI.lua_pushvalue(L, -3); LuaAPI.lua_rawset(L, -3); LuaAPI.lua_pop(L, 1); LuaAPI.lua_rawset(L, obj_meta); // set __newindex //finish init obj metatable LuaAPI.xlua_pushasciistring(L, "UnderlyingSystemType"); translator.PushAny(L, type); LuaAPI.lua_rawset(L, cls_field); if (type != null && type.IsEnum) { LuaAPI.xlua_pushasciistring(L, "__CastFrom"); translator.PushFixCSFunction(L, genEnumCastFrom(type)); LuaAPI.lua_rawset(L, cls_field); } //set cls_field to namespace SetCSTable(L, type, cls_field); //finish set cls_field to namespace //init class meta LuaAPI.xlua_pushasciistring(L, "__index"); LuaAPI.lua_pushvalue(L, cls_getter); LuaAPI.lua_pushvalue(L, cls_field); translator.Push(L, type.BaseType); LuaAPI.xlua_pushasciistring(L, Utils.LuaClassIndexsFieldName); LuaAPI.lua_rawget(L, LuaIndexes.LUA_REGISTRYINDEX); LuaAPI.gen_cls_indexer(L); //store in lua indexs function tables LuaAPI.xlua_pushasciistring(L, Utils.LuaClassIndexsFieldName); LuaAPI.lua_rawget(L, LuaIndexes.LUA_REGISTRYINDEX); translator.Push(L, type); LuaAPI.lua_pushvalue(L, -3); LuaAPI.lua_rawset(L, -3); LuaAPI.lua_pop(L, 1); LuaAPI.lua_rawset(L, cls_meta); // set __index LuaAPI.xlua_pushasciistring(L, "__newindex"); LuaAPI.lua_pushvalue(L, cls_setter); translator.Push(L, type.BaseType); LuaAPI.xlua_pushasciistring(L, Utils.LuaClassNewIndexsFieldName); LuaAPI.lua_rawget(L, LuaIndexes.LUA_REGISTRYINDEX); LuaAPI.gen_cls_newindexer(L); //store in lua newindexs function tables LuaAPI.xlua_pushasciistring(L, Utils.LuaClassNewIndexsFieldName); LuaAPI.lua_rawget(L, LuaIndexes.LUA_REGISTRYINDEX); translator.Push(L, type); LuaAPI.lua_pushvalue(L, -3); LuaAPI.lua_rawset(L, -3); LuaAPI.lua_pop(L, 1); LuaAPI.lua_rawset(L, cls_meta); // set __newindex LuaCSFunction constructor = translator.methodWrapsCache.GetConstructorWrap(type); if (constructor == null) { constructor = (RealStatePtr LL) => { return(LuaAPI.luaL_error(LL, "No constructor for " + type)); }; } LuaAPI.xlua_pushasciistring(L, "__call"); translator.PushFixCSFunction(L, constructor); LuaAPI.lua_rawset(L, cls_meta); LuaAPI.lua_pushvalue(L, cls_meta); LuaAPI.lua_setmetatable(L, cls_field); LuaAPI.lua_pop(L, 8); System.Diagnostics.Debug.Assert(top_enter == LuaAPI.lua_gettop(L)); }
static void makeReflectionWrap(RealStatePtr L, Type type, int cls_field, int cls_getter, int cls_setter, int obj_field, int obj_getter, int obj_setter, int obj_meta, out LuaCSFunction item_getter, out LuaCSFunction item_setter, bool private_access = false) { ObjectTranslator translator = ObjectTranslatorPool.Instance.Find(L); BindingFlags flag = BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Static | (private_access ? BindingFlags.NonPublic : BindingFlags.Public); FieldInfo[] fields = type.GetFields(flag); EventInfo[] all_events = type.GetEvents(flag | BindingFlags.Public | BindingFlags.NonPublic); for (int i = 0; i < fields.Length; ++i) { FieldInfo field = fields[i]; string fieldName = field.Name; if (private_access) { // skip hotfix inject field if (field.IsStatic && (field.Name.StartsWith("__Hitfix") || field.Name.StartsWith("_c__Hitfix")) && typeof(Delegate).IsAssignableFrom(field.FieldType)) { continue; } if (all_events.Any(e => e.Name == fieldName)) { fieldName = "&" + fieldName; } } if (field.IsStatic && (field.IsInitOnly || field.IsLiteral)) { LuaAPI.xlua_pushasciistring(L, fieldName); translator.PushAny(L, field.GetValue(null)); LuaAPI.lua_rawset(L, cls_field); } else { LuaAPI.xlua_pushasciistring(L, fieldName); translator.PushFixCSFunction(L, genFieldGetter(type, field)); LuaAPI.lua_rawset(L, field.IsStatic ? cls_getter : obj_getter); LuaAPI.xlua_pushasciistring(L, fieldName); translator.PushFixCSFunction(L, genFieldSetter(type, field)); LuaAPI.lua_rawset(L, field.IsStatic ? cls_setter : obj_setter); } } EventInfo[] events = type.GetEvents(flag); for (int i = 0; i < events.Length; ++i) { EventInfo eventInfo = events[i]; LuaAPI.xlua_pushasciistring(L, eventInfo.Name); translator.PushFixCSFunction(L, translator.methodWrapsCache.GetEventWrap(type, eventInfo.Name)); bool is_static = (eventInfo.GetAddMethod() != null) ? eventInfo.GetAddMethod().IsStatic : eventInfo.GetRemoveMethod().IsStatic; LuaAPI.lua_rawset(L, is_static ? cls_field : obj_field); } Dictionary <string, PropertyInfo> prop_map = new Dictionary <string, PropertyInfo>(); List <PropertyInfo> items = new List <PropertyInfo>(); PropertyInfo[] props = type.GetProperties(flag); for (int i = 0; i < props.Length; ++i) { PropertyInfo prop = props[i]; if (prop.Name == "Item" && prop.GetIndexParameters().Length > 0) { items.Add(prop); } else { prop_map.Add(prop.Name, prop); } } var item_array = items.ToArray(); item_getter = item_array.Length > 0 ? genItemGetter(type, item_array) : null; item_setter = item_array.Length > 0 ? genItemSetter(type, item_array) : null;; MethodInfo[] methods = type.GetMethods(flag); Dictionary <MethodKey, List <MemberInfo> > pending_methods = new Dictionary <MethodKey, List <MemberInfo> >(); for (int i = 0; i < methods.Length; ++i) { MethodInfo method = methods[i]; string method_name = method.Name; MethodKey method_key = new MethodKey { Name = method_name, IsStatic = method.IsStatic }; List <MemberInfo> overloads; if (pending_methods.TryGetValue(method_key, out overloads)) { overloads.Add(method); continue; } PropertyInfo prop = null; if (method_name.StartsWith("add_") || method_name.StartsWith("remove_") || method_name == "get_Item" || method_name == "set_Item") { continue; } if (method_name.StartsWith("op_")) // 操作符 { if (support_op.ContainsKey(method_name)) { if (overloads == null) { overloads = new List <MemberInfo>(); pending_methods.Add(method_key, overloads); } overloads.Add(method); } continue; } else if (method_name.StartsWith("get_") && prop_map.TryGetValue(method.Name.Substring(4), out prop)) // getter of property { LuaAPI.xlua_pushasciistring(L, prop.Name); translator.PushFixCSFunction(L, genPropGetter(type, prop, method.IsStatic)); LuaAPI.lua_rawset(L, method.IsStatic ? cls_getter : obj_getter); } else if (method_name.StartsWith("set_") && prop_map.TryGetValue(method.Name.Substring(4), out prop)) // setter of property { LuaAPI.xlua_pushasciistring(L, prop.Name); translator.PushFixCSFunction(L, genPropSetter(type, prop, method.IsStatic)); LuaAPI.lua_rawset(L, method.IsStatic ? cls_setter : obj_setter); } else if (method_name == ".ctor" && method.IsConstructor) { continue; } else { if (overloads == null) { overloads = new List <MemberInfo>(); pending_methods.Add(method_key, overloads); } overloads.Add(method); } } foreach (var kv in pending_methods) { if (kv.Key.Name.StartsWith("op_")) // 操作符 { LuaAPI.xlua_pushasciistring(L, support_op[kv.Key.Name]); translator.PushFixCSFunction(L, new LuaCSFunction(translator.methodWrapsCache._GenMethodWrap(type, kv.Key.Name, kv.Value.ToArray()).Call)); LuaAPI.lua_rawset(L, obj_meta); } else { LuaAPI.xlua_pushasciistring(L, kv.Key.Name); translator.PushFixCSFunction(L, new LuaCSFunction(translator.methodWrapsCache._GenMethodWrap(type, kv.Key.Name, kv.Value.ToArray()).Call)); LuaAPI.lua_rawset(L, kv.Key.IsStatic ? cls_field : obj_field); } } IEnumerable <MethodInfo> extend_methods = GetExtensionMethodsOf(type); if (extend_methods != null) { foreach (var kv in (from extend_method in extend_methods select(MemberInfo) extend_method into member group member by member.Name)) { LuaAPI.xlua_pushasciistring(L, kv.Key); translator.PushFixCSFunction(L, new LuaCSFunction(translator.methodWrapsCache._GenMethodWrap(type, kv.Key, kv).Call)); LuaAPI.lua_rawset(L, obj_field); } } }
public LuaCSFunction GetConstructorWrap(Type type) { //UnityEngine.Debug.LogWarning("GetConstructor:" + type); if (!constructorCache.ContainsKey(type)) { var constructors = type.GetConstructors(); if (type.IsAbstract() || constructors == null || constructors.Length == 0) { if (type.IsValueType()) { constructorCache[type] = (L) => { translator.PushAny(L, Activator.CreateInstance(type)); return(1); }; } else { return(null); } } else { LuaCSFunction ctor = _GenMethodWrap(type, ".ctor", constructors).Call; if (type.IsValueType()) { bool hasZeroParamsCtor = false; for (int i = 0; i < constructors.Length; i++) { if (constructors[i].GetParameters().Length == 0) { hasZeroParamsCtor = true; break; } } if (hasZeroParamsCtor) { constructorCache[type] = ctor; } else { constructorCache[type] = (L) => { if (LuaAPI.lua_gettop(L) == 1) { translator.PushAny(L, Activator.CreateInstance(type)); return(1); } else { return(ctor(L)); } }; } } else { constructorCache[type] = ctor; } } } return(constructorCache[type]); }
public int Call(RealStatePtr L) { try { object target = null; MethodBase toInvoke = method; if (luaStackPosStart > 1) { target = translator.FastGetCSObj(L, 1); if (target is Delegate) { Delegate delegateInvoke = (Delegate)target; #if UNITY_WSA && !UNITY_EDITOR toInvoke = delegateInvoke.GetMethodInfo(); #else toInvoke = delegateInvoke.Method; #endif } } int luaTop = LuaAPI.lua_gettop(L); int luaStackPos = luaStackPosStart; for (int i = 0; i < castArray.Length; i++) { //UnityEngine.Debug.Log("inPos:" + inPosArray[i]); if (luaStackPos > luaTop) //after check { if (paramsType != null && i == castArray.Length - 1) { args[inPosArray[i]] = Array.CreateInstance(paramsType, 0); } else { args[inPosArray[i]] = defaultValueArray[i]; } } else { if (paramsType != null && i == castArray.Length - 1) { args[inPosArray[i]] = translator.GetParams(L, luaStackPos, paramsType); } else { args[inPosArray[i]] = castArray[i](L, luaStackPos, null); } luaStackPos++; } //UnityEngine.Debug.Log("value:" + args[inPosArray[i]]); } object ret = null; ret = toInvoke.IsConstructor ? ((ConstructorInfo)method).Invoke(args) : method.Invoke(targetNeeded ? target : null, args); int nRet = 0; if (!isVoid) { //UnityEngine.Debug.Log(toInvoke.ToString() + " ret:" + ret); translator.PushAny(L, ret); nRet++; } for (int i = 0; i < outPosArray.Length; i++) { if (refPos[outPosArray[i]] != -1) { translator.Update(L, luaStackPosStart + refPos[outPosArray[i]], args[outPosArray[i]]); } translator.PushAny(L, args[outPosArray[i]]); nRet++; } return(nRet); } finally { for (int i = 0; i < args.Length; i++) { args[i] = null; } } }
public int Call(RealStatePtr L) { try { #if UNITY_EDITOR && !DISABLE_OBSOLETE_WARNING if (method.IsDefined(typeof(ObsoleteAttribute), true)) { ObsoleteAttribute info = Attribute.GetCustomAttribute(method, typeof(ObsoleteAttribute)) as ObsoleteAttribute; UnityEngine.Debug.LogWarning("Obsolete Method [" + method.DeclaringType.ToString() + "." + method.Name + "]: " + info.Message); } #endif object target = null; MethodBase toInvoke = method; if (luaStackPosStart > 1) { target = translator.FastGetCSObj(L, 1); if (target is Delegate) { Delegate delegateInvoke = (Delegate)target; #if UNITY_WSA && !UNITY_EDITOR toInvoke = delegateInvoke.GetMethodInfo(); #else toInvoke = delegateInvoke.Method; #endif } } int luaTop = LuaAPI.lua_gettop(L); int luaStackPos = luaStackPosStart; for (int i = 0; i < castArray.Length; i++) { //UnityEngine.Debug.Log("inPos:" + inPosArray[i]); if (luaStackPos > luaTop) //after check { if (paramsType != null && i == castArray.Length - 1) { args[inPosArray[i]] = Array.CreateInstance(paramsType, 0); } else { args[inPosArray[i]] = defaultValueArray[i]; } } else { if (paramsType != null && i == castArray.Length - 1) { args[inPosArray[i]] = translator.GetParams(L, luaStackPos, paramsType); } else { args[inPosArray[i]] = castArray[i](L, luaStackPos, null); } luaStackPos++; } //UnityEngine.Debug.Log("value:" + args[inPosArray[i]]); } object ret = null; ret = toInvoke.IsConstructor ? ((ConstructorInfo)method).Invoke(args) : method.Invoke(targetNeeded ? target : null, args); if (targetNeeded && targetType.IsValueType()) { translator.Update(L, 1, target); } int nRet = 0; if (!isVoid) { //UnityEngine.Debug.Log(toInvoke.ToString() + " ret:" + ret); translator.PushAny(L, ret); nRet++; } for (int i = 0; i < outPosArray.Length; i++) { if (refPos[outPosArray[i]] != -1) { translator.Update(L, luaStackPosStart + refPos[outPosArray[i]], args[outPosArray[i]]); } translator.PushAny(L, args[outPosArray[i]]); nRet++; } return(nRet); } finally { for (int i = 0; i < args.Length; i++) { args[i] = null; } } }
public static void ReflectionWrap(RealStatePtr L, Type type) { int top_enter = LuaAPI.lua_gettop(L); ObjectTranslator translator = ObjectTranslatorPool.Instance.Find(L); //create obj meta table LuaAPI.luaL_getmetatable(L, type.FullName); if (LuaAPI.lua_isnil(L, -1)) { LuaAPI.lua_pop(L, 1); LuaAPI.luaL_newmetatable(L, type.FullName); } LuaAPI.lua_pushlightuserdata(L, LuaAPI.xlua_tag()); LuaAPI.lua_pushnumber(L, 1); LuaAPI.lua_rawset(L, -3); int obj_meta = LuaAPI.lua_gettop(L); LuaAPI.lua_newtable(L); int cls_meta = LuaAPI.lua_gettop(L); LuaAPI.lua_newtable(L); int obj_field = LuaAPI.lua_gettop(L); LuaAPI.lua_newtable(L); int obj_getter = LuaAPI.lua_gettop(L); LuaAPI.lua_newtable(L); int obj_setter = LuaAPI.lua_gettop(L); LuaAPI.lua_newtable(L); int cls_field = LuaAPI.lua_gettop(L); LuaAPI.lua_newtable(L); int cls_getter = LuaAPI.lua_gettop(L); LuaAPI.lua_newtable(L); int cls_setter = LuaAPI.lua_gettop(L); BindingFlags flag = BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static; FieldInfo[] fields = type.GetFields(flag); for (int i = 0; i < fields.Length; ++i) { FieldInfo field = fields[i]; if (field.IsStatic && (field.IsInitOnly || field.IsLiteral)) { LuaAPI.xlua_pushasciistring(L, field.Name); translator.PushAny(L, field.GetValue(null)); LuaAPI.lua_rawset(L, cls_field); } else { LuaAPI.xlua_pushasciistring(L, field.Name); translator.PushFixCSFunction(L, genFieldGetter(type, field)); LuaAPI.lua_rawset(L, field.IsStatic ? cls_getter : obj_getter); LuaAPI.xlua_pushasciistring(L, field.Name); translator.PushFixCSFunction(L, genFieldSetter(type, field)); LuaAPI.lua_rawset(L, field.IsStatic ? cls_setter : obj_setter); } } EventInfo[] events = type.GetEvents(flag); for (int i = 0; i < events.Length; ++i) { EventInfo eventInfo = events[i]; LuaAPI.xlua_pushasciistring(L, eventInfo.Name); translator.PushFixCSFunction(L, translator.methodWrapsCache.GetEventWrap(type, eventInfo.Name)); bool is_static = (eventInfo.GetAddMethod() != null) ? eventInfo.GetAddMethod().IsStatic : eventInfo.GetRemoveMethod().IsStatic; LuaAPI.lua_rawset(L, is_static ? cls_field : obj_field); } Dictionary <string, PropertyInfo> prop_map = new Dictionary <string, PropertyInfo>(); List <PropertyInfo> items = new List <PropertyInfo>(); PropertyInfo[] props = type.GetProperties(flag); for (int i = 0; i < props.Length; ++i) { PropertyInfo prop = props[i]; if (prop.Name == "Item") { items.Add(prop); } else { prop_map.Add(prop.Name, prop); } } var item_array = items.ToArray(); LuaCSFunction item_getter = item_array.Length > 0 ? genItemGetter(type, item_array) : null; LuaCSFunction item_setter = item_array.Length > 0 ? genItemSetter(type, item_array) : null;; MethodInfo[] methods = type.GetMethods(flag); Dictionary <MethodKey, List <MemberInfo> > pending_methods = new Dictionary <MethodKey, List <MemberInfo> >(); for (int i = 0; i < methods.Length; ++i) { MethodInfo method = methods[i]; string method_name = method.Name; MethodKey method_key = new MethodKey { Name = method_name, IsStatic = method.IsStatic }; List <MemberInfo> overloads; if (pending_methods.TryGetValue(method_key, out overloads)) { overloads.Add(method); continue; } PropertyInfo prop = null; if (method_name.StartsWith("add_") || method_name.StartsWith("remove_") || method_name == "get_Item" || method_name == "set_Item") { continue; } if (method_name.StartsWith("op_")) // 操作符 { if (support_op.ContainsKey(method_name)) { if (overloads == null) { overloads = new List <MemberInfo>(); pending_methods.Add(method_key, overloads); } overloads.Add(method); } continue; } else if (method_name.StartsWith("get_") && prop_map.TryGetValue(method.Name.Substring(4), out prop)) // getter of property { LuaAPI.xlua_pushasciistring(L, prop.Name); translator.PushFixCSFunction(L, genPropGetter(type, prop, method.IsStatic)); LuaAPI.lua_rawset(L, method.IsStatic ? cls_getter : obj_getter); } else if (method_name.StartsWith("set_") && prop_map.TryGetValue(method.Name.Substring(4), out prop)) // setter of property { LuaAPI.xlua_pushasciistring(L, prop.Name); translator.PushFixCSFunction(L, genPropSetter(type, prop, method.IsStatic)); LuaAPI.lua_rawset(L, method.IsStatic ? cls_setter : obj_setter); } else if (method_name == ".ctor" && method.IsConstructor) { continue; } else { if (overloads == null) { overloads = new List <MemberInfo>(); pending_methods.Add(method_key, overloads); } overloads.Add(method); } } foreach (var kv in pending_methods) { if (kv.Key.Name.StartsWith("op_")) // 操作符 { LuaAPI.xlua_pushasciistring(L, support_op[kv.Key.Name]); translator.PushFixCSFunction(L, new LuaCSFunction(translator.methodWrapsCache._GenMethodWrap(type, kv.Key.Name, kv.Value.ToArray()).Call)); LuaAPI.lua_rawset(L, obj_meta); } else { LuaAPI.xlua_pushasciistring(L, kv.Key.Name); translator.PushFixCSFunction(L, new LuaCSFunction(translator.methodWrapsCache._GenMethodWrap(type, kv.Key.Name, kv.Value.ToArray()).Call)); LuaAPI.lua_rawset(L, kv.Key.IsStatic ? cls_field : obj_field); } } IEnumerable <MethodInfo> extend_methods = GetExtensionMethodsOf(type); if (extend_methods != null) { foreach (var kv in (from extend_method in extend_methods select(MemberInfo) extend_method into member group member by member.Name)) { LuaAPI.xlua_pushasciistring(L, kv.Key); translator.PushFixCSFunction(L, new LuaCSFunction(translator.methodWrapsCache._GenMethodWrap(type, kv.Key, kv).Call)); LuaAPI.lua_rawset(L, obj_field); } } // init obj metatable LuaAPI.xlua_pushasciistring(L, "__gc"); LuaAPI.lua_pushstdcallcfunction(L, translator.metaFunctions.GcMeta); LuaAPI.lua_rawset(L, obj_meta); LuaAPI.xlua_pushasciistring(L, "__tostring"); LuaAPI.lua_pushstdcallcfunction(L, translator.metaFunctions.ToStringMeta); LuaAPI.lua_rawset(L, obj_meta); LuaAPI.xlua_pushasciistring(L, "__index"); LuaAPI.lua_pushvalue(L, obj_field); LuaAPI.lua_pushvalue(L, obj_getter); translator.PushFixCSFunction(L, item_getter); translator.PushAny(L, type.BaseType); LuaAPI.xlua_pushasciistring(L, Utils.LuaIndexsFieldName); LuaAPI.lua_rawget(L, LuaIndexes.LUA_REGISTRYINDEX); LuaAPI.lua_pushnil(L); LuaAPI.gen_obj_indexer(L); //store in lua indexs function tables LuaAPI.xlua_pushasciistring(L, Utils.LuaIndexsFieldName); LuaAPI.lua_rawget(L, LuaIndexes.LUA_REGISTRYINDEX); translator.Push(L, type); LuaAPI.lua_pushvalue(L, -3); LuaAPI.lua_rawset(L, -3); LuaAPI.lua_pop(L, 1); LuaAPI.lua_rawset(L, obj_meta); // set __index LuaAPI.xlua_pushasciistring(L, "__newindex"); LuaAPI.lua_pushvalue(L, obj_setter); translator.PushFixCSFunction(L, item_setter); translator.Push(L, type.BaseType); LuaAPI.xlua_pushasciistring(L, Utils.LuaNewIndexsFieldName); LuaAPI.lua_rawget(L, LuaIndexes.LUA_REGISTRYINDEX); LuaAPI.lua_pushnil(L); LuaAPI.gen_obj_newindexer(L); //store in lua newindexs function tables LuaAPI.xlua_pushasciistring(L, Utils.LuaNewIndexsFieldName); LuaAPI.lua_rawget(L, LuaIndexes.LUA_REGISTRYINDEX); translator.Push(L, type); LuaAPI.lua_pushvalue(L, -3); LuaAPI.lua_rawset(L, -3); LuaAPI.lua_pop(L, 1); LuaAPI.lua_rawset(L, obj_meta); // set __newindex //finish init obj metatable LuaAPI.xlua_pushasciistring(L, "UnderlyingSystemType"); translator.PushAny(L, type); LuaAPI.lua_rawset(L, cls_field); if (type != null && type.IsEnum) { LuaAPI.xlua_pushasciistring(L, "__CastFrom"); translator.PushFixCSFunction(L, genEnumCastFrom(type)); LuaAPI.lua_rawset(L, cls_field); } //set cls_field to namespace SetCSTable(L, type, cls_field); //finish set cls_field to namespace //init class meta LuaAPI.xlua_pushasciistring(L, "__index"); LuaAPI.lua_pushvalue(L, cls_getter); LuaAPI.lua_pushvalue(L, cls_field); translator.Push(L, type.BaseType); LuaAPI.xlua_pushasciistring(L, Utils.LuaClassIndexsFieldName); LuaAPI.lua_rawget(L, LuaIndexes.LUA_REGISTRYINDEX); LuaAPI.gen_cls_indexer(L); //store in lua indexs function tables LuaAPI.xlua_pushasciistring(L, Utils.LuaClassIndexsFieldName); LuaAPI.lua_rawget(L, LuaIndexes.LUA_REGISTRYINDEX); translator.Push(L, type); LuaAPI.lua_pushvalue(L, -3); LuaAPI.lua_rawset(L, -3); LuaAPI.lua_pop(L, 1); LuaAPI.lua_rawset(L, cls_meta); // set __index LuaAPI.xlua_pushasciistring(L, "__newindex"); LuaAPI.lua_pushvalue(L, cls_setter); translator.Push(L, type.BaseType); LuaAPI.xlua_pushasciistring(L, Utils.LuaClassNewIndexsFieldName); LuaAPI.lua_rawget(L, LuaIndexes.LUA_REGISTRYINDEX); LuaAPI.gen_cls_newindexer(L); //store in lua newindexs function tables LuaAPI.xlua_pushasciistring(L, Utils.LuaClassNewIndexsFieldName); LuaAPI.lua_rawget(L, LuaIndexes.LUA_REGISTRYINDEX); translator.Push(L, type); LuaAPI.lua_pushvalue(L, -3); LuaAPI.lua_rawset(L, -3); LuaAPI.lua_pop(L, 1); LuaAPI.lua_rawset(L, cls_meta); // set __newindex LuaCSFunction constructor = translator.methodWrapsCache.GetConstructorWrap(type); if (constructor == null) { constructor = (RealStatePtr LL) => { return(LuaAPI.luaL_error(LL, "No constructor for " + type)); }; } LuaAPI.xlua_pushasciistring(L, "__call"); translator.PushFixCSFunction(L, constructor); LuaAPI.lua_rawset(L, cls_meta); LuaAPI.lua_pushvalue(L, cls_meta); LuaAPI.lua_setmetatable(L, cls_field); LuaAPI.lua_pop(L, 8); System.Diagnostics.Debug.Assert(top_enter == LuaAPI.lua_gettop(L)); }
public static int XLuaAccess(RealStatePtr L) { try { // translator 是 LuaEnv 初始化时生成并放入 Pool 中的 ObjectTranslator translator = ObjectTranslatorPool.Instance.Find(L); // #1 parameter is C# class name Type type = getType(L, translator, 1); object obj = null; if (type == null && LuaAPI.lua_type(L, 1) == LuaTypes.LUA_TUSERDATA) { obj = translator.SafeGetCSObj(L, 1); if (obj == null) { return(LuaAPI.luaL_error(L, "xlua.access, #1 parameter must a type/c# object/string")); } type = obj.GetType(); } if (type == null) { return(LuaAPI.luaL_error(L, "xlua.access, can not find c# type")); } // #2 parameter is C# DelegateBridge name string fieldName = LuaAPI.lua_tostring(L, 2); BindingFlags bindingFlags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static; // #3 parameter is lua hotfix code if (LuaAPI.lua_gettop(L) > 2) // set { // 为 field 或 property (DelegateBridge _Hotfix0_Update;)赋值 var field = type.GetField(fieldName, bindingFlags); if (field != null) { // translator.GetObject(L, 3 --[[ func ]], field.FieldType) 返回一个 DelegateBridge field.SetValue(obj, translator.GetObject(L, 3, field.FieldType)); return(0); } var prop = type.GetProperty(fieldName, bindingFlags); if (prop != null) { prop.SetValue(obj, translator.GetObject(L, 3, prop.PropertyType), null); return(0); } } else { var field = type.GetField(fieldName, bindingFlags); if (field != null) { translator.PushAny(L, field.GetValue(obj)); return(1); } var prop = type.GetProperty(fieldName, bindingFlags); if (prop != null) { translator.PushAny(L, prop.GetValue(obj, null)); return(1); } } return(LuaAPI.luaL_error(L, "xlua.access, no field " + fieldName)); } catch (Exception e) { return(LuaAPI.luaL_error(L, "c# exception in xlua.access: " + e)); } }
public void __Gen_Delegate_Imp0(XLua.LuaFunction p0, object[] p1) { #if THREAD_SAFE || HOTFIX_ENABLE lock (luaEnv.luaEnvLock) { #endif RealStatePtr L = luaEnv.rawL; int errFunc = LuaAPI.pcall_prepare(L, errorFuncRef, luaReference); ObjectTranslator translator = luaEnv.translator; translator.Push(L, p0); if (p1 != null) { for (int __gen_i = 0; __gen_i < p1.Length; ++__gen_i) translator.PushAny(L, p1[__gen_i]); }; PCall(L, 1 + (p1 == null ? 0 : p1.Length), 0, errFunc); LuaAPI.lua_settop(L, errFunc - 1); #if THREAD_SAFE || HOTFIX_ENABLE } #endif }