386 lines
14 KiB
Plaintext
386 lines
14 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 XLua;
|
|
using System;
|
|
<%
|
|
require "TemplateCommon"
|
|
|
|
%>
|
|
|
|
namespace XLua.CSObjectWrap
|
|
{
|
|
public class <%=CSVariableName(type)%>Bridge : LuaBase, <%=CsFullTypeName(type)%>
|
|
{
|
|
public static LuaBase __Create(int reference, LuaEnv luaenv)
|
|
{
|
|
return new <%=CSVariableName(type)%>Bridge(reference, luaenv);
|
|
}
|
|
|
|
public <%=CSVariableName(type)%>Bridge(int reference, LuaEnv luaenv) : base(reference, luaenv)
|
|
{
|
|
}
|
|
|
|
<%
|
|
ForEachCsList(methods, function(method)
|
|
local parameters = method:GetParameters()
|
|
local in_num = CalcCsList(parameters, function(p) return not (p.IsOut and p.ParameterType.IsByRef) end)
|
|
local out_num = CalcCsList(parameters, function(p) return p.IsOut or p.ParameterType.IsByRef end)
|
|
local in_pos = 0
|
|
local has_return = (method.ReturnType.FullName ~= "System.Void")
|
|
local return_type_name = has_return and CsFullTypeName(method.ReturnType) or "void"
|
|
local out_idx = has_return and 2 or 1
|
|
if has_return then out_num = out_num + 1 end
|
|
%>
|
|
<%=return_type_name%> <%=CsFullTypeName(method.DeclaringType)%>.<%=method.Name%>(<%ForEachCsList(parameters, function(parameter, pi)
|
|
if pi ~= 0 then
|
|
%>, <%
|
|
end
|
|
if parameter.IsOut and parameter.ParameterType.IsByRef then
|
|
%>out <%
|
|
elseif parameter.ParameterType.IsByRef then
|
|
%>ref <%
|
|
end
|
|
%><%=CsFullTypeName(parameter.ParameterType)%> <%=parameter.Name%><%
|
|
end) %>)
|
|
{
|
|
#if THREAD_SAFE || HOTFIX_ENABLE
|
|
lock (luaEnv.luaEnvLock)
|
|
{
|
|
#endif
|
|
RealStatePtr L = luaEnv.L;
|
|
int err_func = LuaAPI.load_error_func(L, luaEnv.errorFuncRef);
|
|
<%if CallNeedTranslator(method, "") then %>ObjectTranslator translator = luaEnv.translator;<%end%>
|
|
|
|
LuaAPI.lua_getref(L, luaReference);
|
|
LuaAPI.xlua_pushasciistring(L, "<%=method.Name%>");
|
|
if (0 != LuaAPI.xlua_pgettable(L, -2))
|
|
{
|
|
luaEnv.ThrowExceptionFromError(err_func - 1);
|
|
}
|
|
if(!LuaAPI.lua_isfunction(L, -1))
|
|
{
|
|
LuaAPI.xlua_pushasciistring(L, "no such function <%=method.Name%>");
|
|
luaEnv.ThrowExceptionFromError(err_func - 1);
|
|
}
|
|
LuaAPI.lua_pushvalue(L, -2);
|
|
LuaAPI.lua_remove(L, -3);
|
|
<%
|
|
local param_count = parameters.Length
|
|
local has_v_params = param_count > 0 and IsParams(parameters[param_count - 1])
|
|
|
|
ForEachCsList(parameters, function(parameter, pi)
|
|
if not (parameter.IsOut and parameter.ParameterType.IsByRef) then
|
|
%><%=GetPushStatement(parameter.ParameterType, parameter.Name, has_v_params and pi == param_count - 1)%>;
|
|
<%
|
|
end
|
|
end) %>
|
|
int __gen_error = LuaAPI.lua_pcall(L, <%=has_v_params and ((in_num) .. " + (".. parameters[param_count - 1].Name .. " == null ? 0 : " .. parameters[param_count - 1].Name .. ".Length)" ) or (in_num + 1)%>, <%=out_num%>, err_func);
|
|
if (__gen_error != 0)
|
|
luaEnv.ThrowExceptionFromError(err_func - 1);
|
|
|
|
<%ForEachCsList(parameters, function(parameter)
|
|
if parameter.IsOut or parameter.ParameterType.IsByRef then
|
|
%><%=GetCasterStatement(parameter.ParameterType, "err_func" .. (" + "..out_idx), parameter.Name)%>;
|
|
<%
|
|
out_idx = out_idx + 1
|
|
end
|
|
end) %>
|
|
<%if has_return then %><%=GetCasterStatement(method.ReturnType, "err_func + 1", "__gen_ret", true)%>;<% end%>
|
|
LuaAPI.lua_settop(L, err_func - 1);
|
|
<%if has_return then %>return __gen_ret;<% end%>
|
|
#if THREAD_SAFE || HOTFIX_ENABLE
|
|
}
|
|
#endif
|
|
}
|
|
<%end)%>
|
|
|
|
<%
|
|
ForEachCsList(propertys, function(property)
|
|
%>
|
|
<%=CsFullTypeName(property.PropertyType)%> <%=CsFullTypeName(property.DeclaringType)%>.<%=property.Name%>
|
|
{
|
|
<%if property.CanRead then%>
|
|
get
|
|
{
|
|
#if THREAD_SAFE || HOTFIX_ENABLE
|
|
lock (luaEnv.luaEnvLock)
|
|
{
|
|
#endif
|
|
RealStatePtr L = luaEnv.L;
|
|
int oldTop = LuaAPI.lua_gettop(L);
|
|
<%if not JustLuaType(property.PropertyType) then %>ObjectTranslator translator = luaEnv.translator;<%end%>
|
|
LuaAPI.lua_getref(L, luaReference);
|
|
LuaAPI.xlua_pushasciistring(L, "<%=property.Name%>");
|
|
if (0 != LuaAPI.xlua_pgettable(L, -2))
|
|
{
|
|
luaEnv.ThrowExceptionFromError(oldTop);
|
|
}
|
|
<%=GetCasterStatement(property.PropertyType, "-1", "__gen_ret", true)%>;
|
|
LuaAPI.lua_pop(L, 2);
|
|
return __gen_ret;
|
|
#if THREAD_SAFE || HOTFIX_ENABLE
|
|
}
|
|
#endif
|
|
}
|
|
<%end%>
|
|
<%if property.CanWrite then%>
|
|
set
|
|
{
|
|
#if THREAD_SAFE || HOTFIX_ENABLE
|
|
lock (luaEnv.luaEnvLock)
|
|
{
|
|
#endif
|
|
RealStatePtr L = luaEnv.L;
|
|
int oldTop = LuaAPI.lua_gettop(L);
|
|
<%if not JustLuaType(property.PropertyType) then %>ObjectTranslator translator = luaEnv.translator;<%end%>
|
|
LuaAPI.lua_getref(L, luaReference);
|
|
LuaAPI.xlua_pushasciistring(L, "<%=property.Name%>");
|
|
<%=GetPushStatement(property.PropertyType, "value")%>;
|
|
if (0 != LuaAPI.xlua_psettable(L, -3))
|
|
{
|
|
luaEnv.ThrowExceptionFromError(oldTop);
|
|
}
|
|
LuaAPI.lua_pop(L, 1);
|
|
#if THREAD_SAFE || HOTFIX_ENABLE
|
|
}
|
|
#endif
|
|
}
|
|
<%end%>
|
|
}
|
|
<%end)%>
|
|
|
|
<%ForEachCsList(events, function(event) %>
|
|
event <%=CsFullTypeName(event.EventHandlerType)%> <%=CsFullTypeName(event.DeclaringType)%>.<%=event.Name%>
|
|
{<%local parameters = event:GetAddMethod():GetParameters()%>
|
|
add
|
|
{
|
|
#if THREAD_SAFE || HOTFIX_ENABLE
|
|
lock (luaEnv.luaEnvLock)
|
|
{
|
|
#endif
|
|
RealStatePtr L = luaEnv.L;
|
|
int err_func = LuaAPI.load_error_func(L, luaEnv.errorFuncRef);
|
|
<%if CallNeedTranslator(event:GetAddMethod(), "") then %>ObjectTranslator translator = luaEnv.translator;<%end%>
|
|
|
|
LuaAPI.lua_getref(L, luaReference);
|
|
LuaAPI.xlua_pushasciistring(L, "add_<%=event.Name%>");
|
|
if (0 != LuaAPI.xlua_pgettable(L, -2))
|
|
{
|
|
luaEnv.ThrowExceptionFromError(err_func - 1);
|
|
}
|
|
if(!LuaAPI.lua_isfunction(L, -1))
|
|
{
|
|
LuaAPI.xlua_pushasciistring(L, "no such function add_<%=event.Name%>");
|
|
luaEnv.ThrowExceptionFromError(err_func - 1);
|
|
}
|
|
LuaAPI.lua_pushvalue(L, -2);
|
|
LuaAPI.lua_remove(L, -3);
|
|
<%
|
|
local param_count = parameters.Length
|
|
local has_v_params = param_count > 0 and IsParams(parameters[param_count - 1])
|
|
|
|
ForEachCsList(parameters, function(parameter, pi)
|
|
if not (parameter.IsOut and parameter.ParameterType.IsByRef) then
|
|
%><%=GetPushStatement(parameter.ParameterType, parameter.Name, has_v_params and pi == param_count - 1)%>;
|
|
<%
|
|
end
|
|
end) %>
|
|
int __gen_error = LuaAPI.lua_pcall(L, 2, 0, err_func);
|
|
if (__gen_error != 0)
|
|
luaEnv.ThrowExceptionFromError(err_func - 1);
|
|
|
|
LuaAPI.lua_settop(L, err_func - 1);
|
|
#if THREAD_SAFE || HOTFIX_ENABLE
|
|
}
|
|
#endif
|
|
}
|
|
|
|
remove
|
|
{
|
|
#if THREAD_SAFE || HOTFIX_ENABLE
|
|
lock (luaEnv.luaEnvLock)
|
|
{
|
|
#endif
|
|
RealStatePtr L = luaEnv.L;
|
|
int err_func = LuaAPI.load_error_func(L, luaEnv.errorFuncRef);
|
|
<%if CallNeedTranslator(event:GetRemoveMethod(), "") then %>ObjectTranslator translator = luaEnv.translator;<%end%>
|
|
|
|
LuaAPI.lua_getref(L, luaReference);
|
|
LuaAPI.xlua_pushasciistring(L, "remove_<%=event.Name%>");
|
|
if (0 != LuaAPI.xlua_pgettable(L, -2))
|
|
{
|
|
luaEnv.ThrowExceptionFromError(err_func - 1);
|
|
}
|
|
if(!LuaAPI.lua_isfunction(L, -1))
|
|
{
|
|
LuaAPI.xlua_pushasciistring(L, "no such function remove_<%=event.Name%>");
|
|
luaEnv.ThrowExceptionFromError(err_func - 1);
|
|
}
|
|
LuaAPI.lua_pushvalue(L, -2);
|
|
LuaAPI.lua_remove(L, -3);
|
|
<%
|
|
local param_count = parameters.Length
|
|
local has_v_params = param_count > 0 and IsParams(parameters[param_count - 1])
|
|
|
|
ForEachCsList(parameters, function(parameter, pi)
|
|
if not (parameter.IsOut and parameter.ParameterType.IsByRef) then
|
|
%><%=GetPushStatement(parameter.ParameterType, parameter.Name, has_v_params and pi == param_count - 1)%>;
|
|
<%
|
|
end
|
|
end) %>
|
|
int __gen_error = LuaAPI.lua_pcall(L, 2, 0, err_func);
|
|
if (__gen_error != 0)
|
|
luaEnv.ThrowExceptionFromError(err_func - 1);
|
|
|
|
LuaAPI.lua_settop(L, err_func - 1);
|
|
#if THREAD_SAFE || HOTFIX_ENABLE
|
|
}
|
|
#endif
|
|
}
|
|
}
|
|
<%end)%>
|
|
|
|
<%ForEachCsList(indexers, function(indexer)
|
|
local ptype = (indexer:GetGetMethod() or indexer:GetSetMethod()):GetParameters()[0].ParameterType
|
|
local pname = (indexer:GetGetMethod() or indexer:GetSetMethod()):GetParameters()[0].Name
|
|
%>
|
|
<%=CsFullTypeName(indexer.PropertyType)%> <%=CsFullTypeName(indexer.DeclaringType)%>.this[<%=CsFullTypeName(ptype)%> <%=pname%>]
|
|
{<%if indexer:GetGetMethod() then
|
|
local method = indexer:GetGetMethod()
|
|
local parameters = method:GetParameters()
|
|
local in_num = CalcCsList(parameters, function(p) return not (p.IsOut and p.ParameterType.IsByRef) end)
|
|
local out_num = CalcCsList(parameters, function(p) return p.IsOut or p.ParameterType.IsByRef end)
|
|
local in_pos = 0
|
|
local has_return = (method.ReturnType.FullName ~= "System.Void")
|
|
local return_type_name = has_return and CsFullTypeName(method.ReturnType) or "void"
|
|
local out_idx = has_return and 2 or 1
|
|
if has_return then out_num = out_num + 1 end
|
|
%>
|
|
get
|
|
{
|
|
#if THREAD_SAFE || HOTFIX_ENABLE
|
|
lock (luaEnv.luaEnvLock)
|
|
{
|
|
#endif
|
|
RealStatePtr L = luaEnv.L;
|
|
int err_func = LuaAPI.load_error_func(L, luaEnv.errorFuncRef);
|
|
<%if CallNeedTranslator(method, "") then %>ObjectTranslator translator = luaEnv.translator;<%end%>
|
|
|
|
LuaAPI.lua_getref(L, luaReference);
|
|
LuaAPI.xlua_pushasciistring(L, "<%=method.Name%>");
|
|
if (0 != LuaAPI.xlua_pgettable(L, -2))
|
|
{
|
|
luaEnv.ThrowExceptionFromError(err_func - 1);
|
|
}
|
|
if(!LuaAPI.lua_isfunction(L, -1))
|
|
{
|
|
LuaAPI.xlua_pushasciistring(L, "no such function <%=method.Name%>");
|
|
luaEnv.ThrowExceptionFromError(err_func - 1);
|
|
}
|
|
LuaAPI.lua_pushvalue(L, -2);
|
|
LuaAPI.lua_remove(L, -3);
|
|
<%
|
|
local param_count = parameters.Length
|
|
local has_v_params = param_count > 0 and IsParams(parameters[param_count - 1])
|
|
|
|
ForEachCsList(parameters, function(parameter, pi)
|
|
if not (parameter.IsOut and parameter.ParameterType.IsByRef) then
|
|
%><%=GetPushStatement(parameter.ParameterType, parameter.Name, has_v_params and pi == param_count - 1)%>;
|
|
<%
|
|
end
|
|
end) %>
|
|
int __gen_error = LuaAPI.lua_pcall(L, <%=has_v_params and ((in_num) .. " + " .. parameters[param_count - 1].Name .. ".Length" ) or (in_num + 1)%>, <%=out_num%>, err_func);
|
|
if (__gen_error != 0)
|
|
luaEnv.ThrowExceptionFromError(err_func - 1);
|
|
|
|
<%ForEachCsList(parameters, function(parameter)
|
|
if parameter.IsOut or parameter.ParameterType.IsByRef then
|
|
%><%=GetCasterStatement(parameter.ParameterType, "err_func" .. (" + "..out_idx), parameter.Name)%>;
|
|
<%
|
|
out_idx = out_idx + 1
|
|
end
|
|
end) %>
|
|
<%if has_return then %><%=GetCasterStatement(method.ReturnType, "err_func + 1", "__gen_ret", true)%>;<% end%>
|
|
LuaAPI.lua_settop(L, err_func - 1);
|
|
<%if has_return then %>return __gen_ret;<% end%>
|
|
#if THREAD_SAFE || HOTFIX_ENABLE
|
|
}
|
|
#endif
|
|
}
|
|
<%end%>
|
|
<%if indexer:GetSetMethod() then
|
|
local method = indexer:GetSetMethod()
|
|
local parameters = method:GetParameters()
|
|
local in_num = CalcCsList(parameters, function(p) return not (p.IsOut and p.ParameterType.IsByRef) end)
|
|
local out_num = CalcCsList(parameters, function(p) return p.IsOut or p.ParameterType.IsByRef end)
|
|
local in_pos = 0
|
|
local has_return = (method.ReturnType.FullName ~= "System.Void")
|
|
local return_type_name = has_return and CsFullTypeName(method.ReturnType) or "void"
|
|
local out_idx = has_return and 2 or 1
|
|
if has_return then out_num = out_num + 1 end
|
|
%>
|
|
set
|
|
{
|
|
#if THREAD_SAFE || HOTFIX_ENABLE
|
|
lock (luaEnv.luaEnvLock)
|
|
{
|
|
#endif
|
|
RealStatePtr L = luaEnv.L;
|
|
int err_func = LuaAPI.load_error_func(L, luaEnv.errorFuncRef);
|
|
<%if CallNeedTranslator(method, "") then %>ObjectTranslator translator = luaEnv.translator;<%end%>
|
|
|
|
LuaAPI.lua_getref(L, luaReference);
|
|
LuaAPI.xlua_pushasciistring(L, "<%=method.Name%>");
|
|
if (0 != LuaAPI.xlua_pgettable(L, -2))
|
|
{
|
|
luaEnv.ThrowExceptionFromError(err_func - 1);
|
|
}
|
|
if(!LuaAPI.lua_isfunction(L, -1))
|
|
{
|
|
LuaAPI.xlua_pushasciistring(L, "no such function <%=method.Name%>");
|
|
luaEnv.ThrowExceptionFromError(err_func - 1);
|
|
}
|
|
LuaAPI.lua_pushvalue(L, -2);
|
|
LuaAPI.lua_remove(L, -3);
|
|
<%
|
|
local param_count = parameters.Length
|
|
local has_v_params = param_count > 0 and IsParams(parameters[param_count - 1])
|
|
|
|
ForEachCsList(parameters, function(parameter, pi)
|
|
if not (parameter.IsOut and parameter.ParameterType.IsByRef) then
|
|
%><%=GetPushStatement(parameter.ParameterType, parameter.Name, has_v_params and pi == param_count - 1)%>;
|
|
<%
|
|
end
|
|
end) %>
|
|
int __gen_error = LuaAPI.lua_pcall(L, <%=has_v_params and ((in_num) .. " + " .. parameters[param_count - 1].Name .. ".Length" ) or (in_num + 1)%>, <%=out_num%>, err_func);
|
|
if (__gen_error != 0)
|
|
luaEnv.ThrowExceptionFromError(err_func - 1);
|
|
|
|
<%ForEachCsList(parameters, function(parameter)
|
|
if parameter.IsOut or parameter.ParameterType.IsByRef then
|
|
%><%=GetCasterStatement(parameter.ParameterType, "err_func" .. (" + "..out_idx), parameter.Name)%>;
|
|
<%
|
|
out_idx = out_idx + 1
|
|
end
|
|
end) %>
|
|
<%if has_return then %><%=GetCasterStatement(method.ReturnType, "err_func + 1", "__gen_ret", true)%>;<% end%>
|
|
LuaAPI.lua_settop(L, err_func - 1);
|
|
<%if has_return then %>return __gen_ret;<% end%>
|
|
#if THREAD_SAFE || HOTFIX_ENABLE
|
|
}
|
|
#endif
|
|
}
|
|
<%end%>
|
|
}
|
|
<%end)%>
|
|
}
|
|
}
|