LuaWrapPusher.tpl.txt 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. #if USE_UNI_LUA
  2. using LuaAPI = UniLua.Lua;
  3. using RealStatePtr = UniLua.ILuaState;
  4. using LuaCSFunction = UniLua.CSharpFunctionDelegate;
  5. #else
  6. using LuaAPI = XLua.LuaDLL.Lua;
  7. using RealStatePtr = System.IntPtr;
  8. using LuaCSFunction = XLua.LuaDLL.lua_CSFunction;
  9. #endif
  10. using System;
  11. <%
  12. require "TemplateCommon"
  13. %>
  14. namespace XLua
  15. {
  16. public partial class ObjectTranslator
  17. {
  18. <%if purevaluetypes.Count > 0 then
  19. local init_class_name = "IniterAdder" .. CSVariableName(purevaluetypes[0].Type)
  20. %>
  21. class <%=init_class_name%>
  22. {
  23. static <%=init_class_name%>()
  24. {
  25. LuaEnv.AddIniter(Init);
  26. }
  27. static void Init(LuaEnv luaenv, ObjectTranslator translator)
  28. {
  29. <%ForEachCsList(purevaluetypes, function(type_info)
  30. if not type_info.Type.IsValueType then return end
  31. local full_type_name = CsFullTypeName(type_info.Type)%>
  32. translator.RegisterPushAndGetAndUpdate<<%=full_type_name%>>(translator.Push<%=CSVariableName(type_info.Type)%>, translator.Get, translator.Update<%=CSVariableName(type_info.Type)%>);<%
  33. end)%>
  34. <%ForEachCsList(tableoptimzetypes, function(type_info)
  35. local full_type_name = CsFullTypeName(type_info.Type)%>
  36. translator.RegisterCaster<<%=full_type_name%>>(translator.Get);<%
  37. end)%>
  38. }
  39. }
  40. static <%=init_class_name%> s_<%=init_class_name%>_dumb_obj = new <%=init_class_name%>();
  41. static <%=init_class_name%> <%=init_class_name%>_dumb_obj {get{return s_<%=init_class_name%>_dumb_obj;}}
  42. <%end%>
  43. <%ForEachCsList(purevaluetypes, function(type_info)
  44. local type_id_var_name = CSVariableName(type_info.Type) .. '_TypeID'
  45. local enum_ref_var_name = CSVariableName(type_info.Type)..'_EnumRef'
  46. local full_type_name = CsFullTypeName(type_info.Type)
  47. local is_enum = type_info.Type.IsEnum
  48. %>int <%=type_id_var_name%> = -1;<%if is_enum then%>
  49. int <%=enum_ref_var_name%> = -1;
  50. <%end%>
  51. public void Push<%=CSVariableName(type_info.Type)%>(RealStatePtr L, <%=full_type_name%> val)
  52. {
  53. if (<%=type_id_var_name%> == -1)
  54. {
  55. bool is_first;
  56. <%=type_id_var_name%> = getTypeId(L, typeof(<%=full_type_name%>), out is_first);
  57. <%if is_enum then%>
  58. if (<%=enum_ref_var_name%> == -1)
  59. {
  60. Utils.LoadCSTable(L, typeof(<%=full_type_name%>));
  61. <%=enum_ref_var_name%> = LuaAPI.luaL_ref(L, LuaIndexes.LUA_REGISTRYINDEX);
  62. }
  63. <%end%>
  64. }
  65. <%if is_enum then%>
  66. if (LuaAPI.xlua_tryget_cachedud(L, (int)val, <%=enum_ref_var_name%>) == 1)
  67. {
  68. return;
  69. }
  70. <%
  71. end
  72. if type_info.Flag == CS.XLua.OptimizeFlag.PackAsTable then
  73. %>
  74. <%if PushObjectNeedTranslator(type_info) then %> ObjectTranslator translator = ObjectTranslatorPool.Instance.Find(L);<%end%>
  75. LuaAPI.xlua_pushcstable(L, <%=type_info.FieldInfos.Count%>, <%=type_id_var_name%>);
  76. <%ForEachCsList(type_info.FieldInfos, function(fieldInfo)%>
  77. LuaAPI.xlua_pushasciistring(L, "<%=fieldInfo.Name%>");
  78. <%=GetPushStatement(fieldInfo.Type, "val."..fieldInfo.Name)%>;
  79. LuaAPI.lua_rawset(L, -3);
  80. <%end)%>
  81. <%else%>
  82. IntPtr buff = LuaAPI.xlua_pushstruct(L, <%=is_enum and 4 or type_info.Size%>, <%=type_id_var_name%>);
  83. if (!CopyByValue.Pack(buff, 0, <%=is_enum and "(int)" or ""%>val))
  84. {
  85. throw new Exception("pack fail fail for <%=full_type_name%> ,value="+val);
  86. }
  87. <%
  88. end
  89. if is_enum then
  90. %>
  91. LuaAPI.lua_getref(L, <%=enum_ref_var_name%>);
  92. LuaAPI.lua_pushvalue(L, -2);
  93. LuaAPI.xlua_rawseti(L, -2, (int)val);
  94. LuaAPI.lua_pop(L, 1);
  95. <%end%>
  96. }
  97. public void Get(RealStatePtr L, int index, out <%=full_type_name%> val)
  98. {
  99. LuaTypes type = LuaAPI.lua_type(L, index);
  100. if (type == LuaTypes.LUA_TUSERDATA )
  101. {
  102. if (LuaAPI.xlua_gettypeid(L, index) != <%=type_id_var_name%>)
  103. {
  104. throw new Exception("invalid userdata for <%=full_type_name%>");
  105. }
  106. IntPtr buff = LuaAPI.lua_touserdata(L, index);<%if is_enum then%>
  107. int e;
  108. <%end%>if (!CopyByValue.UnPack(buff, 0, out <%=is_enum and "e" or "val"%>))
  109. {
  110. throw new Exception("unpack fail for <%=full_type_name%>");
  111. }<%if is_enum then%>
  112. val = (<%=full_type_name%>)e;
  113. <%end%>
  114. }<%if not is_enum then%>
  115. else if (type ==LuaTypes.LUA_TTABLE)
  116. {
  117. CopyByValue.UnPack(this, L, index, out val);
  118. }<%end%>
  119. else
  120. {
  121. val = (<%=full_type_name%>)objectCasters.GetCaster(typeof(<%=full_type_name%>))(L, index, null);
  122. }
  123. }
  124. public void Update<%=CSVariableName(type_info.Type)%>(RealStatePtr L, int index, <%=full_type_name%> val)
  125. {
  126. <%if type_info.Flag == CS.XLua.OptimizeFlag.PackAsTable then%>
  127. if (LuaAPI.lua_type(L, index) == LuaTypes.LUA_TTABLE)
  128. {
  129. return;
  130. }
  131. <%else%>
  132. if (LuaAPI.lua_type(L, index) == LuaTypes.LUA_TUSERDATA)
  133. {
  134. if (LuaAPI.xlua_gettypeid(L, index) != <%=type_id_var_name%>)
  135. {
  136. throw new Exception("invalid userdata for <%=full_type_name%>");
  137. }
  138. IntPtr buff = LuaAPI.lua_touserdata(L, index);
  139. if (!CopyByValue.Pack(buff, 0, <%=is_enum and "(int)" or ""%>val))
  140. {
  141. throw new Exception("pack fail for <%=full_type_name%> ,value="+val);
  142. }
  143. }
  144. <%end%>
  145. else
  146. {
  147. throw new Exception("try to update a data with lua type:" + LuaAPI.lua_type(L, index));
  148. }
  149. }
  150. <%end)%>
  151. // table cast optimze
  152. <%ForEachCsList(tableoptimzetypes, function(type_info)
  153. local full_type_name = CsFullTypeName(type_info.Type)
  154. %>
  155. public void Get(RealStatePtr L, int index, out <%=full_type_name%> val)
  156. {
  157. LuaTypes type = LuaAPI.lua_type(L, index);
  158. if (type == LuaTypes.LUA_TUSERDATA )
  159. {
  160. val = (<%=full_type_name%>)FastGetCSObj(L, index);
  161. }
  162. else if (type == LuaTypes.LUA_TTABLE)
  163. {
  164. val = new <%=full_type_name%>();
  165. int top = LuaAPI.lua_gettop(L);
  166. <%ForEachCsList(type_info.Fields, function(fieldInfo)%>
  167. if (Utils.LoadField(L, index, "<%=fieldInfo.Name%>"))
  168. {
  169. Get(L, top + 1, out val.<%=fieldInfo.Name%>);
  170. }
  171. LuaAPI.lua_pop(L, 1);
  172. <%end)%>
  173. }<%if not type_info.Type.IsValueType then%>
  174. else if (type == LuaTypes.LUA_TNIL || type == LuaTypes.LUA_TNONE)
  175. {
  176. val = null;
  177. }<%end%>
  178. else
  179. {
  180. throw new Exception("can not cast " + LuaAPI.lua_type(L, index) + " to " + typeof(<%=full_type_name%>));
  181. }
  182. }
  183. <%end)%>
  184. }
  185. public partial class StaticLuaCallbacks
  186. {
  187. internal static bool __tryArrayGet(Type type, RealStatePtr L, ObjectTranslator translator, object obj, int index)
  188. {
  189. <%ForEachCsList(purevaluetypes, function(type_info, idx)
  190. if not type_info.Type.IsValueType then return end
  191. local full_type_name = CsFullTypeName(type_info.Type)
  192. %>
  193. <%=(idx == 0 and '' or 'else ')%>if (type == typeof(<%=full_type_name%>[]))
  194. {
  195. <%=full_type_name%>[] array = obj as <%=full_type_name%>[];
  196. translator.Push<%=CSVariableName(type_info.Type)%>(L, array[index]);
  197. return true;
  198. }<%
  199. end)%>
  200. return false;
  201. }
  202. internal static bool __tryArraySet(Type type, RealStatePtr L, ObjectTranslator translator, object obj, int array_idx, int obj_idx)
  203. {
  204. <%
  205. local is_first = true
  206. ForEachCsList(purevaluetypes, tableoptimzetypes, function(type_info)
  207. local full_type_name = CsFullTypeName(type_info.Type)
  208. %>
  209. <%=(is_first and '' or 'else ')%>if (type == typeof(<%=full_type_name%>[]))
  210. {
  211. <%=full_type_name%>[] array = obj as <%=full_type_name%>[];
  212. translator.Get(L, obj_idx, out array[array_idx]);
  213. return true;
  214. }<%
  215. is_first = false
  216. end)%>
  217. return false;
  218. }
  219. }
  220. }