protected static void AddMember(IntPtr ptr, string name, LuaCSFunction get, LuaCSFunction set, bool instance) { CheckMethodValid(get); CheckMethodValid(set); int t = instance ? -2 : -3; LuaNativeMethods.lua_createtable(ptr, 2, 0); if (get == null) { LuaNativeMethods.lua_pushnil(ptr); } else { PushValue(ptr, get); } LuaNativeMethods.lua_rawseti(ptr, -2, 1); if (set == null) { LuaNativeMethods.lua_pushnil(ptr); } else { PushValue(ptr, set); } LuaNativeMethods.lua_rawseti(ptr, -2, 2); LuaNativeMethods.lua_setfield(ptr, t, name); }
public static void CompleteTypeMeta(IntPtr ptr, LuaCSFunction con, Type self) { LuaNativeMethods.lua_pushstring(ptr, ObjectCache.GetAQName(self)); LuaNativeMethods.lua_setfield(ptr, -3, "__fullname"); indexFunction.Push(ptr); LuaNativeMethods.lua_setfield(ptr, -2, "__index"); newIndexFunction.Push(ptr); LuaNativeMethods.lua_setfield(ptr, -2, "__newindex"); if (con == null) { con = NoConstructor; } PushValue(ptr, con); LuaNativeMethods.lua_setfield(ptr, -2, "__call"); LuaNativeMethods.lua_pushcfunction(ptr, TypeToString); LuaNativeMethods.lua_setfield(ptr, -2, "__tostring"); LuaNativeMethods.lua_pushvalue(ptr, -1); LuaNativeMethods.lua_setmetatable(ptr, -3); LuaNativeMethods.lua_setfield(ptr, LuaIndexes.LUARegistryIndex, self.FullName); }
public ObjectCache(IntPtr ptr) { LuaNativeMethods.lua_newtable(ptr); LuaNativeMethods.lua_newtable(ptr); LuaNativeMethods.lua_pushstring(ptr, "v"); LuaNativeMethods.lua_setfield(ptr, -2, "__mode"); LuaNativeMethods.lua_setmetatable(ptr, -2); cacheRef = LuaNativeMethods.luaL_ref(ptr, LuaIndexes.LUARegistryIndex); }
public static void Register(IntPtr ptr, LuaCSFunction func, string ns) { CheckMethodValid(func); NewTypeTable(ptr, ns); PushValue(ptr, func); LuaNativeMethods.lua_setfield(ptr, -2, func.Method.Name); LuaNativeMethods.lua_pop(ptr, 1); }
protected static void AddMember(IntPtr ptr, LuaCSFunction func, bool instance) { CheckMethodValid(func); PushValue(ptr, func); string name = func.Method.Name; LuaNativeMethods.lua_setfield(ptr, instance ? -2 : -3, name); }
public static void Open(IntPtr ptr) { List <string> typenames = Lua3rdMeta.Instance.TypesWithAttributes; Assembly[] assemblys = AppDomain.CurrentDomain.GetAssemblies(); Assembly assembly = null; foreach (Assembly ass in assemblys) { if (ass.GetName().Name == "Assembly-CSharp") { assembly = ass; break; } } if (assembly != null) { foreach (string typename in typenames) { Type type = assembly.GetType(typename); MethodInfo[] methods = type.GetMethods(BindingFlags.Static | BindingFlags.Public); foreach (MethodInfo method in methods) { LualibRegAttribute attr = System.Attribute.GetCustomAttribute(method, typeof(LualibRegAttribute)) as LualibRegAttribute; if (attr != null) { LuaCSFunction csfunc = Delegate.CreateDelegate(typeof(LuaCSFunction), method) as LuaCSFunction; DLLRegFuncs.Add(attr.LuaName, csfunc); } } } } if (DLLRegFuncs.Count == 0) { return; } LuaNativeMethods.lua_getglobal(ptr, "package"); LuaNativeMethods.lua_getfield(ptr, -1, "preload"); foreach (KeyValuePair <string, LuaCSFunction> pair in DLLRegFuncs) { LuaNativeMethods.lua_pushcfunction(ptr, pair.Value); LuaNativeMethods.lua_setfield(ptr, -2, pair.Key); } LuaNativeMethods.lua_settop(ptr, 0); }
public static new void Init(IntPtr ptr) { propertyMethods["Table"] = ToTable; propertyMethods["Length"] = Length; LuaNativeMethods.lua_createtable(ptr, 0, 5); LuaObject.PushValue(ptr, LuaIndex); LuaNativeMethods.lua_setfield(ptr, -2, "__index"); LuaObject.PushValue(ptr, LuaNewIndex); LuaNativeMethods.lua_setfield(ptr, -2, "__newindex"); LuaNativeMethods.lua_pushcfunction(ptr, LuaObject.LuaGC); LuaNativeMethods.lua_setfield(ptr, -2, "__gc"); LuaNativeMethods.lua_pushcfunction(ptr, ToString); LuaNativeMethods.lua_setfield(ptr, -2, "__tostring"); LuaNativeMethods.lua_pushcfunction(ptr, Len); LuaNativeMethods.lua_setfield(ptr, -2, "__len"); LuaNativeMethods.lua_setfield(ptr, LuaIndexes.LUARegistryIndex, "LuaArray"); }
protected static void AddMember(IntPtr ptr, LuaCSFunction func) { CheckMethodValid(func); PushValue(ptr, func); string name = func.Method.Name; if (name.EndsWith("_s")) { name = name.Substring(0, name.Length - 2); LuaNativeMethods.lua_setfield(ptr, -3, name); } else { LuaNativeMethods.lua_setfield(ptr, -2, name); } }
private static void CompleteInstanceMeta(IntPtr ptr, Type self) { LuaNativeMethods.lua_pushstring(ptr, "__typename"); LuaNativeMethods.lua_pushstring(ptr, self.Name); LuaNativeMethods.lua_rawset(ptr, -3); // for instance indexFunction.Push(ptr); LuaNativeMethods.lua_setfield(ptr, -2, "__index"); newIndexFunction.Push(ptr); LuaNativeMethods.lua_setfield(ptr, -2, "__newindex"); PushValue(ptr, luaAdd); LuaNativeMethods.lua_setfield(ptr, -2, "__add"); PushValue(ptr, luaSub); LuaNativeMethods.lua_setfield(ptr, -2, "__sub"); PushValue(ptr, luaMul); LuaNativeMethods.lua_setfield(ptr, -2, "__mul"); PushValue(ptr, luaDiv); LuaNativeMethods.lua_setfield(ptr, -2, "__div"); PushValue(ptr, luaUnm); LuaNativeMethods.lua_setfield(ptr, -2, "__unm"); PushValue(ptr, luaEq); LuaNativeMethods.lua_setfield(ptr, -2, "__eq"); PushValue(ptr, luaLe); LuaNativeMethods.lua_setfield(ptr, -2, "__le"); PushValue(ptr, luaLt); LuaNativeMethods.lua_setfield(ptr, -2, "__lt"); PushValue(ptr, luaToString); LuaNativeMethods.lua_setfield(ptr, -2, "__tostring"); LuaNativeMethods.lua_pushcfunction(ptr, LuaGC); LuaNativeMethods.lua_setfield(ptr, -2, "__gc"); if (self.IsValueType && IsImplByLua(self)) { LuaNativeMethods.lua_pushvalue(ptr, -1); LuaNativeMethods.lua_setglobal(ptr, self.FullName + ".Instance"); } LuaNativeMethods.lua_setfield(ptr, LuaIndexes.LUARegistryIndex, ObjectCache.GetAQName(self)); }
public static void Register(IntPtr ptr) { LuaObject.GetTypeTable(ptr, "Slua"); LuaObject.AddMember(ptr, CreateAction, false); LuaObject.AddMember(ptr, CreateClass, false); LuaObject.AddMember(ptr, GetClass, false); LuaObject.AddMember(ptr, Iterator, false); LuaObject.AddMember(ptr, ToString, false); LuaObject.AddMember(ptr, As, false); LuaObject.AddMember(ptr, IsNull, false); LuaObject.AddMember(ptr, MakeArray, false); LuaObject.AddMember(ptr, ToBytes, false); LuaObject.AddMember(ptr, "out", GetOut, null, false); LuaObject.AddMember(ptr, "version", GetVersion, null, false); LuaFunction function = LuaState.Get(ptr).DoString(ClassFunction) as LuaFunction; function.Push(ptr); LuaNativeMethods.lua_setfield(ptr, -3, "Class"); LuaObject.CreateTypeMetatable(ptr, null, typeof(Helper)); }
protected static void AddMember(IntPtr ptr, int v, string name) { LuaNativeMethods.lua_pushinteger(ptr, v); LuaNativeMethods.lua_setfield(ptr, -2, name); }
public static void Init(IntPtr ptr) { string newindexfun = @" local getmetatable=getmetatable local rawget=rawget local error=error local type=type local function newindex(ud,k,v) local t=getmetatable(ud) repeat local h=rawget(t,k) if h then if h[2] then h[2](ud,v) return else error('property '..k..' is read only') end end t=rawget(t,'__parent') until t==nil error('can not find '..k) end return newindex "; string indexfun = @" local type=type local error=error local rawget=rawget local getmetatable=getmetatable local function index(ud,k) local t=getmetatable(ud) repeat local fun=rawget(t,k) local tp=type(fun) if tp=='function' then return fun elseif tp=='table' then local f=fun[1] if f then return f(ud) else error('property '..k..' isthis.Write only') end end t = rawget(t,'__parent') until t==nil error('Can not find '..k) end return index "; LuaState state = LuaState.Get(ptr); newIndexFunction = (LuaFunction)state.DoString(newindexfun); indexFunction = (LuaFunction)state.DoString(indexfun); // object method LuaNativeMethods.lua_createtable(ptr, 0, 4); AddMember(ptr, ToString); AddMember(ptr, GetHashCode); AddMember(ptr, Equals); AddMember(ptr, GetType); LuaNativeMethods.lua_setfield(ptr, LuaIndexes.LUARegistryIndex, "__luabaseobject"); LuaArray.Init(ptr); LuaVarObject.Init(ptr); LuaNativeMethods.lua_newtable(ptr); LuaNativeMethods.lua_setglobal(ptr, DelgateTable); }