internal void PushObject(object obj, IntPtr?stateOverride = null) { var state = stateOverride ?? MainState; Debug.Assert(LuaApi.GetMainState(state) == MainState, "State override did not match main state."); if (obj == null) { LuaApi.PushNil(state); return; } if (obj is IConvertible conv) { switch (conv.GetTypeCode()) { case TypeCode.Boolean: LuaApi.PushBoolean(state, (bool)obj); return; case TypeCode.SByte: case TypeCode.Byte: case TypeCode.Int16: case TypeCode.UInt16: case TypeCode.Int32: case TypeCode.UInt32: case TypeCode.Int64: LuaApi.PushInteger(state, conv.ToInt64(null)); return; case TypeCode.UInt64: LuaApi.PushInteger(state, (long)((ulong)conv)); return; case TypeCode.Single: case TypeCode.Double: case TypeCode.Decimal: LuaApi.PushNumber(state, conv.ToDouble(null)); return; case TypeCode.Char: case TypeCode.String: LuaApi.PushString(state, conv.ToString()); return; default: ObjectBinder.PushNetObject(state, conv); return; } } else if (obj is LuaReference luaReference) { luaReference.PushOnto(state); } else { ObjectBinder.PushNetObject(state, obj); } }
/// <summary> /// Clears all of the key-value pairs. /// </summary> public void Clear() { PushOnto(Lua.MainState); LuaApi.PushNil(Lua.MainState); while (LuaApi.Next(Lua.MainState, -2)) { LuaApi.Pop(Lua.MainState, 1); LuaApi.PushValue(Lua.MainState, -1); LuaApi.PushNil(Lua.MainState); LuaApi.SetTable(Lua.MainState, -4); } LuaApi.Pop(Lua.MainState, 1); }