public static void RegisterObject(RealStatePtr L, ObjectTranslator translator, int idx, string name, object obj) { idx = abs_idx(LuaAPI.lua_gettop(L), idx); LuaAPI.xlua_pushasciistring(L, name); translator.PushAny(L, obj); LuaAPI.lua_rawset(L, idx); }
public void OpenLib(RealStatePtr L) { if (0 != LuaAPI.xlua_getglobal(L, "xlua")) { throw new Exception("call xlua_getglobal fail!" + LuaAPI.lua_tostring(L, -1)); } LuaAPI.xlua_pushasciistring(L, "import_type"); LuaAPI.lua_pushstdcallcfunction(L, importTypeFunction); LuaAPI.lua_rawset(L, -3); LuaAPI.xlua_pushasciistring(L, "cast"); LuaAPI.lua_pushstdcallcfunction(L, castFunction); LuaAPI.lua_rawset(L, -3); LuaAPI.xlua_pushasciistring(L, "load_assembly"); LuaAPI.lua_pushstdcallcfunction(L, loadAssemblyFunction); LuaAPI.lua_rawset(L, -3); LuaAPI.xlua_pushasciistring(L, "access"); LuaAPI.lua_pushstdcallcfunction(L, StaticLuaCallbacks.XLuaAccess); LuaAPI.lua_rawset(L, -3); LuaAPI.xlua_pushasciistring(L, "private_accessible"); LuaAPI.lua_pushstdcallcfunction(L, StaticLuaCallbacks.XLuaPrivateAccessible); LuaAPI.lua_rawset(L, -3); LuaAPI.lua_pop(L, 1); LuaAPI.lua_createtable(L, 1, 4); // 4 for __gc, __tostring, __index, __newindex common_array_meta = LuaAPI.luaL_ref(L, LuaIndexes.LUA_REGISTRYINDEX); LuaAPI.lua_createtable(L, 1, 4); // 4 for __gc, __tostring, __index, __newindex common_delegate_meta = LuaAPI.luaL_ref(L, LuaIndexes.LUA_REGISTRYINDEX); }
public ObjectTranslator(LuaEnv luaenv, RealStatePtr L) { assemblies = new List <Assembly>(); foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies()) { assemblies.Add(assembly); } this.luaEnv = luaenv; objectCasters = new ObjectCasters(this); objectCheckers = new ObjectCheckers(this); methodWrapsCache = new MethodWrapsCache(this, objectCheckers, objectCasters); metaFunctions = new StaticLuaCallbacks(); importTypeFunction = new LuaCSFunction(StaticLuaCallbacks.ImportType); loadAssemblyFunction = new LuaCSFunction(StaticLuaCallbacks.LoadAssembly); castFunction = new LuaCSFunction(StaticLuaCallbacks.Cast); LuaAPI.lua_newtable(L); LuaAPI.lua_newtable(L); LuaAPI.xlua_pushasciistring(L, "__mode"); LuaAPI.xlua_pushasciistring(L, "v"); LuaAPI.lua_rawset(L, -3); LuaAPI.lua_setmetatable(L, -2); cacheRef = LuaAPI.luaL_ref(L, LuaIndexes.LUA_REGISTRYINDEX); initCSharpCallLua(); }
public static void RegisterFunc(RealStatePtr L, int idx, string name, LuaCSFunction func) { idx = abs_idx(LuaAPI.lua_gettop(L), idx); LuaAPI.xlua_pushasciistring(L, name); LuaAPI.lua_pushstdcallcfunction(L, func); LuaAPI.lua_rawset(L, idx); }
public void ReleaseLuaBase(RealStatePtr L, int reference, bool is_delegate) { if (is_delegate) { LuaAPI.xlua_rawgeti(L, LuaIndexes.LUA_REGISTRYINDEX, reference); if (LuaAPI.lua_isnil(L, -1)) { LuaAPI.lua_pop(L, 1); } else { LuaAPI.lua_pushvalue(L, -1); LuaAPI.lua_rawget(L, LuaIndexes.LUA_REGISTRYINDEX); if (LuaAPI.lua_type(L, -1) == LuaTypes.LUA_TNUMBER && LuaAPI.xlua_tointeger(L, -1) == reference) // { //UnityEngine.Debug.LogWarning("release delegate ref = " + luaReference); LuaAPI.lua_pop(L, 1); // pop LUA_REGISTRYINDEX[func] LuaAPI.lua_pushnil(L); LuaAPI.lua_rawset(L, LuaIndexes.LUA_REGISTRYINDEX); // LUA_REGISTRYINDEX[func] = nil } else //another Delegate ref the function before the GC tick { LuaAPI.lua_pop(L, 2); // pop LUA_REGISTRYINDEX[func] & func } } LuaAPI.lua_unref(L, reference); delegate_bridges.Remove(reference); } else { LuaAPI.lua_unref(L, reference); } }
public static void OpenLib(RealStatePtr L) { LuaAPI.lua_newtable(L); LuaAPI.xlua_pushasciistring(L, "compile"); LuaAPI.lua_pushstdcallcfunction(L, templateCompileFunction); LuaAPI.lua_rawset(L, -3); LuaAPI.xlua_pushasciistring(L, "execute"); LuaAPI.lua_pushstdcallcfunction(L, templateExecuteFunction); LuaAPI.lua_rawset(L, -3); LuaAPI.lua_setglobal(L, "template"); }
static void PackRow(RealStatePtr L, SqliteDataReader data_reader, string table_name, bool has_column_info, List <xc.DBManager.ColumnInfo> column_info, int field_count) { for (int i = 0; i < field_count; ++i) { string field_name = ""; Type field_type = null; if (has_column_info) { field_name = column_info[i].name; field_type = column_info[i].type; } else { field_name = data_reader.GetName(i); field_type = data_reader.GetFieldType(i); if (column_info != null) { var info = new xc.DBManager.ColumnInfo(); info.name = field_name; info.type = field_type; column_info.Add(info); } } LuaAPI.lua_pushstring(L, field_name); if (field_type.Equals(typeof(string))) { var str = data_reader.GetString(i); // 如果指定列有中文,则通过翻译表的文本进行替换 var hasChineseChars = xc.DBCharIndex.Instance.HasChineseChars(table_name, field_name); if (hasChineseChars) { str = xc.DBTranslate.Instance.GetTranslateText(table_name, str); } LuaAPI.lua_pushstring(L, str); } else if (field_type.IsValueType) { LuaAPI.lua_pushnumber(L, Convert.ToDouble(data_reader.GetValue(i))); } else { LuaAPI.lua_pushnil(L); } LuaAPI.lua_rawset(L, -3); } }
public static void EndClassRegister(Type type, RealStatePtr L, ObjectTranslator translator) { int top = LuaAPI.lua_gettop(L); int cls_idx = abs_idx(top, CLS_IDX); int cls_getter_idx = abs_idx(top, CLS_GETTER_IDX); int cls_setter_idx = abs_idx(top, CLS_SETTER_IDX); int cls_meta_idx = abs_idx(top, CLS_META_IDX); //begin cls index LuaAPI.xlua_pushasciistring(L, "__index"); LuaAPI.lua_pushvalue(L, cls_getter_idx); LuaAPI.lua_pushvalue(L, cls_idx); translator.Push(L, type.BaseType); LuaAPI.xlua_pushasciistring(L, Utils.LuaClassIndexsFieldName); LuaAPI.lua_rawget(L, LuaIndexes.LUA_REGISTRYINDEX); LuaAPI.gen_cls_indexer(L); LuaAPI.xlua_pushasciistring(L, Utils.LuaClassIndexsFieldName); LuaAPI.lua_rawget(L, LuaIndexes.LUA_REGISTRYINDEX);//store in lua indexs function tables 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_idx); //end cls index //begin cls newindex LuaAPI.xlua_pushasciistring(L, "__newindex"); LuaAPI.lua_pushvalue(L, cls_setter_idx); translator.Push(L, type.BaseType); LuaAPI.xlua_pushasciistring(L, Utils.LuaClassNewIndexsFieldName); LuaAPI.lua_rawget(L, LuaIndexes.LUA_REGISTRYINDEX); LuaAPI.gen_cls_newindexer(L); LuaAPI.xlua_pushasciistring(L, Utils.LuaClassNewIndexsFieldName); LuaAPI.lua_rawget(L, LuaIndexes.LUA_REGISTRYINDEX);//store in lua newindexs function tables 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_idx); //end cls newindex LuaAPI.lua_pop(L, 4); }
internal void createFunctionMetatable(RealStatePtr L) { LuaAPI.lua_newtable(L); LuaAPI.xlua_pushasciistring(L,"__gc"); LuaAPI.lua_pushstdcallcfunction(L,metaFunctions.GcMeta); LuaAPI.lua_rawset(L,-3); LuaAPI.lua_pushlightuserdata(L, LuaAPI.xlua_tag()); LuaAPI.lua_pushnumber(L, 1); LuaAPI.lua_rawset(L, -3); LuaAPI.lua_pushvalue(L, -1); int type_id = LuaAPI.luaL_ref(L, LuaIndexes.LUA_REGISTRYINDEX); LuaAPI.lua_pushnumber(L, type_id); LuaAPI.xlua_rawseti(L, -2, 1); LuaAPI.lua_pop(L, 1); typeIdMap.Add(typeof(LuaCSFunction), type_id); }
public void PushPushAsTableStruct(RealStatePtr L, PushAsTableStruct val) { if (PushAsTableStruct_TypeID == -1) { bool is_first; PushAsTableStruct_TypeID = getTypeId(L, typeof(PushAsTableStruct), out is_first); } LuaAPI.xlua_pushcstable(L, 2, PushAsTableStruct_TypeID); LuaAPI.xlua_pushasciistring(L, "x"); LuaAPI.xlua_pushinteger(L, val.x); LuaAPI.lua_rawset(L, -3); LuaAPI.xlua_pushasciistring(L, "y"); LuaAPI.xlua_pushinteger(L, val.y); LuaAPI.lua_rawset(L, -3); }
public static void SetCSTable(RealStatePtr L, Type type, int cls_table) { int oldTop = LuaAPI.lua_gettop(L); cls_table = abs_idx(oldTop, cls_table); if (0 != LuaAPI.xlua_getglobal(L, "CS")) { throw new Exception("call xlua_getglobal fail!"); } List <string> path = getPathOfType(type); for (int i = 0; i < path.Count - 1; ++i) { LuaAPI.xlua_pushasciistring(L, path[i]); if (0 != LuaAPI.xlua_pgettable(L, -2)) { LuaAPI.lua_settop(L, oldTop); throw new Exception("SetCSTable for [" + type + "] error: " + LuaAPI.lua_tostring(L, -1)); } if (LuaAPI.lua_isnil(L, -1)) { LuaAPI.lua_pop(L, 1); LuaAPI.lua_createtable(L, 0, 0); LuaAPI.xlua_pushasciistring(L, path[i]); LuaAPI.lua_pushvalue(L, -2); LuaAPI.lua_rawset(L, -4); } else if (!LuaAPI.lua_istable(L, -1)) { LuaAPI.lua_settop(L, oldTop); throw new Exception("SetCSTable for [" + type + "] error: ancestors is not a table!"); } LuaAPI.lua_remove(L, -2); } LuaAPI.xlua_pushasciistring(L, path[path.Count - 1]); LuaAPI.lua_pushvalue(L, cls_table); LuaAPI.lua_rawset(L, -3); LuaAPI.lua_pop(L, 1); }
public static void BeginClassRegister(Type type, RealStatePtr L, LuaCSFunction creator, int class_field_count, int static_getter_count, int static_setter_count) { LuaAPI.lua_createtable(L, 0, class_field_count); int cls_table = LuaAPI.lua_gettop(L); SetCSTable(L, type, cls_table); LuaAPI.lua_createtable(L, 0, 3); int meta_table = LuaAPI.lua_gettop(L); if (creator != null) { LuaAPI.xlua_pushasciistring(L, "__call"); LuaAPI.lua_pushstdcallcfunction(L, creator); LuaAPI.lua_rawset(L, -3); } if (static_getter_count == 0) { LuaAPI.lua_pushnil(L); } else { LuaAPI.lua_createtable(L, 0, static_getter_count); } if (static_setter_count == 0) { LuaAPI.lua_pushnil(L); } else { LuaAPI.lua_createtable(L, 0, static_setter_count); } LuaAPI.lua_pushvalue(L, meta_table); LuaAPI.lua_setmetatable(L, cls_table); }
internal static int CheckNewType(IntPtr L) { if (!LuaAPI.lua_istable(L, 1)) { Debug.Log("Need Table Here!"); return(0); } // key值只能是数字或者字符串 if (LuaAPI.lua_isnumber(L, 2) && LuaAPI.lua_isstring(L, 2)) { Debug.Log("Need Number or String Here!"); return(0); } // value值只能是数字、字符串、非循环table if (LuaAPI.lua_isnumber(L, 3) && LuaAPI.lua_isstring(L, 3) && !LuaAPI.lua_istable(L, 3) && !LuaAPI.lua_isboolean(L, 3)) { Debug.Log("This Type Cannot Add to Cookies!Need[Table, Number, String]!"); return(0); } // 如果是table,检查是否有循环结构或者是其他类型 if (LuaAPI.lua_istable(L, 3)) { int cycle_time = 0; if (!CheckCircleAndSetMeta(L, ref cycle_time) || !SetMetaTable(L, 3)) { Debug.Log("This Type Cannot Add to Cookies!Need[Table, Number, String]!"); LuaAPI.lua_pop(L, 1); return(0); } } LuaAPI.lua_rawset(L, 1); return(0); }
public ObjectTranslator(LuaEnv luaenv, RealStatePtr L) { #if XLUA_GENERAL var dumb_field = typeof(ObjectTranslator).GetField("s_gen_reg_dumb_obj", BindingFlags.Static | BindingFlags.DeclaredOnly | BindingFlags.NonPublic); if (dumb_field != null) { dumb_field.GetValue(null); } #endif assemblies = new List <Assembly>(); foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies()) { assemblies.Add(assembly); } this.luaEnv = luaenv; objectCasters = new ObjectCasters(this); objectCheckers = new ObjectCheckers(this); methodWrapsCache = new MethodWrapsCache(this, objectCheckers, objectCasters); metaFunctions = new StaticLuaCallbacks(); importTypeFunction = new LuaCSFunction(StaticLuaCallbacks.ImportType); loadAssemblyFunction = new LuaCSFunction(StaticLuaCallbacks.LoadAssembly); castFunction = new LuaCSFunction(StaticLuaCallbacks.Cast); cTypeFunction = new LuaCSFunction(StaticLuaCallbacks.Ctype); LuaAPI.lua_newtable(L); LuaAPI.lua_newtable(L); LuaAPI.xlua_pushasciistring(L, "__mode"); LuaAPI.xlua_pushasciistring(L, "v"); LuaAPI.lua_rawset(L, -3); LuaAPI.lua_setmetatable(L, -2); cacheRef = LuaAPI.luaL_ref(L, LuaIndexes.LUA_REGISTRYINDEX); initCSharpCallLua(); }
public Delegate CreateDelegateBridge(RealStatePtr L, Type delegateType, int idx) { LuaAPI.lua_pushvalue(L, idx); LuaAPI.lua_rawget(L, LuaIndexes.LUA_REGISTRYINDEX); if (!LuaAPI.lua_isnil(L, -1)) { int referenced = LuaAPI.xlua_tointeger(L, -1); LuaAPI.lua_pop(L, 1); if (delegate_bridges[referenced].IsAlive) { DelegateBridgeBase exist_bridge = delegate_bridges[referenced].Target as DelegateBridgeBase; Delegate exist_delegate; if (exist_bridge.TryGetDelegate(delegateType, out exist_delegate)) { return(exist_delegate); } else { exist_delegate = exist_bridge.GetDelegateByType(delegateType); exist_bridge.AddDelegate(delegateType, exist_delegate); return(exist_delegate); } } } else { LuaAPI.lua_pop(L, 1); } LuaAPI.lua_pushvalue(L, idx); int reference = LuaAPI.luaL_ref(L); LuaAPI.lua_pushvalue(L, idx); LuaAPI.lua_pushnumber(L, reference); LuaAPI.lua_rawset(L, LuaIndexes.LUA_REGISTRYINDEX); DelegateBridgeBase bridge; try { #if UNITY_EDITOR if (!DelegateBridge.Gen_Flag) { bridge = Activator.CreateInstance(delegate_birdge_type, new object[] { reference, luaEnv }) as DelegateBridgeBase; } else #endif { bridge = new DelegateBridge(reference, luaEnv); } } catch (Exception e) { LuaAPI.lua_pushvalue(L, idx); LuaAPI.lua_pushnil(L); LuaAPI.lua_rawset(L, LuaIndexes.LUA_REGISTRYINDEX); LuaAPI.lua_pushnil(L); LuaAPI.xlua_rawseti(L, LuaIndexes.LUA_REGISTRYINDEX, reference); throw e; } try { var ret = bridge.GetDelegateByType(delegateType); bridge.AddDelegate(delegateType, ret); delegate_bridges[reference] = new WeakReference(bridge); return(ret); } catch (Exception e) { bridge.Dispose(); throw e; } }
public LuaEnv() { #if THREAD_SAFT || HOTFIX_ENABLE lock (luaEnvLock) { #endif LuaIndexes.LUA_REGISTRYINDEX = LuaAPI.xlua_get_registry_index();; // Create State L = LuaAPI.luaL_newstate(); //Init Base Libs LuaAPI.luaopen_xlua(L); LuaAPI.luaopen_i64lib(L); LuaAPI.luaopen_perflib(L); translator = new ObjectTranslator(this, L); translator.createFunctionMetatable(L); translator.OpenLib(L); ObjectTranslatorPool.Instance.Add(L, translator); LuaAPI.lua_atpanic(L, StaticLuaCallbacks.Panic); LuaAPI.lua_pushstdcallcfunction(L, StaticLuaCallbacks.Print); if (0 != LuaAPI.xlua_setglobal(L, "print")) { throw new Exception("call xlua_setglobal fail!"); } //template engine lib register TemplateEngine.LuaTemplate.OpenLib(L); AddSearcher(StaticLuaCallbacks.LoadBuiltinLib, 2); // just after the preload searcher AddSearcher(StaticLuaCallbacks.LoadFromCustomLoaders, 3); AddSearcher(StaticLuaCallbacks.LoadFromResource, 4); AddSearcher(StaticLuaCallbacks.LoadFromStreamingAssetsPath, -1); DoString(init_xlua, "Init"); init_xlua = null; AddBuildin("socket.core", StaticLuaCallbacks.LoadSocketCore); AddBuildin("socket", StaticLuaCallbacks.LoadSocketCore); LuaAPI.lua_newtable(L); //metatable of indexs and newindexs functions LuaAPI.xlua_pushasciistring(L, "__index"); LuaAPI.lua_pushstdcallcfunction(L, StaticLuaCallbacks.MetaFuncIndex); LuaAPI.lua_rawset(L, -3); LuaAPI.xlua_pushasciistring(L, Utils.LuaIndexsFieldName); LuaAPI.lua_newtable(L); LuaAPI.lua_pushvalue(L, -3); LuaAPI.lua_setmetatable(L, -2); LuaAPI.lua_rawset(L, LuaIndexes.LUA_REGISTRYINDEX); LuaAPI.xlua_pushasciistring(L, Utils.LuaNewIndexsFieldName); LuaAPI.lua_newtable(L); LuaAPI.lua_pushvalue(L, -3); LuaAPI.lua_setmetatable(L, -2); LuaAPI.lua_rawset(L, LuaIndexes.LUA_REGISTRYINDEX); LuaAPI.xlua_pushasciistring(L, Utils.LuaClassIndexsFieldName); LuaAPI.lua_newtable(L); LuaAPI.lua_pushvalue(L, -3); LuaAPI.lua_setmetatable(L, -2); LuaAPI.lua_rawset(L, LuaIndexes.LUA_REGISTRYINDEX); LuaAPI.xlua_pushasciistring(L, Utils.LuaClassNewIndexsFieldName); LuaAPI.lua_newtable(L); LuaAPI.lua_pushvalue(L, -3); LuaAPI.lua_setmetatable(L, -2); LuaAPI.lua_rawset(L, LuaIndexes.LUA_REGISTRYINDEX); LuaAPI.lua_pop(L, 1); // pop metatable of indexs and newindexs functions LuaAPI.xlua_pushasciistring(L, "xlua_main_thread"); LuaAPI.lua_pushthread(L); LuaAPI.lua_rawset(L, LuaIndexes.LUA_REGISTRYINDEX); translator.Alias(typeof(Type), "System.MonoType"); if (0 != LuaAPI.xlua_getglobal(L, "_G")) { throw new Exception("call xlua_getglobal fail!"); } translator.Get(L, -1, out _G); LuaAPI.lua_pop(L, 1); errorFuncRef = LuaAPI.get_error_func_ref(L); if (initers != null) { for (int i = 0; i < initers.Count; i++) { initers[i](this, translator); } } translator.CreateArrayMetatable(L); translator.CreateDelegateMetatable(L); #if THREAD_SAFT || HOTFIX_ENABLE } #endif }
public static void EndObjectRegister(Type type, RealStatePtr L, ObjectTranslator translator, LuaCSFunction csIndexer, LuaCSFunction csNewIndexer, Type base_type, LuaCSFunction arrayIndexer, LuaCSFunction arrayNewIndexer) { int top = LuaAPI.lua_gettop(L); int meta_idx = abs_idx(top, OBJ_META_IDX); int method_idx = abs_idx(top, METHOD_IDX); int getter_idx = abs_idx(top, GETTER_IDX); int setter_idx = abs_idx(top, SETTER_IDX); //begin index gen LuaAPI.xlua_pushasciistring(L, "__index"); LuaAPI.lua_pushvalue(L, method_idx); LuaAPI.lua_pushvalue(L, getter_idx); if (csIndexer == null) { LuaAPI.lua_pushnil(L); } else { LuaAPI.lua_pushstdcallcfunction(L, csIndexer); } translator.Push(L, type == null ? base_type : type.BaseType); LuaAPI.xlua_pushasciistring(L, Utils.LuaIndexsFieldName); LuaAPI.lua_rawget(L, LuaIndexes.LUA_REGISTRYINDEX); if (arrayIndexer == null) { LuaAPI.lua_pushnil(L); } else { LuaAPI.lua_pushstdcallcfunction(L, arrayIndexer); } LuaAPI.gen_obj_indexer(L); if (type != null) { LuaAPI.xlua_pushasciistring(L, Utils.LuaIndexsFieldName); LuaAPI.lua_rawget(L, LuaIndexes.LUA_REGISTRYINDEX);//store in lua indexs function tables translator.Push(L, type); LuaAPI.lua_pushvalue(L, -3); LuaAPI.lua_rawset(L, -3); LuaAPI.lua_pop(L, 1); } LuaAPI.lua_rawset(L, meta_idx); //end index gen //begin newindex gen LuaAPI.xlua_pushasciistring(L, "__newindex"); LuaAPI.lua_pushvalue(L, setter_idx); if (csNewIndexer == null) { LuaAPI.lua_pushnil(L); } else { LuaAPI.lua_pushstdcallcfunction(L, csNewIndexer); } translator.Push(L, type == null ? base_type : type.BaseType); LuaAPI.xlua_pushasciistring(L, Utils.LuaNewIndexsFieldName); LuaAPI.lua_rawget(L, LuaIndexes.LUA_REGISTRYINDEX); if (arrayNewIndexer == null) { LuaAPI.lua_pushnil(L); } else { LuaAPI.lua_pushstdcallcfunction(L, arrayNewIndexer); } LuaAPI.gen_obj_newindexer(L); if (type != null) { LuaAPI.xlua_pushasciistring(L, Utils.LuaNewIndexsFieldName); LuaAPI.lua_rawget(L, LuaIndexes.LUA_REGISTRYINDEX);//store in lua newindexs function tables translator.Push(L, type); LuaAPI.lua_pushvalue(L, -3); LuaAPI.lua_rawset(L, -3); LuaAPI.lua_pop(L, 1); } LuaAPI.lua_rawset(L, meta_idx); //end new index gen LuaAPI.lua_pop(L, 4); }
//meta: -4, method:-3, getter: -2, setter: -1 public static void BeginObjectRegister(Type type, RealStatePtr L, ObjectTranslator translator, int meta_count, int method_count, int getter_count, int setter_count, int type_id = -1) { if (type == null) { if (type_id == -1) { throw new Exception("Fatal: must provide a type of type_id"); } LuaAPI.xlua_rawgeti(L, LuaIndexes.LUA_REGISTRYINDEX, type_id); } else { 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); if ((type == null || !translator.HasCustomOp(type)) && type != typeof(decimal)) { LuaAPI.xlua_pushasciistring(L, "__gc"); LuaAPI.lua_pushstdcallcfunction(L, translator.metaFunctions.GcMeta); LuaAPI.lua_rawset(L, -3); } LuaAPI.xlua_pushasciistring(L, "__tostring"); LuaAPI.lua_pushstdcallcfunction(L, translator.metaFunctions.ToStringMeta); LuaAPI.lua_rawset(L, -3); if (method_count == 0) { LuaAPI.lua_pushnil(L); } else { LuaAPI.lua_createtable(L, 0, method_count); } if (getter_count == 0) { LuaAPI.lua_pushnil(L); } else { LuaAPI.lua_createtable(L, 0, getter_count); } if (setter_count == 0) { LuaAPI.lua_pushnil(L); } else { LuaAPI.lua_createtable(L, 0, setter_count); } }
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)); }
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 LuaEnv() { if (LuaAPI.xlua_get_lib_version() != LIB_VERSION_EXPECT) { throw new InvalidProgramException("wrong lib version expect:" + LIB_VERSION_EXPECT + " but got:" + LuaAPI.xlua_get_lib_version()); } #if THREAD_SAFE || HOTFIX_ENABLE lock (luaEnvLock) { #endif LuaIndexes.LUA_REGISTRYINDEX = LuaAPI.xlua_get_registry_index(); #if GEN_CODE_MINIMIZE LuaAPI.xlua_set_csharp_wrapper_caller(InternalGlobals.CSharpWrapperCallerPtr); #endif // Create State rawL = LuaAPI.luaL_newstate(); //Init Base Libs LuaAPI.luaopen_xlua(rawL); LuaAPI.luaopen_i64lib(rawL); translator = new ObjectTranslator(this, rawL); translator.createFunctionMetatable(rawL); translator.OpenLib(rawL); ObjectTranslatorPool.Instance.Add(rawL, translator); LuaAPI.lua_atpanic(rawL, StaticLuaCallbacks.Panic); #if !XLUA_GENERAL LuaAPI.lua_pushstdcallcfunction(rawL, StaticLuaCallbacks.Print); if (0 != LuaAPI.xlua_setglobal(rawL, "print")) { throw new Exception("call xlua_setglobal fail!"); } #endif //template engine lib register TemplateEngine.LuaTemplate.OpenLib(rawL); AddSearcher(StaticLuaCallbacks.LoadBuiltinLib, 2); // just after the preload searcher AddSearcher(StaticLuaCallbacks.LoadFromCustomLoaders, 3); #if !XLUA_GENERAL AddSearcher(StaticLuaCallbacks.LoadFromResource, 4); AddSearcher(StaticLuaCallbacks.LoadFromStreamingAssetsPath, -1); #endif DoString(init_xlua, "Init"); init_xlua = null; #if !UNITY_SWITCH || UNITY_EDITOR AddBuildin("socket.core", StaticLuaCallbacks.LoadSocketCore); AddBuildin("socket", StaticLuaCallbacks.LoadSocketCore); #endif AddBuildin("CS", StaticLuaCallbacks.LoadCS); AddBuildin("pb", XLua.LuaDLL.Lua.LoadPB); LuaAPI.lua_newtable(rawL); //metatable of indexs and newindexs functions LuaAPI.xlua_pushasciistring(rawL, "__index"); LuaAPI.lua_pushstdcallcfunction(rawL, StaticLuaCallbacks.MetaFuncIndex); LuaAPI.lua_rawset(rawL, -3); LuaAPI.xlua_pushasciistring(rawL, Utils.LuaIndexsFieldName); LuaAPI.lua_newtable(rawL); LuaAPI.lua_pushvalue(rawL, -3); LuaAPI.lua_setmetatable(rawL, -2); LuaAPI.lua_rawset(rawL, LuaIndexes.LUA_REGISTRYINDEX); LuaAPI.xlua_pushasciistring(rawL, Utils.LuaNewIndexsFieldName); LuaAPI.lua_newtable(rawL); LuaAPI.lua_pushvalue(rawL, -3); LuaAPI.lua_setmetatable(rawL, -2); LuaAPI.lua_rawset(rawL, LuaIndexes.LUA_REGISTRYINDEX); LuaAPI.xlua_pushasciistring(rawL, Utils.LuaClassIndexsFieldName); LuaAPI.lua_newtable(rawL); LuaAPI.lua_pushvalue(rawL, -3); LuaAPI.lua_setmetatable(rawL, -2); LuaAPI.lua_rawset(rawL, LuaIndexes.LUA_REGISTRYINDEX); LuaAPI.xlua_pushasciistring(rawL, Utils.LuaClassNewIndexsFieldName); LuaAPI.lua_newtable(rawL); LuaAPI.lua_pushvalue(rawL, -3); LuaAPI.lua_setmetatable(rawL, -2); LuaAPI.lua_rawset(rawL, LuaIndexes.LUA_REGISTRYINDEX); LuaAPI.lua_pop(rawL, 1); // pop metatable of indexs and newindexs functions LuaAPI.xlua_pushasciistring(rawL, MAIN_SHREAD); LuaAPI.lua_pushthread(rawL); LuaAPI.lua_rawset(rawL, LuaIndexes.LUA_REGISTRYINDEX); LuaAPI.xlua_pushasciistring(rawL, CSHARP_NAMESPACE); if (0 != LuaAPI.xlua_getglobal(rawL, "CS")) { throw new Exception("get CS fail!"); } LuaAPI.lua_rawset(rawL, LuaIndexes.LUA_REGISTRYINDEX); #if !XLUA_GENERAL && (!UNITY_WSA || UNITY_EDITOR) translator.Alias(typeof(Type), "System.MonoType"); #endif if (0 != LuaAPI.xlua_getglobal(rawL, "_G")) { throw new Exception("get _G fail!"); } translator.Get(rawL, -1, out _G); LuaAPI.lua_pop(rawL, 1); errorFuncRef = LuaAPI.get_error_func_ref(rawL); if (initers != null) { for (int i = 0; i < initers.Count; i++) { initers[i](this, translator); } } translator.CreateArrayMetatable(rawL); translator.CreateDelegateMetatable(rawL); translator.CreateEnumerablePairs(rawL); #if THREAD_SAFE || HOTFIX_ENABLE } #endif }
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); } } }