240 lines
8.5 KiB
Plaintext
240 lines
8.5 KiB
Plaintext
#if USE_UNI_LUA
|
|
using LuaAPI = UniLua.Lua;
|
|
using RealStatePtr = UniLua.ILuaState;
|
|
using LuaCSFunction = UniLua.CSharpFunctionDelegate;
|
|
#else
|
|
using LuaAPI = XLua.LuaDLL.Lua;
|
|
using RealStatePtr = System.IntPtr;
|
|
using LuaCSFunction = XLua.LuaDLL.lua_CSFunction;
|
|
#endif
|
|
|
|
using System;
|
|
<%
|
|
require "TemplateCommon"
|
|
%>
|
|
|
|
namespace XLua
|
|
{
|
|
public class ObjectTranslatorChild: ObjectTranslator
|
|
{
|
|
static XLua.CSObjectWrap.XLua_Gen_Initer_Register__ s_gen_reg_dumb_obj = new XLua.CSObjectWrap.XLua_Gen_Initer_Register__();
|
|
static XLua.CSObjectWrap.XLua_Gen_Initer_Register__ gen_reg_dumb_obj {get{return s_gen_reg_dumb_obj;}}
|
|
public ObjectTranslatorChild(LuaEnv luaenv, RealStatePtr L) : base(luaenv, L)
|
|
{
|
|
}
|
|
<%if purevaluetypes.Count > 0 then
|
|
local init_class_name = "IniterAdder" .. CSVariableName(purevaluetypes[0].Type)
|
|
%>
|
|
class <%=init_class_name%>
|
|
{
|
|
static <%=init_class_name%>()
|
|
{
|
|
LuaEnv.AddIniter(Init);
|
|
}
|
|
|
|
static void Init(LuaEnv luaenv, ObjectTranslator _translator)
|
|
{
|
|
ObjectTranslatorChild translator = (ObjectTranslatorChild)_translator;
|
|
<%ForEachCsList(purevaluetypes, function(type_info)
|
|
if not type_info.Type.IsValueType then return end
|
|
local full_type_name = CsFullTypeName(type_info.Type)%>
|
|
translator.RegisterPushAndGetAndUpdate<<%=full_type_name%>>(translator.Push<%=CSVariableName(type_info.Type)%>, translator.Get, translator.Update<%=CSVariableName(type_info.Type)%>);<%
|
|
end)%>
|
|
<%ForEachCsList(tableoptimzetypes, function(type_info)
|
|
local full_type_name = CsFullTypeName(type_info.Type)%>
|
|
translator.RegisterCaster<<%=full_type_name%>>(translator.Get);<%
|
|
end)%>
|
|
}
|
|
}
|
|
|
|
static <%=init_class_name%> s_<%=init_class_name%>_dumb_obj = new <%=init_class_name%>();
|
|
static <%=init_class_name%> <%=init_class_name%>_dumb_obj {get{return s_<%=init_class_name%>_dumb_obj;}}
|
|
<%end%>
|
|
|
|
<%ForEachCsList(purevaluetypes, function(type_info)
|
|
local type_id_var_name = CSVariableName(type_info.Type) .. '_TypeID'
|
|
local enum_ref_var_name = CSVariableName(type_info.Type)..'_EnumRef'
|
|
local full_type_name = CsFullTypeName(type_info.Type)
|
|
local is_enum = type_info.Type.IsEnum
|
|
%>int <%=type_id_var_name%> = -1;<%if is_enum then%>
|
|
int <%=enum_ref_var_name%> = -1;
|
|
<%end%>
|
|
public void Push<%=CSVariableName(type_info.Type)%>(RealStatePtr L, <%=full_type_name%> val)
|
|
{
|
|
if (<%=type_id_var_name%> == -1)
|
|
{
|
|
bool is_first;
|
|
<%=type_id_var_name%> = getTypeId(L, typeof(<%=full_type_name%>), out is_first);
|
|
<%if is_enum then%>
|
|
if (<%=enum_ref_var_name%> == -1)
|
|
{
|
|
Utils.LoadCSTable(L, typeof(<%=full_type_name%>));
|
|
<%=enum_ref_var_name%> = LuaAPI.luaL_ref(L, LuaIndexes.LUA_REGISTRYINDEX);
|
|
}
|
|
<%end%>
|
|
}
|
|
<%if is_enum then%>
|
|
if (LuaAPI.xlua_tryget_cachedud(L, (int)val, <%=enum_ref_var_name%>) == 1)
|
|
{
|
|
return;
|
|
}
|
|
<%
|
|
end
|
|
if type_info.Flag == CS.XLua.OptimizeFlag.PackAsTable then
|
|
%>
|
|
LuaAPI.xlua_pushcstable(L, <%=type_info.FieldInfos.Count%>, <%=type_id_var_name%>);
|
|
<%ForEachCsList(type_info.FieldInfos, function(fieldInfo)%>
|
|
LuaAPI.xlua_pushasciistring(L, "<%=fieldInfo.Name%>");
|
|
<%=GetPushStatement(fieldInfo.Type, "val."..fieldInfo.Name)%>;
|
|
LuaAPI.lua_rawset(L, -3);
|
|
<%end)%>
|
|
<%else%>
|
|
IntPtr buff = LuaAPI.xlua_pushstruct(L, <%=is_enum and 4 or type_info.Size%>, <%=type_id_var_name%>);
|
|
if (!CopyByValueEX.Pack(buff, 0, <%=is_enum and "(int)" or ""%>val))
|
|
{
|
|
throw new Exception("pack fail fail for <%=full_type_name%> ,value="+val);
|
|
}
|
|
<%
|
|
end
|
|
if is_enum then
|
|
%>
|
|
LuaAPI.lua_getref(L, <%=enum_ref_var_name%>);
|
|
LuaAPI.lua_pushvalue(L, -2);
|
|
LuaAPI.xlua_rawseti(L, -2, (int)val);
|
|
LuaAPI.lua_pop(L, 1);
|
|
<%end%>
|
|
}
|
|
|
|
public void Get(RealStatePtr L, int index, out <%=full_type_name%> val)
|
|
{
|
|
LuaTypes type = LuaAPI.lua_type(L, index);
|
|
if (type == LuaTypes.LUA_TUSERDATA )
|
|
{
|
|
if (LuaAPI.xlua_gettypeid(L, index) != <%=type_id_var_name%>)
|
|
{
|
|
throw new Exception("invalid userdata for <%=full_type_name%>");
|
|
}
|
|
|
|
IntPtr buff = LuaAPI.lua_touserdata(L, index);<%if is_enum then%>
|
|
int e;
|
|
<%end%>if (!CopyByValueEX.UnPack(buff, 0, out <%=is_enum and "e" or "val"%>))
|
|
{
|
|
throw new Exception("unpack fail for <%=full_type_name%>");
|
|
}<%if is_enum then%>
|
|
val = (<%=full_type_name%>)e;
|
|
<%end%>
|
|
}<%if not is_enum then%>
|
|
else if (type ==LuaTypes.LUA_TTABLE)
|
|
{
|
|
CopyByValueEX.UnPack(this, L, index, out val);
|
|
}<%end%>
|
|
else
|
|
{
|
|
val = (<%=full_type_name%>)objectCasters.GetCaster(typeof(<%=full_type_name%>))(L, index, null);
|
|
}
|
|
}
|
|
|
|
public void Update<%=CSVariableName(type_info.Type)%>(RealStatePtr L, int index, <%=full_type_name%> val)
|
|
{
|
|
<%if type_info.Flag == CS.XLua.OptimizeFlag.PackAsTable then%>
|
|
if (LuaAPI.lua_type(L, index) == LuaTypes.LUA_TTABLE)
|
|
{
|
|
return;
|
|
}
|
|
<%else%>
|
|
if (LuaAPI.lua_type(L, index) == LuaTypes.LUA_TUSERDATA)
|
|
{
|
|
if (LuaAPI.xlua_gettypeid(L, index) != <%=type_id_var_name%>)
|
|
{
|
|
throw new Exception("invalid userdata for <%=full_type_name%>");
|
|
}
|
|
|
|
IntPtr buff = LuaAPI.lua_touserdata(L, index);
|
|
if (!CopyByValueEX.Pack(buff, 0, <%=is_enum and "(int)" or ""%>val))
|
|
{
|
|
throw new Exception("pack fail for <%=full_type_name%> ,value="+val);
|
|
}
|
|
}
|
|
<%end%>
|
|
else
|
|
{
|
|
throw new Exception("try to update a data with lua type:" + LuaAPI.lua_type(L, index));
|
|
}
|
|
}
|
|
|
|
<%end)%>
|
|
// table cast optimze
|
|
<%ForEachCsList(tableoptimzetypes, function(type_info)
|
|
local full_type_name = CsFullTypeName(type_info.Type)
|
|
%>
|
|
public void Get(RealStatePtr L, int index, out <%=full_type_name%> val)
|
|
{
|
|
LuaTypes type = LuaAPI.lua_type(L, index);
|
|
if (type == LuaTypes.LUA_TUSERDATA )
|
|
{
|
|
val = (<%=full_type_name%>)FastGetCSObj(L, index);
|
|
}
|
|
else if (type == LuaTypes.LUA_TTABLE)
|
|
{
|
|
val = new <%=full_type_name%>();
|
|
int top = LuaAPI.lua_gettop(L);
|
|
<%ForEachCsList(type_info.Fields, function(fieldInfo)%>
|
|
if (Utils.LoadField(L, index, "<%=fieldInfo.Name%>"))
|
|
{
|
|
Get(L, top + 1, out val.<%=fieldInfo.Name%>);
|
|
}
|
|
LuaAPI.lua_pop(L, 1);
|
|
<%end)%>
|
|
}<%if not type_info.Type.IsValueType then%>
|
|
else if (type == LuaTypes.LUA_TNIL || type == LuaTypes.LUA_TNONE)
|
|
{
|
|
val = null;
|
|
}<%end%>
|
|
else
|
|
{
|
|
throw new Exception("can not cast " + LuaAPI.lua_type(L, index) + " to " + typeof(<%=full_type_name%>));
|
|
}
|
|
}
|
|
<%end)%>
|
|
|
|
}
|
|
|
|
public class StaticLuaCallbacksChild:StaticLuaCallbacks
|
|
{
|
|
internal static bool __tryArrayGet(Type type, RealStatePtr L, ObjectTranslator _translator, object obj, int index)
|
|
{
|
|
ObjectTranslatorChild translator = (ObjectTranslatorChild)_translator;
|
|
<%ForEachCsList(purevaluetypes, function(type_info, idx)
|
|
if not type_info.Type.IsValueType then return end
|
|
local full_type_name = CsFullTypeName(type_info.Type)
|
|
%>
|
|
<%=(idx == 0 and '' or 'else ')%>if (type == typeof(<%=full_type_name%>[]))
|
|
{
|
|
<%=full_type_name%>[] array = obj as <%=full_type_name%>[];
|
|
translator.Push<%=CSVariableName(type_info.Type)%>(L, array[index]);
|
|
return true;
|
|
}<%
|
|
end)%>
|
|
return false;
|
|
}
|
|
|
|
internal static bool __tryArraySet(Type type, RealStatePtr L, ObjectTranslator _translator, object obj, int array_idx, int obj_idx)
|
|
{
|
|
ObjectTranslatorChild translator = (ObjectTranslatorChild)_translator;
|
|
<%
|
|
local is_first = true
|
|
ForEachCsList(purevaluetypes, tableoptimzetypes, function(type_info)
|
|
local full_type_name = CsFullTypeName(type_info.Type)
|
|
%>
|
|
<%=(is_first and '' or 'else ')%>if (type == typeof(<%=full_type_name%>[]))
|
|
{
|
|
<%=full_type_name%>[] array = obj as <%=full_type_name%>[];
|
|
translator.Get(L, obj_idx, out array[array_idx]);
|
|
return true;
|
|
}<%
|
|
is_first = false
|
|
end)%>
|
|
return false;
|
|
}
|
|
}
|
|
} |