| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385 |
- #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)%>
- }
- }
|