engineAPI.h 179 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827
  1. //-----------------------------------------------------------------------------
  2. // Copyright (c) 2012 GarageGames, LLC
  3. //
  4. // Permission is hereby granted, free of charge, to any person obtaining a copy
  5. // of this software and associated documentation files (the "Software"), to
  6. // deal in the Software without restriction, including without limitation the
  7. // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
  8. // sell copies of the Software, and to permit persons to whom the Software is
  9. // furnished to do so, subject to the following conditions:
  10. //
  11. // The above copyright notice and this permission notice shall be included in
  12. // all copies or substantial portions of the Software.
  13. //
  14. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15. // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  16. // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  17. // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  18. // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  19. // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  20. // IN THE SOFTWARE.
  21. //-----------------------------------------------------------------------------
  22. #ifndef _ENGINEAPI_H_
  23. #define _ENGINEAPI_H_
  24. #ifndef _CONSOLETYPES_H_
  25. #include "console/consoleTypes.h"
  26. #endif
  27. #ifndef _CONSOLE_H_
  28. #include "console/console.h"
  29. #endif
  30. #ifndef _STRINGFUNCTIONS_H_
  31. #include "core/strings/stringFunctions.h"
  32. #endif
  33. #ifndef _SIMOBJECT_H_
  34. #include "console/simObject.h"
  35. #endif
  36. #ifndef _ENGINEFUNCTIONS_H_
  37. #include "console/engineFunctions.h"
  38. #endif
  39. // Whatever types are used in API definitions, their DECLAREs must be visible to the
  40. // macros. We include the basic primitive and struct types here.
  41. #ifndef _ENGINEPRIMITIVES_H_
  42. #include "console/enginePrimitives.h"
  43. #endif
  44. #ifndef _ENGINESTRUCTS_H_
  45. #include "console/engineStructs.h"
  46. #endif
  47. /// @file
  48. /// Definitions for exposing engine functionality to the control layer.
  49. ///
  50. /// This file provides a convenience layer around the underlying engine interop system (which at
  51. /// the moment still includes the legacy TorqueScript interop a.k.a. "console system"). The
  52. /// macros exposed here will automatically take care of all marshalling, value type constraints,
  53. /// reflection info instancing, etc. involved in defining engine API call-ins and call-outs.
  54. ///
  55. /// @note At the moment, this file supplies both the legacy TorqueScript console system as well
  56. /// as the new engine export system with the structures and information they need. In the
  57. /// near future, the console-based parts will get purged. This will not result in visible
  58. /// changes to users of the functionality here except for the string-based marshalling
  59. /// functions currently exposed (which will also disappear).
  60. //TODO: Disable warning for extern "C" functions returning UDTs for now; need to take a closer look at this
  61. #pragma warning( disable : 4190 )
  62. // Disable some VC warnings that are irrelevant to us.
  63. #pragma warning( push )
  64. #pragma warning( disable : 4510 ) // default constructor could not be generated; all the Args structures are never constructed by us
  65. #pragma warning( disable : 4610 ) // can never be instantiated; again Args is never constructed by us
  66. namespace engineAPI {
  67. /// Flag for enabling legacy console behavior in the interop system while
  68. /// we still have it around. Will disappear along with console.
  69. extern bool gUseConsoleInterop;
  70. /// Flag to allow engine functions to detect whether the engine had been
  71. /// initialized or shut down.
  72. extern bool gIsInitialized;
  73. }
  74. //FIXME: this allows const char* to be used as a struct field type
  75. // Temp support for allowing const char* to remain in the API functions as long as we
  76. // still have the console system around. When that is purged, these definitions should
  77. // be deleted and all const char* uses be replaced with String.
  78. template<> struct EngineTypeTraits< const char* > : public EngineTypeTraits< String > {};
  79. template<> inline const EngineTypeInfo* TYPE< const char* >() { return TYPE< String >(); }
  80. /// @name Marshalling
  81. ///
  82. /// Functions for converting to/from string-based data representations.
  83. ///
  84. /// @note This functionality is specific to the console interop.
  85. /// @{
  86. /// Marshal a single piece of data from native into client form.
  87. template< typename T >
  88. inline const char* EngineMarshallData( const T& value )
  89. {
  90. return castConsoleTypeToString( value );
  91. }
  92. inline const char* EngineMarshallData( bool value )
  93. {
  94. if( value )
  95. return "1";
  96. else
  97. return "0";
  98. }
  99. inline const char* EngineMarshallData( const char* str )
  100. {
  101. // The API assumes that if you pass a plain "const char*" through it, then you are referring
  102. // to string storage with non-local lifetime that can be safely passed to the control layer.
  103. return str;
  104. }
  105. template< typename T >
  106. inline const char* EngineMarshallData( T* object )
  107. {
  108. return ( object ? object->getIdString() : "0" );
  109. }
  110. template< typename T >
  111. inline const char* EngineMarshallData( const T* object )
  112. {
  113. return ( object ? object->getIdString() : "0" );
  114. }
  115. inline const char* EngineMarshallData( U32 value )
  116. {
  117. return EngineMarshallData( S32( value ) );
  118. }
  119. /// Marshal data from native into client form stored directly in
  120. /// client function invocation vector.
  121. template< typename T >
  122. inline void EngineMarshallData( const T& arg, S32& argc, ConsoleValueRef *argv )
  123. {
  124. argv[ argc ] = Con::getStringArg( castConsoleTypeToString( arg ) );
  125. argc ++;
  126. }
  127. inline void EngineMarshallData( bool arg, S32& argc, ConsoleValueRef *argv )
  128. {
  129. if( arg )
  130. argv[ argc ] = "1";
  131. else
  132. argv[ argc ] = "0";
  133. argc ++;
  134. }
  135. inline void EngineMarshallData( S32 arg, S32& argc, ConsoleValueRef *argv )
  136. {
  137. argv[ argc ] = arg;
  138. argc ++;
  139. }
  140. inline void EngineMarshallData( U32 arg, S32& argc, ConsoleValueRef *argv )
  141. {
  142. EngineMarshallData( S32( arg ), argc, argv );
  143. }
  144. inline void EngineMarshallData( F32 arg, S32& argc, ConsoleValueRef *argv )
  145. {
  146. argv[ argc ] = arg;
  147. argc ++;
  148. }
  149. inline void EngineMarshallData( const char* arg, S32& argc, ConsoleValueRef *argv )
  150. {
  151. argv[ argc ] = arg;
  152. argc ++;
  153. }
  154. template< typename T >
  155. inline void EngineMarshallData( T* object, S32& argc, ConsoleValueRef *argv )
  156. {
  157. argv[ argc ] = ( object ? object->getIdString() : "0" );
  158. argc ++;
  159. }
  160. template< typename T >
  161. inline void EngineMarshallData( const T* object, S32& argc, ConsoleValueRef *argv )
  162. {
  163. argv[ argc ] = ( object ? object->getIdString() : "0" );
  164. argc ++;
  165. }
  166. /// Unmarshal data from client form to engine form.
  167. ///
  168. /// This is wrapped in an a struct as partial specializations on function
  169. /// templates are not allowed in C++.
  170. template< typename T >
  171. struct EngineUnmarshallData
  172. {
  173. T operator()( const char* str ) const
  174. {
  175. T value;
  176. castConsoleTypeFromString( value, str );
  177. return value;
  178. }
  179. };
  180. template<>
  181. struct EngineUnmarshallData< S32 >
  182. {
  183. S32 operator()( ConsoleValueRef &ref ) const
  184. {
  185. return (S32)ref;
  186. }
  187. S32 operator()( const char* str ) const
  188. {
  189. return dAtoi( str );
  190. }
  191. };
  192. template<>
  193. struct EngineUnmarshallData< U32 >
  194. {
  195. U32 operator()( ConsoleValueRef &ref ) const
  196. {
  197. return (U32)((S32)ref);
  198. }
  199. U32 operator()( const char* str ) const
  200. {
  201. return dAtoui( str );
  202. }
  203. };
  204. template<>
  205. struct EngineUnmarshallData< F32 >
  206. {
  207. F32 operator()( ConsoleValueRef &ref ) const
  208. {
  209. return (F32)ref;
  210. }
  211. F32 operator()( const char* str ) const
  212. {
  213. return dAtof( str );
  214. }
  215. };
  216. template<>
  217. struct EngineUnmarshallData< U8 >
  218. {
  219. U8 operator()( ConsoleValueRef &ref ) const
  220. {
  221. return (U8)((S32)ref);
  222. }
  223. U8 operator()( const char* str ) const
  224. {
  225. return dAtoui( str );
  226. }
  227. };
  228. template<>
  229. struct EngineUnmarshallData< const char* >
  230. {
  231. const char* operator()( const char* str ) const
  232. {
  233. return str;
  234. }
  235. };
  236. template< typename T >
  237. struct EngineUnmarshallData< T* >
  238. {
  239. T* operator()( const char* str ) const
  240. {
  241. return dynamic_cast< T* >( Sim::findObject( str ) );
  242. }
  243. };
  244. template<>
  245. struct EngineUnmarshallData< void >
  246. {
  247. void operator()( const char* ) const {}
  248. };
  249. /// @}
  250. /// @name C to C++ Trampolines
  251. ///
  252. /// The trampolines serve two purposes:
  253. ///
  254. /// For one, they ensure that no matter what argument types are specified by users of the engine API macros, the correct
  255. /// argument value types are enforced on the functions exported by the engine. Let's say, for example, the user writes
  256. /// a function that takes a "Point3F direction" argument, then the template machinery here will automatically expose an
  257. /// API function that takes a "Point3F& direction" argument.
  258. ///
  259. /// Secondly, the templates jump the incoming calls from extern "C" space into C++ space. This is mostly relevant for
  260. /// methods only as they will need an implicit object type argument.
  261. ///
  262. /// @{
  263. // Helper type to factor out commonalities between function and method trampolines.
  264. template< typename T >
  265. struct _EngineTrampoline
  266. {
  267. struct Args {};
  268. };
  269. template< typename R, typename A >
  270. struct _EngineTrampoline< R( A ) >
  271. {
  272. struct Args
  273. {
  274. char data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) ];
  275. typename EngineTypeTraits< A >::ValueType a() const
  276. {
  277. return EngineTypeTraits< A >::ArgumentToValue(
  278. *( reinterpret_cast< const typename EngineTypeTraits< A >::ArgumentValueType* >( &data[ 0 ] ) ) );
  279. }
  280. };
  281. };
  282. template< typename R, typename A, typename B >
  283. struct _EngineTrampoline< R( A, B ) >
  284. {
  285. struct Args
  286. {
  287. char data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  288. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) ];
  289. typename EngineTypeTraits< A >::ValueType a() const
  290. {
  291. return EngineTypeTraits< A >::ArgumentToValue(
  292. *( reinterpret_cast< const typename EngineTypeTraits< A >::ArgumentValueType* >( &data[ 0 ] ) ) );
  293. }
  294. typename EngineTypeTraits< B >::ValueType b() const
  295. {
  296. return EngineTypeTraits< B >::ArgumentToValue(
  297. *( reinterpret_cast< const typename EngineTypeTraits< B >::ArgumentValueType* >
  298. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) ] ) ) );
  299. }
  300. };
  301. };
  302. template< typename R, typename A, typename B, typename C >
  303. struct _EngineTrampoline< R( A, B, C ) >
  304. {
  305. struct Args
  306. {
  307. char data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  308. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  309. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) ];
  310. typename EngineTypeTraits< A >::ValueType a() const
  311. {
  312. return EngineTypeTraits< A >::ArgumentToValue(
  313. *( reinterpret_cast< const typename EngineTypeTraits< A >::ArgumentValueType* >( &data[ 0 ] ) ) );
  314. }
  315. typename EngineTypeTraits< B >::ValueType b() const
  316. {
  317. return EngineTypeTraits< B >::ArgumentToValue(
  318. *( reinterpret_cast< const typename EngineTypeTraits< B >::ArgumentValueType* >
  319. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) ] ) ) );
  320. }
  321. typename EngineTypeTraits< C >::ValueType c() const
  322. {
  323. return EngineTypeTraits< C >::ArgumentToValue(
  324. *( reinterpret_cast< const typename EngineTypeTraits< C >::ArgumentValueType* >
  325. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  326. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) ] ) ) );
  327. }
  328. };
  329. };
  330. template< typename R, typename A, typename B, typename C, typename D >
  331. struct _EngineTrampoline< R( A, B, C, D ) >
  332. {
  333. struct Args
  334. {
  335. char data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  336. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  337. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  338. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) ];
  339. typename EngineTypeTraits< A >::ValueType a() const
  340. {
  341. return EngineTypeTraits< A >::ArgumentToValue(
  342. *( reinterpret_cast< const typename EngineTypeTraits< A >::ArgumentValueType* >( &data[ 0 ] ) ) );
  343. }
  344. typename EngineTypeTraits< B >::ValueType b() const
  345. {
  346. return EngineTypeTraits< B >::ArgumentToValue(
  347. *( reinterpret_cast< const typename EngineTypeTraits< B >::ArgumentValueType* >
  348. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) ] ) ) );
  349. }
  350. typename EngineTypeTraits< C >::ValueType c() const
  351. {
  352. return EngineTypeTraits< C >::ArgumentToValue(
  353. *( reinterpret_cast< const typename EngineTypeTraits< C >::ArgumentValueType* >
  354. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  355. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) ] ) ) );
  356. }
  357. typename EngineTypeTraits< D >::ValueType d() const
  358. {
  359. return EngineTypeTraits< D >::ArgumentToValue(
  360. *( reinterpret_cast< const typename EngineTypeTraits< D >::ArgumentValueType* >
  361. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  362. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  363. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) ] ) ) );
  364. }
  365. };
  366. };
  367. template< typename R, typename A, typename B, typename C, typename D, typename E >
  368. struct _EngineTrampoline< R( A, B, C, D, E ) >
  369. {
  370. struct Args
  371. {
  372. char data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  373. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  374. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  375. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) +
  376. sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) ];
  377. typename EngineTypeTraits< A >::ValueType a() const
  378. {
  379. return EngineTypeTraits< A >::ArgumentToValue(
  380. *( reinterpret_cast< const typename EngineTypeTraits< A >::ArgumentValueType* >( &data[ 0 ] ) ) );
  381. }
  382. typename EngineTypeTraits< B >::ValueType b() const
  383. {
  384. return EngineTypeTraits< B >::ArgumentToValue(
  385. *( reinterpret_cast< const typename EngineTypeTraits< B >::ArgumentValueType* >
  386. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) ] ) ) );
  387. }
  388. typename EngineTypeTraits< C >::ValueType c() const
  389. {
  390. return EngineTypeTraits< C >::ArgumentToValue(
  391. *( reinterpret_cast< const typename EngineTypeTraits< C >::ArgumentValueType* >
  392. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  393. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) ] ) ) );
  394. }
  395. typename EngineTypeTraits< D >::ValueType d() const
  396. {
  397. return EngineTypeTraits< D >::ArgumentToValue(
  398. *( reinterpret_cast< const typename EngineTypeTraits< D >::ArgumentValueType* >
  399. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  400. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  401. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) ] ) ) );
  402. }
  403. typename EngineTypeTraits< E >::ValueType e() const
  404. {
  405. return EngineTypeTraits< E >::ArgumentToValue(
  406. *( reinterpret_cast< const typename EngineTypeTraits< E >::ArgumentValueType* >
  407. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  408. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  409. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  410. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) ] ) ) );
  411. }
  412. };
  413. };
  414. template< typename R, typename A, typename B, typename C, typename D, typename E, typename F >
  415. struct _EngineTrampoline< R( A, B, C, D, E, F ) >
  416. {
  417. struct Args
  418. {
  419. char data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  420. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  421. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  422. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) +
  423. sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) +
  424. sizeof( typename EngineTypeTraits< F >::ArgumentValueType ) ];
  425. typename EngineTypeTraits< A >::ValueType a() const
  426. {
  427. return EngineTypeTraits< A >::ArgumentToValue(
  428. *( reinterpret_cast< const typename EngineTypeTraits< A >::ArgumentValueType* >( &data[ 0 ] ) ) );
  429. }
  430. typename EngineTypeTraits< B >::ValueType b() const
  431. {
  432. return EngineTypeTraits< B >::ArgumentToValue(
  433. *( reinterpret_cast< const typename EngineTypeTraits< B >::ArgumentValueType* >
  434. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) ] ) ) );
  435. }
  436. typename EngineTypeTraits< C >::ValueType c() const
  437. {
  438. return EngineTypeTraits< C >::ArgumentToValue(
  439. *( reinterpret_cast< const typename EngineTypeTraits< C >::ArgumentValueType* >
  440. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  441. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) ] ) ) );
  442. }
  443. typename EngineTypeTraits< D >::ValueType d() const
  444. {
  445. return EngineTypeTraits< D >::ArgumentToValue(
  446. *( reinterpret_cast< const typename EngineTypeTraits< D >::ArgumentValueType* >
  447. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  448. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  449. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) ] ) ) );
  450. }
  451. typename EngineTypeTraits< E >::ValueType e() const
  452. {
  453. return EngineTypeTraits< E >::ArgumentToValue(
  454. *( reinterpret_cast< const typename EngineTypeTraits< E >::ArgumentValueType* >
  455. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  456. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  457. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  458. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) ] ) ) );
  459. }
  460. typename EngineTypeTraits< F >::ValueType f() const
  461. {
  462. return EngineTypeTraits< F >::ArgumentToValue(
  463. *( reinterpret_cast< const typename EngineTypeTraits< F >::ArgumentValueType* >
  464. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  465. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  466. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  467. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) +
  468. sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) ] ) ) );
  469. }
  470. };
  471. };
  472. template< typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G >
  473. struct _EngineTrampoline< R( A, B, C, D, E, F, G ) >
  474. {
  475. struct Args
  476. {
  477. char data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  478. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  479. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  480. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) +
  481. sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) +
  482. sizeof( typename EngineTypeTraits< F >::ArgumentValueType ) +
  483. sizeof( typename EngineTypeTraits< G >::ArgumentValueType ) ];
  484. typename EngineTypeTraits< A >::ValueType a() const
  485. {
  486. return EngineTypeTraits< A >::ArgumentToValue(
  487. *( reinterpret_cast< const typename EngineTypeTraits< A >::ArgumentValueType* >( &data[ 0 ] ) ) );
  488. }
  489. typename EngineTypeTraits< B >::ValueType b() const
  490. {
  491. return EngineTypeTraits< B >::ArgumentToValue(
  492. *( reinterpret_cast< const typename EngineTypeTraits< B >::ArgumentValueType* >
  493. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) ] ) ) );
  494. }
  495. typename EngineTypeTraits< C >::ValueType c() const
  496. {
  497. return EngineTypeTraits< C >::ArgumentToValue(
  498. *( reinterpret_cast< const typename EngineTypeTraits< C >::ArgumentValueType* >
  499. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  500. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) ] ) ) );
  501. }
  502. typename EngineTypeTraits< D >::ValueType d() const
  503. {
  504. return EngineTypeTraits< D >::ArgumentToValue(
  505. *( reinterpret_cast< const typename EngineTypeTraits< D >::ArgumentValueType* >
  506. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  507. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  508. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) ] ) ) );
  509. }
  510. typename EngineTypeTraits< E >::ValueType e() const
  511. {
  512. return EngineTypeTraits< E >::ArgumentToValue(
  513. *( reinterpret_cast< const typename EngineTypeTraits< E >::ArgumentValueType* >
  514. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  515. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  516. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  517. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) ] ) ) );
  518. }
  519. typename EngineTypeTraits< F >::ValueType f() const
  520. {
  521. return EngineTypeTraits< F >::ArgumentToValue(
  522. *( reinterpret_cast< const typename EngineTypeTraits< F >::ArgumentValueType* >
  523. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  524. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  525. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  526. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) +
  527. sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) ] ) ) );
  528. }
  529. typename EngineTypeTraits< G >::ValueType g() const
  530. {
  531. return EngineTypeTraits< G >::ArgumentToValue(
  532. *( reinterpret_cast< const typename EngineTypeTraits< G >::ArgumentValueType* >
  533. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  534. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  535. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  536. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) +
  537. sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) +
  538. sizeof( typename EngineTypeTraits< F >::ArgumentValueType ) ] ) ) );
  539. }
  540. };
  541. };
  542. template< typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H >
  543. struct _EngineTrampoline< R( A, B, C, D, E, F, G, H ) >
  544. {
  545. struct Args
  546. {
  547. char data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  548. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  549. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  550. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) +
  551. sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) +
  552. sizeof( typename EngineTypeTraits< F >::ArgumentValueType ) +
  553. sizeof( typename EngineTypeTraits< G >::ArgumentValueType ) +
  554. sizeof( typename EngineTypeTraits< H >::ArgumentValueType ) ];
  555. typename EngineTypeTraits< A >::ValueType a() const
  556. {
  557. return EngineTypeTraits< A >::ArgumentToValue(
  558. *( reinterpret_cast< const typename EngineTypeTraits< A >::ArgumentValueType* >( &data[ 0 ] ) ) );
  559. }
  560. typename EngineTypeTraits< B >::ValueType b() const
  561. {
  562. return EngineTypeTraits< B >::ArgumentToValue(
  563. *( reinterpret_cast< const typename EngineTypeTraits< B >::ArgumentValueType* >
  564. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) ] ) ) );
  565. }
  566. typename EngineTypeTraits< C >::ValueType c() const
  567. {
  568. return EngineTypeTraits< C >::ArgumentToValue(
  569. *( reinterpret_cast< const typename EngineTypeTraits< C >::ArgumentValueType* >
  570. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  571. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) ] ) ) );
  572. }
  573. typename EngineTypeTraits< D >::ValueType d() const
  574. {
  575. return EngineTypeTraits< D >::ArgumentToValue(
  576. *( reinterpret_cast< const typename EngineTypeTraits< D >::ArgumentValueType* >
  577. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  578. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  579. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) ] ) ) );
  580. }
  581. typename EngineTypeTraits< E >::ValueType e() const
  582. {
  583. return EngineTypeTraits< E >::ArgumentToValue(
  584. *( reinterpret_cast< const typename EngineTypeTraits< E >::ArgumentValueType* >
  585. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  586. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  587. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  588. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) ] ) ) );
  589. }
  590. typename EngineTypeTraits< F >::ValueType f() const
  591. {
  592. return EngineTypeTraits< F >::ArgumentToValue(
  593. *( reinterpret_cast< const typename EngineTypeTraits< F >::ArgumentValueType* >
  594. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  595. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  596. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  597. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) +
  598. sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) ] ) ) );
  599. }
  600. typename EngineTypeTraits< G >::ValueType g() const
  601. {
  602. return EngineTypeTraits< G >::ArgumentToValue(
  603. *( reinterpret_cast< const typename EngineTypeTraits< G >::ArgumentValueType* >
  604. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  605. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  606. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  607. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) +
  608. sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) +
  609. sizeof( typename EngineTypeTraits< F >::ArgumentValueType ) ] ) ) );
  610. }
  611. typename EngineTypeTraits< H >::ValueType h() const
  612. {
  613. return EngineTypeTraits< H >::ArgumentToValue(
  614. *( reinterpret_cast< const typename EngineTypeTraits< H >::ArgumentValueType* >
  615. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  616. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  617. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  618. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) +
  619. sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) +
  620. sizeof( typename EngineTypeTraits< F >::ArgumentValueType ) +
  621. sizeof( typename EngineTypeTraits< G >::ArgumentValueType ) ] ) ) );
  622. }
  623. };
  624. };
  625. template< typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I >
  626. struct _EngineTrampoline< R( A, B, C, D, E, F, G, H, I ) >
  627. {
  628. struct Args
  629. {
  630. char data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  631. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  632. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  633. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) +
  634. sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) +
  635. sizeof( typename EngineTypeTraits< F >::ArgumentValueType ) +
  636. sizeof( typename EngineTypeTraits< G >::ArgumentValueType ) +
  637. sizeof( typename EngineTypeTraits< H >::ArgumentValueType ) +
  638. sizeof( typename EngineTypeTraits< I >::ArgumentValueType ) ];
  639. typename EngineTypeTraits< A >::ValueType a() const
  640. {
  641. return EngineTypeTraits< A >::ArgumentToValue(
  642. *( reinterpret_cast< const typename EngineTypeTraits< A >::ArgumentValueType* >( &data[ 0 ] ) ) );
  643. }
  644. typename EngineTypeTraits< B >::ValueType b() const
  645. {
  646. return EngineTypeTraits< B >::ArgumentToValue(
  647. *( reinterpret_cast< const typename EngineTypeTraits< B >::ArgumentValueType* >
  648. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) ] ) ) );
  649. }
  650. typename EngineTypeTraits< C >::ValueType c() const
  651. {
  652. return EngineTypeTraits< C >::ArgumentToValue(
  653. *( reinterpret_cast< const typename EngineTypeTraits< C >::ArgumentValueType* >
  654. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  655. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) ] ) ) );
  656. }
  657. typename EngineTypeTraits< D >::ValueType d() const
  658. {
  659. return EngineTypeTraits< D >::ArgumentToValue(
  660. *( reinterpret_cast< const typename EngineTypeTraits< D >::ArgumentValueType* >
  661. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  662. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  663. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) ] ) ) );
  664. }
  665. typename EngineTypeTraits< E >::ValueType e() const
  666. {
  667. return EngineTypeTraits< E >::ArgumentToValue(
  668. *( reinterpret_cast< const typename EngineTypeTraits< E >::ArgumentValueType* >
  669. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  670. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  671. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  672. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) ] ) ) );
  673. }
  674. typename EngineTypeTraits< F >::ValueType f() const
  675. {
  676. return EngineTypeTraits< F >::ArgumentToValue(
  677. *( reinterpret_cast< const typename EngineTypeTraits< F >::ArgumentValueType* >
  678. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  679. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  680. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  681. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) +
  682. sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) ] ) ) );
  683. }
  684. typename EngineTypeTraits< G >::ValueType g() const
  685. {
  686. return EngineTypeTraits< G >::ArgumentToValue(
  687. *( reinterpret_cast< const typename EngineTypeTraits< G >::ArgumentValueType* >
  688. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  689. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  690. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  691. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) +
  692. sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) +
  693. sizeof( typename EngineTypeTraits< F >::ArgumentValueType ) ] ) ) );
  694. }
  695. typename EngineTypeTraits< H >::ValueType h() const
  696. {
  697. return EngineTypeTraits< H >::ArgumentToValue(
  698. *( reinterpret_cast< const typename EngineTypeTraits< H >::ArgumentValueType* >
  699. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  700. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  701. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  702. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) +
  703. sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) +
  704. sizeof( typename EngineTypeTraits< F >::ArgumentValueType ) +
  705. sizeof( typename EngineTypeTraits< G >::ArgumentValueType ) ] ) ) );
  706. }
  707. typename EngineTypeTraits< I >::ValueType i() const
  708. {
  709. return EngineTypeTraits< I >::ArgumentToValue(
  710. *( reinterpret_cast< const typename EngineTypeTraits< I >::ArgumentValueType* >
  711. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  712. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  713. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  714. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) +
  715. sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) +
  716. sizeof( typename EngineTypeTraits< F >::ArgumentValueType ) +
  717. sizeof( typename EngineTypeTraits< G >::ArgumentValueType ) +
  718. sizeof( typename EngineTypeTraits< H >::ArgumentValueType ) ] ) ) );
  719. }
  720. };
  721. };
  722. template< typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I, typename J >
  723. struct _EngineTrampoline< R( A, B, C, D, E, F, G, H, I, J ) >
  724. {
  725. struct Args
  726. {
  727. char data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  728. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  729. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  730. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) +
  731. sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) +
  732. sizeof( typename EngineTypeTraits< F >::ArgumentValueType ) +
  733. sizeof( typename EngineTypeTraits< G >::ArgumentValueType ) +
  734. sizeof( typename EngineTypeTraits< H >::ArgumentValueType ) +
  735. sizeof( typename EngineTypeTraits< I >::ArgumentValueType ) +
  736. sizeof( typename EngineTypeTraits< J >::ArgumentValueType ) ];
  737. typename EngineTypeTraits< A >::ValueType a() const
  738. {
  739. return EngineTypeTraits< A >::ArgumentToValue(
  740. *( reinterpret_cast< const typename EngineTypeTraits< A >::ArgumentValueType* >( &data[ 0 ] ) ) );
  741. }
  742. typename EngineTypeTraits< B >::ValueType b() const
  743. {
  744. return EngineTypeTraits< B >::ArgumentToValue(
  745. *( reinterpret_cast< const typename EngineTypeTraits< B >::ArgumentValueType* >
  746. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) ] ) ) );
  747. }
  748. typename EngineTypeTraits< C >::ValueType c() const
  749. {
  750. return EngineTypeTraits< C >::ArgumentToValue(
  751. *( reinterpret_cast< const typename EngineTypeTraits< C >::ArgumentValueType* >
  752. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  753. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) ] ) ) );
  754. }
  755. typename EngineTypeTraits< D >::ValueType d() const
  756. {
  757. return EngineTypeTraits< D >::ArgumentToValue(
  758. *( reinterpret_cast< const typename EngineTypeTraits< D >::ArgumentValueType* >
  759. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  760. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  761. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) ] ) ) );
  762. }
  763. typename EngineTypeTraits< E >::ValueType e() const
  764. {
  765. return EngineTypeTraits< E >::ArgumentToValue(
  766. *( reinterpret_cast< const typename EngineTypeTraits< E >::ArgumentValueType* >
  767. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  768. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  769. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  770. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) ] ) ) );
  771. }
  772. typename EngineTypeTraits< F >::ValueType f() const
  773. {
  774. return EngineTypeTraits< F >::ArgumentToValue(
  775. *( reinterpret_cast< const typename EngineTypeTraits< F >::ArgumentValueType* >
  776. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  777. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  778. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  779. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) +
  780. sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) ] ) ) );
  781. }
  782. typename EngineTypeTraits< G >::ValueType g() const
  783. {
  784. return EngineTypeTraits< G >::ArgumentToValue(
  785. *( reinterpret_cast< const typename EngineTypeTraits< G >::ArgumentValueType* >
  786. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  787. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  788. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  789. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) +
  790. sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) +
  791. sizeof( typename EngineTypeTraits< F >::ArgumentValueType ) ] ) ) );
  792. }
  793. typename EngineTypeTraits< H >::ValueType h() const
  794. {
  795. return EngineTypeTraits< H >::ArgumentToValue(
  796. *( reinterpret_cast< const typename EngineTypeTraits< H >::ArgumentValueType* >
  797. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  798. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  799. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  800. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) +
  801. sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) +
  802. sizeof( typename EngineTypeTraits< F >::ArgumentValueType ) +
  803. sizeof( typename EngineTypeTraits< G >::ArgumentValueType ) ] ) ) );
  804. }
  805. typename EngineTypeTraits< I >::ValueType i() const
  806. {
  807. return EngineTypeTraits< I >::ArgumentToValue(
  808. *( reinterpret_cast< const typename EngineTypeTraits< I >::ArgumentValueType* >
  809. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  810. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  811. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  812. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) +
  813. sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) +
  814. sizeof( typename EngineTypeTraits< F >::ArgumentValueType ) +
  815. sizeof( typename EngineTypeTraits< G >::ArgumentValueType ) +
  816. sizeof( typename EngineTypeTraits< H >::ArgumentValueType ) ] ) ) );
  817. }
  818. typename EngineTypeTraits< J >::ValueType j() const
  819. {
  820. return EngineTypeTraits< J >::ArgumentToValue(
  821. *( reinterpret_cast< const typename EngineTypeTraits< J >::ArgumentValueType* >
  822. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  823. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  824. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  825. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) +
  826. sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) +
  827. sizeof( typename EngineTypeTraits< F >::ArgumentValueType ) +
  828. sizeof( typename EngineTypeTraits< G >::ArgumentValueType ) +
  829. sizeof( typename EngineTypeTraits< H >::ArgumentValueType ) +
  830. sizeof( typename EngineTypeTraits< I >::ArgumentValueType ) ] ) ) );
  831. }
  832. };
  833. };
  834. template< typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I, typename J, typename K >
  835. struct _EngineTrampoline< R( A, B, C, D, E, F, G, H, I, J, K ) >
  836. {
  837. struct Args
  838. {
  839. char data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  840. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  841. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  842. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) +
  843. sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) +
  844. sizeof( typename EngineTypeTraits< F >::ArgumentValueType ) +
  845. sizeof( typename EngineTypeTraits< G >::ArgumentValueType ) +
  846. sizeof( typename EngineTypeTraits< H >::ArgumentValueType ) +
  847. sizeof( typename EngineTypeTraits< I >::ArgumentValueType ) +
  848. sizeof( typename EngineTypeTraits< J >::ArgumentValueType ) +
  849. sizeof( typename EngineTypeTraits< K >::ArgumentValueType ) ];
  850. typename EngineTypeTraits< A >::ValueType a() const
  851. {
  852. return EngineTypeTraits< A >::ArgumentToValue(
  853. *( reinterpret_cast< const typename EngineTypeTraits< A >::ArgumentValueType* >( &data[ 0 ] ) ) );
  854. }
  855. typename EngineTypeTraits< B >::ValueType b() const
  856. {
  857. return EngineTypeTraits< B >::ArgumentToValue(
  858. *( reinterpret_cast< const typename EngineTypeTraits< B >::ArgumentValueType* >
  859. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) ] ) ) );
  860. }
  861. typename EngineTypeTraits< C >::ValueType c() const
  862. {
  863. return EngineTypeTraits< C >::ArgumentToValue(
  864. *( reinterpret_cast< const typename EngineTypeTraits< C >::ArgumentValueType* >
  865. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  866. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) ] ) ) );
  867. }
  868. typename EngineTypeTraits< D >::ValueType d() const
  869. {
  870. return EngineTypeTraits< D >::ArgumentToValue(
  871. *( reinterpret_cast< const typename EngineTypeTraits< D >::ArgumentValueType* >
  872. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  873. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  874. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) ] ) ) );
  875. }
  876. typename EngineTypeTraits< E >::ValueType e() const
  877. {
  878. return EngineTypeTraits< E >::ArgumentToValue(
  879. *( reinterpret_cast< const typename EngineTypeTraits< E >::ArgumentValueType* >
  880. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  881. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  882. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  883. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) ] ) ) );
  884. }
  885. typename EngineTypeTraits< F >::ValueType f() const
  886. {
  887. return EngineTypeTraits< F >::ArgumentToValue(
  888. *( reinterpret_cast< const typename EngineTypeTraits< F >::ArgumentValueType* >
  889. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  890. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  891. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  892. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) +
  893. sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) ] ) ) );
  894. }
  895. typename EngineTypeTraits< G >::ValueType g() const
  896. {
  897. return EngineTypeTraits< G >::ArgumentToValue(
  898. *( reinterpret_cast< const typename EngineTypeTraits< G >::ArgumentValueType* >
  899. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  900. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  901. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  902. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) +
  903. sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) +
  904. sizeof( typename EngineTypeTraits< F >::ArgumentValueType ) ] ) ) );
  905. }
  906. typename EngineTypeTraits< H >::ValueType h() const
  907. {
  908. return EngineTypeTraits< H >::ArgumentToValue(
  909. *( reinterpret_cast< const typename EngineTypeTraits< H >::ArgumentValueType* >
  910. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  911. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  912. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  913. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) +
  914. sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) +
  915. sizeof( typename EngineTypeTraits< F >::ArgumentValueType ) +
  916. sizeof( typename EngineTypeTraits< G >::ArgumentValueType ) ] ) ) );
  917. }
  918. typename EngineTypeTraits< I >::ValueType i() const
  919. {
  920. return EngineTypeTraits< I >::ArgumentToValue(
  921. *( reinterpret_cast< const typename EngineTypeTraits< I >::ArgumentValueType* >
  922. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  923. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  924. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  925. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) +
  926. sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) +
  927. sizeof( typename EngineTypeTraits< F >::ArgumentValueType ) +
  928. sizeof( typename EngineTypeTraits< G >::ArgumentValueType ) +
  929. sizeof( typename EngineTypeTraits< H >::ArgumentValueType ) ] ) ) );
  930. }
  931. typename EngineTypeTraits< J >::ValueType j() const
  932. {
  933. return EngineTypeTraits< J >::ArgumentToValue(
  934. *( reinterpret_cast< const typename EngineTypeTraits< J >::ArgumentValueType* >
  935. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  936. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  937. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  938. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) +
  939. sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) +
  940. sizeof( typename EngineTypeTraits< F >::ArgumentValueType ) +
  941. sizeof( typename EngineTypeTraits< G >::ArgumentValueType ) +
  942. sizeof( typename EngineTypeTraits< H >::ArgumentValueType ) +
  943. sizeof( typename EngineTypeTraits< I >::ArgumentValueType ) ] ) ) );
  944. }
  945. typename EngineTypeTraits< K >::ValueType k() const
  946. {
  947. return EngineTypeTraits< K >::ArgumentToValue(
  948. *( reinterpret_cast< const typename EngineTypeTraits< K >::ArgumentValueType* >
  949. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  950. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  951. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  952. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) +
  953. sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) +
  954. sizeof( typename EngineTypeTraits< F >::ArgumentValueType ) +
  955. sizeof( typename EngineTypeTraits< G >::ArgumentValueType ) +
  956. sizeof( typename EngineTypeTraits< H >::ArgumentValueType ) +
  957. sizeof( typename EngineTypeTraits< I >::ArgumentValueType ) +
  958. sizeof( typename EngineTypeTraits< J >::ArgumentValueType ) ] ) ) );
  959. }
  960. };
  961. };
  962. template< typename T >
  963. struct _EngineFunctionTrampolineBase : public _EngineTrampoline< T >
  964. {
  965. typedef T FunctionType;
  966. };
  967. // Trampolines for any call-ins that aren't methods.
  968. template< typename T >
  969. struct _EngineFunctionTrampoline {};
  970. template< typename R >
  971. struct _EngineFunctionTrampoline< R() > : public _EngineFunctionTrampolineBase< R() >
  972. {
  973. static R jmp( R ( *fn )(), const typename _EngineFunctionTrampolineBase< R() >::Args& args )
  974. {
  975. return R( fn() );
  976. }
  977. };
  978. template< typename R, typename A >
  979. struct _EngineFunctionTrampoline< R( A ) > : public _EngineFunctionTrampolineBase< R( A ) >
  980. {
  981. static R jmp( R ( *fn )( A ), const typename _EngineFunctionTrampolineBase< R( A ) >::Args& args )
  982. {
  983. return R( fn( args.a() ) );
  984. }
  985. };
  986. template< typename R, typename A, typename B >
  987. struct _EngineFunctionTrampoline< R( A, B ) > : public _EngineFunctionTrampolineBase< R( A, B ) >
  988. {
  989. static R jmp( R ( *fn )( A, B ), const typename _EngineFunctionTrampolineBase< R( A, B ) >::Args& args )
  990. {
  991. return R( fn( args.a(), args.b() ) );
  992. }
  993. };
  994. template< typename R, typename A, typename B, typename C >
  995. struct _EngineFunctionTrampoline< R( A, B, C ) > : public _EngineFunctionTrampolineBase< R( A, B, C ) >
  996. {
  997. static R jmp( R ( *fn )( A, B, C ), const typename _EngineFunctionTrampolineBase< R( A, B, C ) >::Args& args )
  998. {
  999. return R( fn( args.a(), args.b(), args.c() ) );
  1000. }
  1001. };
  1002. template< typename R, typename A, typename B, typename C, typename D >
  1003. struct _EngineFunctionTrampoline< R( A, B, C, D ) > : public _EngineFunctionTrampolineBase< R( A, B, C, D ) >
  1004. {
  1005. static R jmp( R ( *fn )( A, B, C, D ), const typename _EngineFunctionTrampolineBase< R( A, B, C, D ) >::Args& args )
  1006. {
  1007. return R( fn( args.a(), args.b(), args.c(), args.d() ) );
  1008. }
  1009. };
  1010. template< typename R, typename A, typename B, typename C, typename D, typename E >
  1011. struct _EngineFunctionTrampoline< R( A, B, C, D, E ) > : public _EngineFunctionTrampolineBase< R( A, B, C, D, E ) >
  1012. {
  1013. static R jmp( R ( *fn )( A, B, C, D, E ), const typename _EngineFunctionTrampolineBase< R( A, B, C, D, E ) >::Args& args )
  1014. {
  1015. return R( fn( args.a(), args.b(), args.c(), args.d(), args.e() ) );
  1016. }
  1017. };
  1018. template< typename R, typename A, typename B, typename C, typename D, typename E, typename F >
  1019. struct _EngineFunctionTrampoline< R( A, B, C, D, E, F ) > : public _EngineFunctionTrampolineBase< R( A, B, C, D, E, F ) >
  1020. {
  1021. static R jmp( R ( *fn )( A, B, C, D, E, F ), const typename _EngineFunctionTrampolineBase< R( A, B, C, D, E, F ) >::Args& args )
  1022. {
  1023. return R( fn( args.a(), args.b(), args.c(), args.d(), args.e(), args.f() ) );
  1024. }
  1025. };
  1026. template< typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G >
  1027. struct _EngineFunctionTrampoline< R( A, B, C, D, E, F, G ) > : public _EngineFunctionTrampolineBase< R( A, B, C, D, E, F, G ) >
  1028. {
  1029. static R jmp( R ( *fn )( A, B, C, D, E, F, G ), const typename _EngineFunctionTrampolineBase< R( A, B, C, D, E, F, G ) >::Args& args )
  1030. {
  1031. return R( fn( args.a(), args.b(), args.c(), args.d(), args.e(), args.f(), args.g() ) );
  1032. }
  1033. };
  1034. template< typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H >
  1035. struct _EngineFunctionTrampoline< R( A, B, C, D, E, F, G, H ) > : public _EngineFunctionTrampolineBase< R( A, B, C, D, E, F, G, H ) >
  1036. {
  1037. static R jmp( R ( *fn )( A, B, C, D, E, F, G, H ), const typename _EngineFunctionTrampolineBase< R( A, B, C, D, E, F, G, H ) >::Args& args )
  1038. {
  1039. return R( fn( args.a(), args.b(), args.c(), args.d(), args.e(), args.f(), args.g(), args.h() ) );
  1040. }
  1041. };
  1042. template< typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I >
  1043. struct _EngineFunctionTrampoline< R( A, B, C, D, E, F, G, H, I ) > : public _EngineFunctionTrampolineBase< R( A, B, C, D, E, F, G, H, I ) >
  1044. {
  1045. static R jmp( R ( *fn )( A, B, C, D, E, F, G, H, I ), const typename _EngineFunctionTrampolineBase< R( A, B, C, D, E, F, G, H, I ) >::Args& args )
  1046. {
  1047. return R( fn( args.a(), args.b(), args.c(), args.d(), args.e(), args.f(), args.g(), args.h(), args.i() ) );
  1048. }
  1049. };
  1050. template< typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I, typename J >
  1051. struct _EngineFunctionTrampoline< R( A, B, C, D, E, F, G, H, I, J ) > : public _EngineFunctionTrampolineBase< R( A, B, C, D, E, F, G, H, I, J ) >
  1052. {
  1053. static R jmp( R ( *fn )( A, B, C, D, E, F, G, H, I, J ), const typename _EngineFunctionTrampolineBase< R( A, B, C, D, E, F, G, H, I, J ) >::Args& args )
  1054. {
  1055. return R( fn( args.a(), args.b(), args.c(), args.d(), args.e(), args.f(), args.g(), args.h(), args.i(), args.j() ) );
  1056. }
  1057. };
  1058. template< typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I, typename J, typename K >
  1059. struct _EngineFunctionTrampoline< R( A, B, C, D, E, F, G, H, I, J, K ) > : public _EngineFunctionTrampolineBase< R( A, B, C, D, E, F, G, H, I, J, K ) >
  1060. {
  1061. static R jmp( R ( *fn )( A, B, C, D, E, F, G, H, I, J, K ), const typename _EngineFunctionTrampolineBase< R( A, B, C, D, E, F, G, H, I, J, K ) >::Args& args )
  1062. {
  1063. return R( fn( args.a(), args.b(), args.c(), args.d(), args.e(), args.f(), args.g(), args.h(), args.i(), args.j(), args.k() ) );
  1064. }
  1065. };
  1066. template< typename T >
  1067. struct _EngineMethodTrampolineBase : public _EngineTrampoline< T > {};
  1068. template< typename Frame, typename T >
  1069. struct _EngineMethodTrampoline {};
  1070. template< typename Frame, typename R >
  1071. struct _EngineMethodTrampoline< Frame, R() > : public _EngineMethodTrampolineBase< R() >
  1072. {
  1073. typedef R( FunctionType )( typename Frame::ObjectType* );
  1074. static R jmp( typename Frame::ObjectType* object, const typename _EngineFunctionTrampolineBase< R() >::Args& args )
  1075. {
  1076. Frame f;
  1077. f.object = object;
  1078. return R( f._exec() );
  1079. }
  1080. };
  1081. template< typename Frame, typename R, typename A >
  1082. struct _EngineMethodTrampoline< Frame, R( A ) > : public _EngineMethodTrampolineBase< R( A ) >
  1083. {
  1084. typedef R( FunctionType )( typename Frame::ObjectType*, A );
  1085. static R jmp( typename Frame::ObjectType* object, const typename _EngineFunctionTrampolineBase< R( A ) >::Args& args )
  1086. {
  1087. Frame f;
  1088. f.object = object;
  1089. return R( f._exec( args.a() ) );
  1090. }
  1091. };
  1092. template< typename Frame, typename R, typename A, typename B >
  1093. struct _EngineMethodTrampoline< Frame, R( A, B ) > : public _EngineMethodTrampolineBase< R( A, B ) >
  1094. {
  1095. typedef R( FunctionType )( typename Frame::ObjectType*, A, B );
  1096. static R jmp( typename Frame::ObjectType* object, const typename _EngineFunctionTrampolineBase< R( A, B ) >::Args& args )
  1097. {
  1098. Frame f;
  1099. f.object = object;
  1100. return R( f._exec( args.a(), args.b() ) );
  1101. }
  1102. };
  1103. template< typename Frame, typename R, typename A, typename B, typename C >
  1104. struct _EngineMethodTrampoline< Frame, R( A, B, C ) > : public _EngineMethodTrampolineBase< R( A, B, C ) >
  1105. {
  1106. typedef R( FunctionType )( typename Frame::ObjectType*, A, B, C );
  1107. static R jmp( typename Frame::ObjectType* object, const typename _EngineFunctionTrampolineBase< R( A, B, C ) >::Args& args )
  1108. {
  1109. Frame f;
  1110. f.object = object;
  1111. return R( f._exec( args.a(), args.b(), args.c() ) );
  1112. }
  1113. };
  1114. template< typename Frame, typename R, typename A, typename B, typename C, typename D >
  1115. struct _EngineMethodTrampoline< Frame, R( A, B, C, D ) > : public _EngineMethodTrampolineBase< R( A, B, C, D ) >
  1116. {
  1117. typedef R( FunctionType )( typename Frame::ObjectType*, A, B, C, D );
  1118. static R jmp( typename Frame::ObjectType* object, const typename _EngineFunctionTrampolineBase< R( A, B, C, D ) >::Args& args )
  1119. {
  1120. Frame f;
  1121. f.object = object;
  1122. return R( f._exec( args.a(), args.b(), args.c(), args.d() ) );
  1123. }
  1124. };
  1125. template< typename Frame, typename R, typename A, typename B, typename C, typename D, typename E >
  1126. struct _EngineMethodTrampoline< Frame, R( A, B, C, D, E ) > : public _EngineMethodTrampolineBase< R( A, B, C, D, E ) >
  1127. {
  1128. typedef R( FunctionType )( typename Frame::ObjectType*, A, B, C, D, E );
  1129. static R jmp( typename Frame::ObjectType* object, const typename _EngineFunctionTrampolineBase< R( A, B, C, D, E ) >::Args& args )
  1130. {
  1131. Frame f;
  1132. f.object = object;
  1133. return R( f._exec( args.a(), args.b(), args.c(), args.d(), args.e() ) );
  1134. }
  1135. };
  1136. template< typename Frame, typename R, typename A, typename B, typename C, typename D, typename E, typename F >
  1137. struct _EngineMethodTrampoline< Frame, R( A, B, C, D, E, F ) > : public _EngineMethodTrampolineBase< R( A, B, C, D, E, F ) >
  1138. {
  1139. typedef R( FunctionType )( typename Frame::ObjectType*, A, B, C, D, E, F );
  1140. static R jmp( typename Frame::ObjectType* object, const typename _EngineFunctionTrampolineBase< R( A, B, C, D, E, F ) >::Args& args )
  1141. {
  1142. Frame f;
  1143. f.object = object;
  1144. return R( f._exec( args.a(), args.b(), args.c(), args.d(), args.e(), args.f() ) );
  1145. }
  1146. };
  1147. template< typename Frame, typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G >
  1148. struct _EngineMethodTrampoline< Frame, R( A, B, C, D, E, F, G ) > : public _EngineMethodTrampolineBase< R( A, B, C, D, E, F, G ) >
  1149. {
  1150. typedef R( FunctionType )( typename Frame::ObjectType*, A, B, C, D, E, F, G );
  1151. static R jmp( typename Frame::ObjectType* object, const typename _EngineFunctionTrampolineBase< R( A, B, C, D, E, F, G ) >::Args& args )
  1152. {
  1153. Frame f;
  1154. f.object = object;
  1155. return R( f._exec( args.a(), args.b(), args.c(), args.d(), args.e(), args.f(), args.g() ) );
  1156. }
  1157. };
  1158. template< typename Frame, typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H >
  1159. struct _EngineMethodTrampoline< Frame, R( A, B, C, D, E, F, G, H ) > : public _EngineMethodTrampolineBase< R( A, B, C, D, E, F, G, H ) >
  1160. {
  1161. typedef R( FunctionType )( typename Frame::ObjectType*, A, B, C, D, E, F, G, H );
  1162. static R jmp( typename Frame::ObjectType* object, const typename _EngineFunctionTrampolineBase< R( A, B, C, D, E, F, G, H ) >::Args& args )
  1163. {
  1164. Frame f;
  1165. f.object = object;
  1166. return R( f._exec( args.a(), args.b(), args.c(), args.d(), args.e(), args.f(), args.g(), args.h() ) );
  1167. }
  1168. };
  1169. template< typename Frame, typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I >
  1170. struct _EngineMethodTrampoline< Frame, R( A, B, C, D, E, F, G, H, I ) > : public _EngineMethodTrampolineBase< R( A, B, C, D, E, F, G, H, I ) >
  1171. {
  1172. typedef R( FunctionType )( typename Frame::ObjectType*, A, B, C, D, E, F, G, H, I );
  1173. static R jmp( typename Frame::ObjectType* object, const typename _EngineFunctionTrampolineBase< R( A, B, C, D, E, F, G, H, I ) >::Args& args )
  1174. {
  1175. Frame f;
  1176. f.object = object;
  1177. return R( f._exec( args.a(), args.b(), args.c(), args.d(), args.e(), args.f(), args.g(), args.h(), args.i() ) );
  1178. }
  1179. };
  1180. template< typename Frame, typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I, typename J >
  1181. struct _EngineMethodTrampoline< Frame, R( A, B, C, D, E, F, G, H, I, J ) > : public _EngineMethodTrampolineBase< R( A, B, C, D, E, F, G, H, I, J ) >
  1182. {
  1183. typedef R( FunctionType )( typename Frame::ObjectType*, A, B, C, D, E, F, G, H, I, J );
  1184. static R jmp( typename Frame::ObjectType* object, const typename _EngineFunctionTrampolineBase< R( A, B, C, D, E, F, G, H, I, J ) >::Args& args )
  1185. {
  1186. Frame f;
  1187. f.object = object;
  1188. return R( f._exec( args.a(), args.b(), args.c(), args.d(), args.e(), args.f(), args.g(), args.h(), args.i(), args.j() ) );
  1189. }
  1190. };
  1191. template< typename Frame, typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I, typename J, typename K >
  1192. struct _EngineMethodTrampoline< Frame, R( A, B, C, D, E, F, G, H, I, J, K ) > : public _EngineMethodTrampolineBase< R( A, B, C, D, E, F, G, H, I, J, K ) >
  1193. {
  1194. typedef R( FunctionType )( typename Frame::ObjectType*, A, B, C, D, E, F, G, H, I, J, K );
  1195. static R jmp( typename Frame::ObjectType* object, const typename _EngineFunctionTrampolineBase< R( A, B, C, D, E, F, G, H, I, J, K ) >::Args& args )
  1196. {
  1197. Frame f;
  1198. f.object = object;
  1199. return R( f._exec( args.a(), args.b(), args.c(), args.d(), args.e(), args.f(), args.g(), args.h(), args.i(), args.j(), args.k() ) );
  1200. }
  1201. };
  1202. /// @}
  1203. /// @name Thunking
  1204. ///
  1205. /// Internal functionality for thunks placed between TorqueScript calls of engine functions and their native
  1206. /// implementations.
  1207. ///
  1208. /// @note The functionality in this group is specific to the console interop system.
  1209. /// @{
  1210. // Helper function to return data from a thunk.
  1211. template< typename T >
  1212. inline const char* _EngineConsoleThunkReturnValue( const T& value )
  1213. {
  1214. return EngineMarshallData( value );
  1215. }
  1216. inline bool _EngineConsoleThunkReturnValue( bool value )
  1217. {
  1218. return value;
  1219. }
  1220. inline S32 _EngineConsoleThunkReturnValue( S32 value )
  1221. {
  1222. return value;
  1223. }
  1224. inline F32 _EngineConsoleThunkReturnValue( F32 value )
  1225. {
  1226. return value;
  1227. }
  1228. inline const char* _EngineConsoleThunkReturnValue( const String& str )
  1229. {
  1230. return Con::getReturnBuffer( str );
  1231. }
  1232. inline const char* _EngineConsoleThunkReturnValue( const char* value )
  1233. {
  1234. return EngineMarshallData( value );
  1235. }
  1236. template< typename T >
  1237. inline const char* _EngineConsoleThunkReturnValue( T* value )
  1238. {
  1239. return ( value ? value->getIdString() : "" );
  1240. }
  1241. template< typename T >
  1242. inline const char* _EngineConsoleThunkReturnValue( const T* value )
  1243. {
  1244. return ( value ? value->getIdString() : "" );
  1245. }
  1246. // Helper class to determine the type of callback registered with the console system.
  1247. template< typename R >
  1248. struct _EngineConsoleThunkType
  1249. {
  1250. typedef const char* ReturnType;
  1251. typedef StringCallback CallbackType;
  1252. };
  1253. template<>
  1254. struct _EngineConsoleThunkType< S32 >
  1255. {
  1256. typedef S32 ReturnType;
  1257. typedef IntCallback CallbackType;
  1258. };
  1259. template<>
  1260. struct _EngineConsoleThunkType< U32 >
  1261. {
  1262. typedef U32 ReturnType;
  1263. typedef IntCallback CallbackType;
  1264. };
  1265. template<>
  1266. struct _EngineConsoleThunkType< F32 >
  1267. {
  1268. typedef F32 ReturnType;
  1269. typedef FloatCallback CallbackType;
  1270. };
  1271. template<>
  1272. struct _EngineConsoleThunkType< bool >
  1273. {
  1274. typedef bool ReturnType;
  1275. typedef BoolCallback CallbackType;
  1276. };
  1277. template<>
  1278. struct _EngineConsoleThunkType< void >
  1279. {
  1280. typedef void ReturnType;
  1281. typedef VoidCallback CallbackType;
  1282. };
  1283. // Helper struct to count the number of parameters in a function list.
  1284. // The setup through operator () allows omitting the the argument list entirely.
  1285. struct _EngineConsoleThunkCountArgs
  1286. {
  1287. template< typename A >
  1288. U32 operator ()( A a )
  1289. {
  1290. return 1;
  1291. }
  1292. template< typename A, typename B >
  1293. U32 operator ()( A a, B b )
  1294. {
  1295. return 2;
  1296. }
  1297. template< typename A, typename B, typename C >
  1298. U32 operator ()( A a, B b, C c )
  1299. {
  1300. return 3;
  1301. }
  1302. template< typename A, typename B, typename C, typename D >
  1303. U32 operator ()( A a, B b, C c, D d )
  1304. {
  1305. return 4;
  1306. }
  1307. template< typename A, typename B, typename C, typename D, typename E >
  1308. U32 operator ()( A a, B b, C c, D d, E e )
  1309. {
  1310. return 5;
  1311. }
  1312. template< typename A, typename B, typename C, typename D, typename E, typename F >
  1313. U32 operator ()( A a, B b, C c, D d, E e, F f )
  1314. {
  1315. return 6;
  1316. }
  1317. template< typename A, typename B, typename C, typename D, typename E, typename F, typename G >
  1318. U32 operator ()( A a, B b, C c, D d, E e, F f, G g )
  1319. {
  1320. return 7;
  1321. }
  1322. template< typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H >
  1323. U32 operator ()( A a, B b, C c, D d, E e, F f, G g, H h )
  1324. {
  1325. return 8;
  1326. }
  1327. template< typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I >
  1328. U32 operator ()( A a, B b, C c, D d, E e, F f, G g, H h, I i )
  1329. {
  1330. return 9;
  1331. }
  1332. template< typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I, typename J >
  1333. U32 operator ()( A a, B b, C c, D d, E e, F f, G g, H h, I i, J j )
  1334. {
  1335. return 10;
  1336. }
  1337. template< typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I, typename J, typename K >
  1338. U32 operator ()( A a, B b, C c, D d, E e, F f, G g, H h, I i, J j, K k )
  1339. {
  1340. return 11;
  1341. }
  1342. operator U32() const
  1343. {
  1344. return 0;
  1345. }
  1346. };
  1347. // Encapsulation of a legacy console function invocation.
  1348. template< S32 startArgc, typename T >
  1349. struct _EngineConsoleThunk {};
  1350. template< S32 startArgc, typename R >
  1351. struct _EngineConsoleThunk< startArgc, R() >
  1352. {
  1353. typedef typename _EngineConsoleThunkType< R >::ReturnType ReturnType;
  1354. static const S32 NUM_ARGS = 0;
  1355. static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( *fn )(), const _EngineFunctionDefaultArguments< void() >& )
  1356. {
  1357. return _EngineConsoleThunkReturnValue( fn() );
  1358. }
  1359. template< typename Frame >
  1360. static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( Frame::*fn )() const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType* ) >& )
  1361. {
  1362. return _EngineConsoleThunkReturnValue( ( frame->*fn )() );
  1363. }
  1364. };
  1365. template< S32 startArgc >
  1366. struct _EngineConsoleThunk< startArgc, void() >
  1367. {
  1368. typedef void ReturnType;
  1369. static const S32 NUM_ARGS = 0;
  1370. static void thunk( S32 argc, ConsoleValueRef *argv, void ( *fn )(), const _EngineFunctionDefaultArguments< void() >& )
  1371. {
  1372. fn();
  1373. }
  1374. template< typename Frame >
  1375. static void thunk( S32 argc, ConsoleValueRef *argv, void ( Frame::*fn )() const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType* ) >& )
  1376. {
  1377. return ( frame->*fn )();
  1378. }
  1379. };
  1380. template< S32 startArgc, typename R, typename A >
  1381. struct _EngineConsoleThunk< startArgc, R( A ) >
  1382. {
  1383. typedef typename _EngineConsoleThunkType< R >::ReturnType ReturnType;
  1384. static const S32 NUM_ARGS = 1 + startArgc;
  1385. static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( *fn )( A ), const _EngineFunctionDefaultArguments< void( A ) >& defaultArgs )
  1386. {
  1387. A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.a ) );
  1388. return _EngineConsoleThunkReturnValue( fn( a ) );
  1389. }
  1390. template< typename Frame >
  1391. static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( Frame::*fn )( A ) const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, A ) >& defaultArgs )
  1392. {
  1393. A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.b ) );
  1394. return _EngineConsoleThunkReturnValue( ( frame->*fn )( a ) );
  1395. }
  1396. };
  1397. template< S32 startArgc, typename A >
  1398. struct _EngineConsoleThunk< startArgc, void( A ) >
  1399. {
  1400. typedef void ReturnType;
  1401. static const S32 NUM_ARGS = 1 + startArgc;
  1402. static void thunk( S32 argc, ConsoleValueRef *argv, void ( *fn )( A ), const _EngineFunctionDefaultArguments< void( A ) >& defaultArgs )
  1403. {
  1404. A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.a ) );
  1405. fn( a );
  1406. }
  1407. template< typename Frame >
  1408. static void thunk( S32 argc, ConsoleValueRef *argv, void ( Frame::*fn )( A ) const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, A ) >& defaultArgs )
  1409. {
  1410. A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.b ) );
  1411. ( frame->*fn )( a );
  1412. }
  1413. };
  1414. template< S32 startArgc, typename R, typename A, typename B >
  1415. struct _EngineConsoleThunk< startArgc, R( A, B ) >
  1416. {
  1417. typedef typename _EngineConsoleThunkType< R >::ReturnType ReturnType;
  1418. static const S32 NUM_ARGS = 2 + startArgc;
  1419. static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( *fn )( A, B ), const _EngineFunctionDefaultArguments< void( A, B ) >& defaultArgs )
  1420. {
  1421. A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.a ) );
  1422. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) );
  1423. return _EngineConsoleThunkReturnValue( fn( a, b ) );
  1424. }
  1425. template< typename Frame >
  1426. static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( Frame::*fn )( A, B ) const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, A, B ) >& defaultArgs )
  1427. {
  1428. A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.b ) );
  1429. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) );
  1430. return _EngineConsoleThunkReturnValue( ( frame->*fn )( a, b ) );
  1431. }
  1432. };
  1433. template< S32 startArgc, typename A, typename B >
  1434. struct _EngineConsoleThunk< startArgc, void( A, B ) >
  1435. {
  1436. typedef void ReturnType;
  1437. static const S32 NUM_ARGS = 2 + startArgc;
  1438. static void thunk( S32 argc, ConsoleValueRef *argv, void ( *fn )( A, B ), const _EngineFunctionDefaultArguments< void( A, B ) >& defaultArgs )
  1439. {
  1440. A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.a ) );
  1441. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) );
  1442. fn( a, b );
  1443. }
  1444. template< typename Frame >
  1445. static void thunk( S32 argc, ConsoleValueRef *argv, void ( Frame::*fn )( A, B ) const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, A, B ) >& defaultArgs )
  1446. {
  1447. A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.b ) );
  1448. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) );
  1449. ( frame->*fn )( a, b );
  1450. }
  1451. };
  1452. template< S32 startArgc, typename R, typename A, typename B, typename C >
  1453. struct _EngineConsoleThunk< startArgc, R( A, B, C ) >
  1454. {
  1455. typedef typename _EngineConsoleThunkType< R >::ReturnType ReturnType;
  1456. static const S32 NUM_ARGS = 3 + startArgc;
  1457. static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( *fn )( A, B, C ), const _EngineFunctionDefaultArguments< void( A, B, C ) >& defaultArgs )
  1458. {
  1459. A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.a ) );
  1460. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) );
  1461. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) );
  1462. return _EngineConsoleThunkReturnValue( fn( a, b, c ) );
  1463. }
  1464. template< typename Frame >
  1465. static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( Frame::*fn )( A, B, C ) const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, A, B, C ) >& defaultArgs )
  1466. {
  1467. A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.b ) );
  1468. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) );
  1469. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) );
  1470. return _EngineConsoleThunkReturnValue( ( frame->*fn )( a, b, c ) );
  1471. }
  1472. };
  1473. template< S32 startArgc, typename A, typename B, typename C >
  1474. struct _EngineConsoleThunk< startArgc, void( A, B, C ) >
  1475. {
  1476. typedef void ReturnType;
  1477. static const S32 NUM_ARGS = 3 + startArgc;
  1478. static void thunk( S32 argc, ConsoleValueRef *argv, void ( *fn )( A, B, C ), const _EngineFunctionDefaultArguments< void( A, B, C ) >& defaultArgs )
  1479. {
  1480. A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.a ) );
  1481. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) );
  1482. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) );
  1483. fn( a, b, c );
  1484. }
  1485. template< typename Frame >
  1486. static void thunk( S32 argc, ConsoleValueRef *argv, void ( Frame::*fn )( A, B, C ) const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, A, B, C ) >& defaultArgs )
  1487. {
  1488. A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.b ) );
  1489. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) );
  1490. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) );
  1491. ( frame->*fn )( a, b, c );
  1492. }
  1493. };
  1494. template< S32 startArgc, typename R, typename A, typename B, typename C, typename D >
  1495. struct _EngineConsoleThunk< startArgc, R( A, B, C, D ) >
  1496. {
  1497. typedef typename _EngineConsoleThunkType< R >::ReturnType ReturnType;
  1498. static const S32 NUM_ARGS = 4 + startArgc;
  1499. static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( *fn )( A, B, C, D ), const _EngineFunctionDefaultArguments< void( A, B, C, D ) >& defaultArgs )
  1500. {
  1501. A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.a ) );
  1502. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) );
  1503. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) );
  1504. D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.d ) );
  1505. return _EngineConsoleThunkReturnValue( fn( a, b, c, d ) );
  1506. }
  1507. template< typename Frame >
  1508. static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( Frame::*fn )( A, B, C, D ) const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, A, B, C, D ) >& defaultArgs )
  1509. {
  1510. A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.b ) );
  1511. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) );
  1512. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) );
  1513. D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.e ) );
  1514. return _EngineConsoleThunkReturnValue( ( frame->*fn )( a, b, c, d ) );
  1515. }
  1516. };
  1517. template< S32 startArgc, typename A, typename B, typename C, typename D >
  1518. struct _EngineConsoleThunk< startArgc, void( A, B, C, D ) >
  1519. {
  1520. typedef void ReturnType;
  1521. static const S32 NUM_ARGS = 4 + startArgc;
  1522. static void thunk( S32 argc, ConsoleValueRef *argv, void ( *fn )( A, B, C, D ), const _EngineFunctionDefaultArguments< void( A, B, C, D ) >& defaultArgs )
  1523. {
  1524. A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.a ) );
  1525. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) );
  1526. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) );
  1527. D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.d ) );
  1528. fn( a, b, c, d );
  1529. }
  1530. template< typename Frame >
  1531. static void thunk( S32 argc, ConsoleValueRef *argv, void ( Frame::*fn )( A, B, C, D ) const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, A, B, C, D ) >& defaultArgs )
  1532. {
  1533. A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.b ) );
  1534. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) );
  1535. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) );
  1536. D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.e ) );
  1537. ( frame->*fn )( a, b, c, d );
  1538. }
  1539. };
  1540. template< S32 startArgc, typename R, typename A, typename B, typename C, typename D, typename E >
  1541. struct _EngineConsoleThunk< startArgc, R( A, B, C, D, E ) >
  1542. {
  1543. typedef typename _EngineConsoleThunkType< R >::ReturnType ReturnType;
  1544. static const S32 NUM_ARGS = 5 + startArgc;
  1545. static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( *fn )( A, B, C, D, E ), const _EngineFunctionDefaultArguments< void( A, B, C, D, E ) >& defaultArgs )
  1546. {
  1547. A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.a ) );
  1548. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) );
  1549. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) );
  1550. D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.d ) );
  1551. E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.e ) );
  1552. return _EngineConsoleThunkReturnValue( fn( a, b, c, d, e ) );
  1553. }
  1554. template< typename Frame >
  1555. static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( Frame::*fn )( A, B, C, D, E ) const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, A, B, C, D, E ) >& defaultArgs )
  1556. {
  1557. A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.b ) );
  1558. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) );
  1559. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) );
  1560. D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.e ) );
  1561. E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.f ) );
  1562. return _EngineConsoleThunkReturnValue( ( frame->*fn )( a, b, c, d, e ) );
  1563. }
  1564. };
  1565. template< S32 startArgc, typename A, typename B, typename C, typename D, typename E >
  1566. struct _EngineConsoleThunk< startArgc, void( A, B, C, D, E ) >
  1567. {
  1568. typedef void ReturnType;
  1569. static const S32 NUM_ARGS = 5 + startArgc;
  1570. static void thunk( S32 argc, ConsoleValueRef *argv, void ( *fn )( A, B, C, D, E ), const _EngineFunctionDefaultArguments< void( A, B, C, D, E ) >& defaultArgs )
  1571. {
  1572. A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.a ) );
  1573. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) );
  1574. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) );
  1575. D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.d ) );
  1576. E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.e ) );
  1577. fn( a, b, c, d, e );
  1578. }
  1579. template< typename Frame >
  1580. static void thunk( S32 argc, ConsoleValueRef *argv, void ( Frame::*fn )( A, B, C, D, E ) const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, A, B, C, D, E ) >& defaultArgs )
  1581. {
  1582. A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.b ) );
  1583. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) );
  1584. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) );
  1585. D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.e ) );
  1586. E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.f ) );
  1587. ( frame->*fn )( a, b, c, d, e );
  1588. }
  1589. };
  1590. template< S32 startArgc, typename R, typename A, typename B, typename C, typename D, typename E, typename F >
  1591. struct _EngineConsoleThunk< startArgc, R( A, B, C, D, E, F ) >
  1592. {
  1593. typedef typename _EngineConsoleThunkType< R >::ReturnType ReturnType;
  1594. static const S32 NUM_ARGS = 6 + startArgc;
  1595. static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( *fn )( A, B, C, D, E, F ), const _EngineFunctionDefaultArguments< void( A, B, C, D, E, F ) >& defaultArgs )
  1596. {
  1597. A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.a ) );
  1598. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) );
  1599. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) );
  1600. D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.d ) );
  1601. E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.e ) );
  1602. F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.f ) );
  1603. return _EngineConsoleThunkReturnValue( fn( a, b, c, d, e, f ) );
  1604. }
  1605. template< typename Frame >
  1606. static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( Frame::*fn )( A, B, C, D, E, F ) const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, A, B, C, D, E, F ) >& defaultArgs )
  1607. {
  1608. A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.b ) );
  1609. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) );
  1610. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) );
  1611. D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.e ) );
  1612. E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.f ) );
  1613. F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.g ) );
  1614. return _EngineConsoleThunkReturnValue( ( frame->*fn )( a, b, c, d, e, f ) );
  1615. }
  1616. };
  1617. template< S32 startArgc, typename A, typename B, typename C, typename D, typename E, typename F >
  1618. struct _EngineConsoleThunk< startArgc, void( A, B, C, D, E, F ) >
  1619. {
  1620. typedef void ReturnType;
  1621. static const S32 NUM_ARGS = 6 + startArgc;
  1622. static void thunk( S32 argc, ConsoleValueRef *argv, void ( *fn )( A, B, C, D, E, F ), const _EngineFunctionDefaultArguments< void( A, B, C, D, E, F ) >& defaultArgs )
  1623. {
  1624. A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.a ) );
  1625. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) );
  1626. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) );
  1627. D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.d ) );
  1628. E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.e ) );
  1629. F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.f ) );
  1630. fn( a, b, c, d, e, f );
  1631. }
  1632. template< typename Frame >
  1633. static void thunk( S32 argc, ConsoleValueRef *argv, void ( Frame::*fn )( A, B, C, D, E, F ) const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, A, B, C, D, E, F ) >& defaultArgs )
  1634. {
  1635. A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.b ) );
  1636. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) );
  1637. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) );
  1638. D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.e ) );
  1639. E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.f ) );
  1640. F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.g ) );
  1641. ( frame->*fn )( a, b, c, d, e, f );
  1642. }
  1643. };
  1644. template< S32 startArgc, typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G >
  1645. struct _EngineConsoleThunk< startArgc, R( A, B, C, D, E, F, G ) >
  1646. {
  1647. typedef typename _EngineConsoleThunkType< R >::ReturnType ReturnType;
  1648. static const S32 NUM_ARGS = 7 + startArgc;
  1649. static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( *fn )( A, B, C, D, E, F, G ), const _EngineFunctionDefaultArguments< void( A, B, C, D, E, F, G ) >& defaultArgs )
  1650. {
  1651. A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.a ) );
  1652. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) );
  1653. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) );
  1654. D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.d ) );
  1655. E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.e ) );
  1656. F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.f ) );
  1657. G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.g ) );
  1658. return _EngineConsoleThunkReturnValue( fn( a, b, c, d, e, f, g ) );
  1659. }
  1660. template< typename Frame >
  1661. static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( Frame::*fn )( A, B, C, D, E, F, G ) const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, A, B, C, D, E, F, G ) >& defaultArgs )
  1662. {
  1663. A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.b ) );
  1664. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) );
  1665. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) );
  1666. D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.e ) );
  1667. E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.f ) );
  1668. F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.g ) );
  1669. G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.h ) );
  1670. return _EngineConsoleThunkReturnValue( ( frame->*fn )( a, b, c, d, e, f, g ) );
  1671. }
  1672. };
  1673. template< S32 startArgc, typename A, typename B, typename C, typename D, typename E, typename F, typename G >
  1674. struct _EngineConsoleThunk< startArgc, void( A, B, C, D, E, F, G ) >
  1675. {
  1676. typedef void ReturnType;
  1677. static const S32 NUM_ARGS = 7 + startArgc;
  1678. static void thunk( S32 argc, ConsoleValueRef *argv, void ( *fn )( A, B, C, D, E, F, G ), const _EngineFunctionDefaultArguments< void( A, B, C, D, E, F, G ) >& defaultArgs )
  1679. {
  1680. A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.a ) );
  1681. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) );
  1682. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) );
  1683. D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.d ) );
  1684. E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.e ) );
  1685. F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.f ) );
  1686. G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.g ) );
  1687. fn( a, b, c, d, e, f, g );
  1688. }
  1689. template< typename Frame >
  1690. static void thunk( S32 argc, ConsoleValueRef *argv, void ( Frame::*fn )( A, B, C, D, E, F, G ) const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, A, B, C, D, E, F, G ) >& defaultArgs )
  1691. {
  1692. A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.b ) );
  1693. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) );
  1694. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) );
  1695. D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.e ) );
  1696. E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.f ) );
  1697. F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.g ) );
  1698. G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.h ) );
  1699. ( frame->*fn )( a, b, c, d, e, f, g );
  1700. }
  1701. };
  1702. template< S32 startArgc, typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H >
  1703. struct _EngineConsoleThunk< startArgc, R( A, B, C, D, E, F, G, H ) >
  1704. {
  1705. typedef typename _EngineConsoleThunkType< R >::ReturnType ReturnType;
  1706. static const S32 NUM_ARGS = 8 + startArgc;
  1707. static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( *fn )( A, B, C, D, E, F, G, H ), const _EngineFunctionDefaultArguments< void( A, B, C, D, E, F, G, H ) >& defaultArgs )
  1708. {
  1709. A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.a ) );
  1710. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) );
  1711. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) );
  1712. D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.d ) );
  1713. E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.e ) );
  1714. F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.f ) );
  1715. G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.g ) );
  1716. H h = ( startArgc + 7 < argc ? EngineUnmarshallData< H >()( argv[ startArgc + 7 ] ) : H( defaultArgs.h ) );
  1717. return _EngineConsoleThunkReturnValue( fn( a, b, c, d, e, f, g, h ) );
  1718. }
  1719. template< typename Frame >
  1720. static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( Frame::*fn )( A, B, C, D, E, F, G, H ) const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, A, B, C, D, E, F, G, H ) >& defaultArgs )
  1721. {
  1722. A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.b ) );
  1723. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) );
  1724. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) );
  1725. D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.e ) );
  1726. E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.f ) );
  1727. F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.g ) );
  1728. G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.h ) );
  1729. H h = ( startArgc + 7 < argc ? EngineUnmarshallData< H >()( argv[ startArgc + 7 ] ) : H( defaultArgs.i ) );
  1730. return _EngineConsoleThunkReturnValue( ( frame->*fn )( a, b, c, d, e, f, g, h ) );
  1731. }
  1732. };
  1733. template< S32 startArgc, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H >
  1734. struct _EngineConsoleThunk< startArgc, void( A, B, C, D, E, F, G, H ) >
  1735. {
  1736. typedef void ReturnType;
  1737. static const S32 NUM_ARGS = 8 + startArgc;
  1738. static void thunk( S32 argc, ConsoleValueRef *argv, void ( *fn )( A, B, C, D, E, F, G, H ), const _EngineFunctionDefaultArguments< void( A, B, C, D, E, F, G, H ) >& defaultArgs )
  1739. {
  1740. A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.a ) );
  1741. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) );
  1742. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) );
  1743. D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.d ) );
  1744. E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.e ) );
  1745. F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.f ) );
  1746. G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.g ) );
  1747. H h = ( startArgc + 7 < argc ? EngineUnmarshallData< H >()( argv[ startArgc + 7 ] ) : H( defaultArgs.h ) );
  1748. fn( a, b, c, d, e, f, g, h );
  1749. }
  1750. template< typename Frame >
  1751. static void thunk( S32 argc, ConsoleValueRef *argv, void ( Frame::*fn )( A, B, C, D, E, F, G, H ) const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, A, B, C, D, E, F, G, H ) >& defaultArgs )
  1752. {
  1753. A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.b ) );
  1754. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) );
  1755. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) );
  1756. D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.e ) );
  1757. E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.f ) );
  1758. F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.g ) );
  1759. G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.h ) );
  1760. H h = ( startArgc + 7 < argc ? EngineUnmarshallData< H >()( argv[ startArgc + 7 ] ) : H( defaultArgs.i ) );
  1761. ( frame->*fn )( a, b, c, d, e, f, g, h );
  1762. }
  1763. };
  1764. template< S32 startArgc, typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I >
  1765. struct _EngineConsoleThunk< startArgc, R( A, B, C, D, E, F, G, H, I ) >
  1766. {
  1767. typedef typename _EngineConsoleThunkType< R >::ReturnType ReturnType;
  1768. static const S32 NUM_ARGS = 9 + startArgc;
  1769. static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( *fn )( A, B, C, D, E, F, G, H, I ), const _EngineFunctionDefaultArguments< void( A, B, C, D, E, F, G, H, I ) >& defaultArgs )
  1770. {
  1771. A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.a ) );
  1772. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) );
  1773. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) );
  1774. D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.d ) );
  1775. E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.e ) );
  1776. F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.f ) );
  1777. G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.g ) );
  1778. H h = ( startArgc + 7 < argc ? EngineUnmarshallData< H >()( argv[ startArgc + 7 ] ) : H( defaultArgs.h ) );
  1779. I i = ( startArgc + 8 < argc ? EngineUnmarshallData< I >()( argv[ startArgc + 8 ] ) : I( defaultArgs.i ) );
  1780. return _EngineConsoleThunkReturnValue( fn( a, b, c, d, e, f, g, h, i ) );
  1781. }
  1782. template< typename Frame >
  1783. static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( Frame::*fn )( A, B, C, D, E, F, G, H, I ) const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, A, B, C, D, E, F, G, H, I ) >& defaultArgs )
  1784. {
  1785. A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.b ) );
  1786. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) );
  1787. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) );
  1788. D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.e ) );
  1789. E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.f ) );
  1790. F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.g ) );
  1791. G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.h ) );
  1792. H h = ( startArgc + 7 < argc ? EngineUnmarshallData< H >()( argv[ startArgc + 7 ] ) : H( defaultArgs.i ) );
  1793. I i = ( startArgc + 8 < argc ? EngineUnmarshallData< I >()( argv[ startArgc + 8 ] ) : I( defaultArgs.j ) );
  1794. return _EngineConsoleThunkReturnValue( ( frame->*fn )( a, b, c, d, e, f, g, h, i ) );
  1795. }
  1796. };
  1797. template< S32 startArgc, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I >
  1798. struct _EngineConsoleThunk< startArgc, void( A, B, C, D, E, F, G, H, I ) >
  1799. {
  1800. typedef void ReturnType;
  1801. static const S32 NUM_ARGS = 9 + startArgc;
  1802. static void thunk( S32 argc, ConsoleValueRef *argv, void ( *fn )( A, B, C, D, E, F, G, H, I ), const _EngineFunctionDefaultArguments< void( A, B, C, D, E, F, G, H, I ) >& defaultArgs )
  1803. {
  1804. A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.a ) );
  1805. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) );
  1806. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) );
  1807. D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.d ) );
  1808. E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.e ) );
  1809. F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.f ) );
  1810. G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.g ) );
  1811. H h = ( startArgc + 7 < argc ? EngineUnmarshallData< H >()( argv[ startArgc + 7 ] ) : H( defaultArgs.h ) );
  1812. I i = ( startArgc + 8 < argc ? EngineUnmarshallData< I >()( argv[ startArgc + 8 ] ) : I( defaultArgs.i ) );
  1813. fn( a, b, c, d, e, f, g, h, i );
  1814. }
  1815. template< typename Frame >
  1816. static void thunk( S32 argc, ConsoleValueRef *argv, void ( Frame::*fn )( A, B, C, D, E, F, G, H, I ) const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, A, B, C, D, E, F, G, H, I ) >& defaultArgs )
  1817. {
  1818. A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.b ) );
  1819. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) );
  1820. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) );
  1821. D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.e ) );
  1822. E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.f ) );
  1823. F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.g ) );
  1824. G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.h ) );
  1825. H h = ( startArgc + 7 < argc ? EngineUnmarshallData< H >()( argv[ startArgc + 7 ] ) : H( defaultArgs.i ) );
  1826. I i = ( startArgc + 8 < argc ? EngineUnmarshallData< I >()( argv[ startArgc + 8 ] ) : I( defaultArgs.j ) );
  1827. ( frame->*fn )( a, b, c, d, e, f, g, h, i );
  1828. }
  1829. };
  1830. template< S32 startArgc, typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I, typename J >
  1831. struct _EngineConsoleThunk< startArgc, R( A, B, C, D, E, F, G, H, I, J ) >
  1832. {
  1833. typedef typename _EngineConsoleThunkType< R >::ReturnType ReturnType;
  1834. static const S32 NUM_ARGS = 10 + startArgc;
  1835. static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( *fn )( A, B, C, D, E, F, G, H, I, J ), const _EngineFunctionDefaultArguments< void( A, B, C, D, E, F, G, H, I, J ) >& defaultArgs )
  1836. {
  1837. A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.a ) );
  1838. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) );
  1839. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) );
  1840. D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.d ) );
  1841. E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.e ) );
  1842. F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.f ) );
  1843. G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.g ) );
  1844. H h = ( startArgc + 7 < argc ? EngineUnmarshallData< H >()( argv[ startArgc + 7 ] ) : H( defaultArgs.h ) );
  1845. I i = ( startArgc + 8 < argc ? EngineUnmarshallData< I >()( argv[ startArgc + 8 ] ) : I( defaultArgs.i ) );
  1846. J j = ( startArgc + 9 < argc ? EngineUnmarshallData< J >()( argv[ startArgc + 9 ] ) : J( defaultArgs.j ) );
  1847. return _EngineConsoleThunkReturnValue( fn( a, b, c, d, e, f, g, h, i, j ) );
  1848. }
  1849. template< typename Frame >
  1850. static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( Frame::*fn )( A, B, C, D, E, F, G, H, I, J ) const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, A, B, C, D, E, F, G, H, I, J ) >& defaultArgs )
  1851. {
  1852. A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.b ) );
  1853. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) );
  1854. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) );
  1855. D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.e ) );
  1856. E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.f ) );
  1857. F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.g ) );
  1858. G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.h ) );
  1859. H h = ( startArgc + 7 < argc ? EngineUnmarshallData< H >()( argv[ startArgc + 7 ] ) : H( defaultArgs.i ) );
  1860. I i = ( startArgc + 8 < argc ? EngineUnmarshallData< I >()( argv[ startArgc + 8 ] ) : I( defaultArgs.j ) );
  1861. J j = ( startArgc + 9 < argc ? EngineUnmarshallData< J >()( argv[ startArgc + 9 ] ) : J( defaultArgs.k ) );
  1862. return _EngineConsoleThunkReturnValue( ( frame->*fn )( a, b, c, d, e, f, g, h, i, j ) );
  1863. }
  1864. };
  1865. template< S32 startArgc, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I, typename J >
  1866. struct _EngineConsoleThunk< startArgc, void( A, B, C, D, E, F, G, H, I, J ) >
  1867. {
  1868. typedef void ReturnType;
  1869. static const S32 NUM_ARGS = 10 + startArgc;
  1870. static void thunk( S32 argc, ConsoleValueRef *argv, void ( *fn )( A, B, C, D, E, F, G, H, I, J ), const _EngineFunctionDefaultArguments< void( A, B, C, D, E, F, G, H, I, J ) >& defaultArgs )
  1871. {
  1872. A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.a ) );
  1873. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) );
  1874. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) );
  1875. D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.d ) );
  1876. E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.e ) );
  1877. F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.f ) );
  1878. G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.g ) );
  1879. H h = ( startArgc + 7 < argc ? EngineUnmarshallData< H >()( argv[ startArgc + 7 ] ) : H( defaultArgs.h ) );
  1880. I i = ( startArgc + 8 < argc ? EngineUnmarshallData< I >()( argv[ startArgc + 8 ] ) : I( defaultArgs.i ) );
  1881. J j = ( startArgc + 9 < argc ? EngineUnmarshallData< J >()( argv[ startArgc + 9 ] ) : J( defaultArgs.j ) );
  1882. fn( a, b, c, d, e, f, g, h, i, j );
  1883. }
  1884. template< typename Frame >
  1885. static void thunk( S32 argc, ConsoleValueRef *argv, void ( Frame::*fn )( A, B, C, D, E, F, G, H, I, J ) const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, A, B, C, D, E, F, G, H, I, J ) >& defaultArgs )
  1886. {
  1887. A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.b ) );
  1888. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) );
  1889. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) );
  1890. D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.e ) );
  1891. E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.f ) );
  1892. F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.g ) );
  1893. G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.h ) );
  1894. H h = ( startArgc + 7 < argc ? EngineUnmarshallData< H >()( argv[ startArgc + 7 ] ) : H( defaultArgs.i ) );
  1895. I i = ( startArgc + 8 < argc ? EngineUnmarshallData< I >()( argv[ startArgc + 8 ] ) : I( defaultArgs.j ) );
  1896. J j = ( startArgc + 9 < argc ? EngineUnmarshallData< J >()( argv[ startArgc + 9 ] ) : J( defaultArgs.k ) );
  1897. ( frame->*fn )( a, b, c, d, e, f, g, h, i, j );
  1898. }
  1899. };
  1900. template< S32 startArgc, typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I, typename J, typename K >
  1901. struct _EngineConsoleThunk< startArgc, R( A, B, C, D, E, F, G, H, I, J, K ) >
  1902. {
  1903. typedef typename _EngineConsoleThunkType< R >::ReturnType ReturnType;
  1904. static const S32 NUM_ARGS = 11 + startArgc;
  1905. static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( *fn )( A, B, C, D, E, F, G, H, I, J, K ), const _EngineFunctionDefaultArguments< void( A, B, C, D, E, F, G, H, I, J, K ) >& defaultArgs )
  1906. {
  1907. A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.a ) );
  1908. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) );
  1909. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) );
  1910. D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.d ) );
  1911. E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.e ) );
  1912. F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.f ) );
  1913. G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.g ) );
  1914. H h = ( startArgc + 7 < argc ? EngineUnmarshallData< H >()( argv[ startArgc + 7 ] ) : H( defaultArgs.h ) );
  1915. I i = ( startArgc + 8 < argc ? EngineUnmarshallData< I >()( argv[ startArgc + 8 ] ) : I( defaultArgs.i ) );
  1916. J j = ( startArgc + 9 < argc ? EngineUnmarshallData< J >()( argv[ startArgc + 9 ] ) : J( defaultArgs.j ) );
  1917. K k = ( startArgc + 10 < argc ? EngineUnmarshallData< K >()( argv[ startArgc + 10 ] ) : K( defaultArgs.k ) );
  1918. return _EngineConsoleThunkReturnValue( fn( a, b, c, d, e, f, g, h, i, j, k ) );
  1919. }
  1920. template< typename Frame >
  1921. static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( Frame::*fn )( A, B, C, D, E, F, G, H, I, J, K ) const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, A, B, C, D, E, F, G, H, I, J, K ) >& defaultArgs )
  1922. {
  1923. A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.b ) );
  1924. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) );
  1925. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) );
  1926. D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.e ) );
  1927. E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.f ) );
  1928. F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.g ) );
  1929. G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.h ) );
  1930. H h = ( startArgc + 7 < argc ? EngineUnmarshallData< H >()( argv[ startArgc + 7 ] ) : H( defaultArgs.i ) );
  1931. I i = ( startArgc + 8 < argc ? EngineUnmarshallData< I >()( argv[ startArgc + 8 ] ) : I( defaultArgs.j ) );
  1932. J j = ( startArgc + 9 < argc ? EngineUnmarshallData< J >()( argv[ startArgc + 9 ] ) : J( defaultArgs.k ) );
  1933. K k = ( startArgc + 10 < argc ? EngineUnmarshallData< K >()( argv[ startArgc + 10 ] ) : K( defaultArgs.l ) );
  1934. return _EngineConsoleThunkReturnValue( ( frame->*fn )( a, b, c, d, e, f, g, h, i, j, k ) );
  1935. }
  1936. };
  1937. template< S32 startArgc, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I, typename J, typename K >
  1938. struct _EngineConsoleThunk< startArgc, void( A, B, C, D, E, F, G, H, I, J, K ) >
  1939. {
  1940. typedef void ReturnType;
  1941. static const S32 NUM_ARGS = 11 + startArgc;
  1942. static void thunk( S32 argc, ConsoleValueRef *argv, void ( *fn )( A, B, C, D, E, F, G, H, I, J, K ), const _EngineFunctionDefaultArguments< void( A, B, C, D, E, F, G, H, I, J, K ) >& defaultArgs )
  1943. {
  1944. A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.a ) );
  1945. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) );
  1946. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) );
  1947. D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.d ) );
  1948. E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.e ) );
  1949. F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.f ) );
  1950. G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.g ) );
  1951. H h = ( startArgc + 7 < argc ? EngineUnmarshallData< H >()( argv[ startArgc + 7 ] ) : H( defaultArgs.h ) );
  1952. I i = ( startArgc + 8 < argc ? EngineUnmarshallData< I >()( argv[ startArgc + 8 ] ) : I( defaultArgs.i ) );
  1953. J j = ( startArgc + 9 < argc ? EngineUnmarshallData< J >()( argv[ startArgc + 9 ] ) : J( defaultArgs.j ) );
  1954. K k = ( startArgc + 10 < argc ? EngineUnmarshallData< K >()( argv[ startArgc + 10 ] ) : K( defaultArgs.k ) );
  1955. fn( a, b, c, d, e, f, g, h, i, j, k );
  1956. }
  1957. template< typename Frame >
  1958. static void thunk( S32 argc, ConsoleValueRef *argv, void ( Frame::*fn )( A, B, C, D, E, F, G, H, I, J, K ) const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, A, B, C, D, E, F, G, H, I, J, K ) >& defaultArgs )
  1959. {
  1960. A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.b ) );
  1961. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) );
  1962. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) );
  1963. D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.e ) );
  1964. E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.f ) );
  1965. F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.g ) );
  1966. G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.h ) );
  1967. H h = ( startArgc + 7 < argc ? EngineUnmarshallData< H >()( argv[ startArgc + 7 ] ) : H( defaultArgs.i ) );
  1968. I i = ( startArgc + 8 < argc ? EngineUnmarshallData< I >()( argv[ startArgc + 8 ] ) : I( defaultArgs.j ) );
  1969. J j = ( startArgc + 9 < argc ? EngineUnmarshallData< J >()( argv[ startArgc + 9 ] ) : J( defaultArgs.k ) );
  1970. K k = ( startArgc + 10 < argc ? EngineUnmarshallData< K >()( argv[ startArgc + 10 ] ) : K( defaultArgs.l ) );
  1971. ( frame->*fn )( a, b, c, d, e, f, g, h, i, j, k );
  1972. }
  1973. };
  1974. /// @}
  1975. /// @name API Definition Macros
  1976. ///
  1977. /// The macros in this group allow to create engine API functions that work both with the
  1978. /// legacy console system as well as with the new engine export system. As such, they only
  1979. /// support those function features that are available in both systems. This means that for
  1980. /// console-style variadic functions, the ConsoleXXX must be used and that for overloaded
  1981. /// and/or C-style variadic functions as well as for placing functions in export scopes,
  1982. /// DEFINE_CALLIN must be used directly.
  1983. ///
  1984. /// When the console system is removed, the console thunking functionality will be removed
  1985. /// from these macros but otherwise they will remain unchanged and in place.
  1986. ///
  1987. /// @{
  1988. // Helpers to implement initialization checks. Pulled out into separate macros so this can be deactivated easily.
  1989. // Especially important for the initialize() function itself.
  1990. #define _CHECK_ENGINE_INITIALIZED_IMPL( fnName, returnType ) \
  1991. if( !engineAPI::gIsInitialized ) \
  1992. { \
  1993. Con::errorf( "EngineAPI: Engine not initialized when calling " #fnName ); \
  1994. return EngineTypeTraits< returnType >::ReturnValue( EngineTypeTraits< returnType >::ReturnValueType() ); \
  1995. }
  1996. #define _CHECK_ENGINE_INITIALIZED( fnName, returnType ) _CHECK_ENGINE_INITIALIZED_IMPL( fnName, returnType )
  1997. /// Define a call-in point for calling into the engine.
  1998. ///
  1999. /// @param name The name of the function as it should be seen by the control layer.
  2000. /// @param returnType The value type returned to the control layer.
  2001. /// @param args The argument list as it would appear on the function definition
  2002. /// @param defaultArgs The list of default argument values.
  2003. /// @param usage The usage doc string for the engine API reference.
  2004. ///
  2005. /// @code
  2006. /// DefineEngineFunction( myFunction, int, ( float f, const String& s ), ( "value for s" ), "This is my function." )
  2007. /// {
  2008. /// return int( f ) + dAtoi( s );
  2009. /// }
  2010. /// @endcode
  2011. #define DefineEngineFunction( name, returnType, args, defaultArgs, usage ) \
  2012. static inline returnType _fn ## name ## impl args; \
  2013. TORQUE_API EngineTypeTraits< returnType >::ReturnValueType fn ## name \
  2014. ( _EngineFunctionTrampoline< returnType args >::Args a ) \
  2015. { \
  2016. _CHECK_ENGINE_INITIALIZED( name, returnType ); \
  2017. return EngineTypeTraits< returnType >::ReturnValue( \
  2018. _EngineFunctionTrampoline< returnType args >::jmp( _fn ## name ## impl, a ) \
  2019. ); \
  2020. } \
  2021. static _EngineFunctionDefaultArguments< void args > _fn ## name ## DefaultArgs defaultArgs; \
  2022. static EngineFunctionInfo _fn ## name ## FunctionInfo( \
  2023. #name, \
  2024. &_SCOPE<>()(), \
  2025. usage, \
  2026. #returnType " " #name #args, \
  2027. "fn" #name, \
  2028. TYPE< returnType args >(), \
  2029. &_fn ## name ## DefaultArgs, \
  2030. ( void* ) &fn ## name, \
  2031. 0 \
  2032. ); \
  2033. static _EngineConsoleThunkType< returnType >::ReturnType _ ## name ## caster( SimObject*, S32 argc, ConsoleValueRef *argv ) \
  2034. { \
  2035. return _EngineConsoleThunkType< returnType >::ReturnType( _EngineConsoleThunk< 1, returnType args >::thunk( \
  2036. argc, argv, &_fn ## name ## impl, _fn ## name ## DefaultArgs \
  2037. ) ); \
  2038. } \
  2039. static ConsoleFunctionHeader _ ## name ## header \
  2040. ( #returnType, #args, #defaultArgs ); \
  2041. static ConsoleConstructor \
  2042. _ ## name ## obj( NULL, #name, _EngineConsoleThunkType< returnType >::CallbackType( _ ## name ## caster ), usage, \
  2043. _EngineConsoleThunk< 1, returnType args >::NUM_ARGS - _EngineConsoleThunkCountArgs() defaultArgs, \
  2044. _EngineConsoleThunk< 1, returnType args >::NUM_ARGS, \
  2045. false, &_ ## name ## header \
  2046. ); \
  2047. static inline returnType _fn ## name ## impl args
  2048. // The next thing is a bit tricky. DefineEngineMethod allows to make the 'object' (=this) argument to the function
  2049. // implicit which presents quite an obstacle for the macro internals as the engine export system requires the
  2050. // name of a DLL symbol that represents an extern "C" function with an explicit first object pointer argument.
  2051. //
  2052. // Even if we ignored the fact that we don't have a guarantee how the various C++ compilers implement implicit 'this' arguments,
  2053. // we could still not just use a C++ method for this as then we would have to get past the C++ compiler's mangling to
  2054. // get to the function symbol name (let alone the fact that typing this method correctly would be tricky).
  2055. //
  2056. // So, the trick employed here is to package all but the implicit 'this' argument in a structure and then define an
  2057. // extern "C" function that takes the object pointer as a first argument and the struct type as the second argument.
  2058. // This will result in a function with an identical stack call frame layout to the function we want.
  2059. //
  2060. // Unfortunately, that still requires that function to chain on to the real user-defined function. To do this
  2061. // cleanly and portably, _EngineMethodTrampoline is used to unpack and jump the call from extern "C" into C++ space.
  2062. // In optimized builds, the compiler should be smart enough to pretty much optimize all our trickery here away.
  2063. #define _DefineMethodTrampoline( className, name, returnType, args ) \
  2064. TORQUE_API EngineTypeTraits< returnType >::ReturnValueType \
  2065. fn ## className ## _ ## name ( className* object, _EngineMethodTrampoline< _ ## className ## name ## frame, returnType args >::Args a ) \
  2066. { \
  2067. _CHECK_ENGINE_INITIALIZED( className::name, returnType ); \
  2068. return EngineTypeTraits< returnType >::ReturnValue( \
  2069. _EngineMethodTrampoline< _ ## className ## name ## frame, returnType args >::jmp( object, a ) \
  2070. ); \
  2071. }
  2072. /// Define a call-in point for calling a method on an engine object.
  2073. ///
  2074. /// @param name The name of the C++ class.
  2075. /// @param name The name of the method as it should be seen by the control layer.
  2076. /// @param returnType The value type returned to the control layer.
  2077. /// @param args The argument list as it would appear on the function definition
  2078. /// @param defaultArgs The list of default argument values.
  2079. /// @param usage The usage doc string for the engine API reference.
  2080. ///
  2081. /// @code
  2082. /// DefineEngineMethod( MyClass, myMethod, int, ( float f, const String& s ), ( "value for s" ), "This is my method." )
  2083. /// {
  2084. /// return object->someMethod( f, s );
  2085. /// }
  2086. /// @endcode
  2087. #define DefineEngineMethod( className, name, returnType, args, defaultArgs, usage ) \
  2088. struct _ ## className ## name ## frame \
  2089. { \
  2090. typedef className ObjectType; \
  2091. className* object; \
  2092. inline returnType _exec args const; \
  2093. }; \
  2094. _DefineMethodTrampoline( className, name, returnType, args ); \
  2095. static _EngineFunctionDefaultArguments< _EngineMethodTrampoline< _ ## className ## name ## frame, void args >::FunctionType > \
  2096. _fn ## className ## name ## DefaultArgs defaultArgs; \
  2097. static EngineFunctionInfo _fn ## className ## name ## FunctionInfo( \
  2098. #name, \
  2099. &_SCOPE< className >()(), \
  2100. usage, \
  2101. "virtual " #returnType " " #name #args, \
  2102. "fn" #className "_" #name, \
  2103. TYPE< _EngineMethodTrampoline< _ ## className ## name ## frame, returnType args >::FunctionType >(), \
  2104. &_fn ## className ## name ## DefaultArgs, \
  2105. ( void* ) &fn ## className ## _ ## name, \
  2106. 0 \
  2107. ); \
  2108. static _EngineConsoleThunkType< returnType >::ReturnType _ ## className ## name ## caster( SimObject* object, S32 argc, ConsoleValueRef *argv ) \
  2109. { \
  2110. _ ## className ## name ## frame frame; \
  2111. frame.object = static_cast< className* >( object ); \
  2112. return _EngineConsoleThunkType< returnType >::ReturnType( _EngineConsoleThunk< 2, returnType args >::thunk( \
  2113. argc, argv, &_ ## className ## name ## frame::_exec, &frame, _fn ## className ## name ## DefaultArgs \
  2114. ) ); \
  2115. } \
  2116. static ConsoleFunctionHeader _ ## className ## name ## header \
  2117. ( #returnType, #args, #defaultArgs ); \
  2118. static ConsoleConstructor \
  2119. className ## name ## obj( #className, #name, \
  2120. _EngineConsoleThunkType< returnType >::CallbackType( _ ## className ## name ## caster ), usage, \
  2121. _EngineConsoleThunk< 2, returnType args >::NUM_ARGS - _EngineConsoleThunkCountArgs() defaultArgs, \
  2122. _EngineConsoleThunk< 2, returnType args >::NUM_ARGS, \
  2123. false, &_ ## className ## name ## header \
  2124. ); \
  2125. returnType _ ## className ## name ## frame::_exec args const
  2126. /// Define a call-in point for calling into the engine. Unlike with DefineEngineFunction, the statically
  2127. /// callable function will be confined to the namespace of the given class.
  2128. ///
  2129. /// @param name The name of the C++ class (or a registered export scope).
  2130. /// @param name The name of the method as it should be seen by the control layer.
  2131. /// @param returnType The value type returned to the control layer.
  2132. /// @param args The argument list as it would appear on the function definition
  2133. /// @param defaultArgs The list of default argument values.
  2134. /// @param usage The usage doc string for the engine API reference.
  2135. ///
  2136. /// @code
  2137. /// DefineEngineStaticMethod( MyClass, myMethod, int, ( float f, string s ), ( "value for s" ), "This is my method." )
  2138. /// {
  2139. /// }
  2140. /// @endcode
  2141. #define DefineEngineStaticMethod( className, name, returnType, args, defaultArgs, usage ) \
  2142. static inline returnType _fn ## className ## name ## impl args; \
  2143. TORQUE_API EngineTypeTraits< returnType >::ReturnValueType fn ## className ## _ ## name \
  2144. ( _EngineFunctionTrampoline< returnType args >::Args a ) \
  2145. { \
  2146. _CHECK_ENGINE_INITIALIZED( className::name, returnType ); \
  2147. return EngineTypeTraits< returnType >::ReturnValue( \
  2148. _EngineFunctionTrampoline< returnType args >::jmp( _fn ## className ## name ## impl, a ) \
  2149. ); \
  2150. } \
  2151. static _EngineFunctionDefaultArguments< void args > _fn ## className ## name ## DefaultArgs defaultArgs; \
  2152. static EngineFunctionInfo _fn ## name ## FunctionInfo( \
  2153. #name, \
  2154. &_SCOPE< className >()(), \
  2155. usage, \
  2156. #returnType " " #name #args, \
  2157. "fn" #className "_" #name, \
  2158. TYPE< returnType args >(), \
  2159. &_fn ## className ## name ## DefaultArgs, \
  2160. ( void* ) &fn ## className ## _ ## name, \
  2161. 0 \
  2162. ); \
  2163. static _EngineConsoleThunkType< returnType >::ReturnType _ ## className ## name ## caster( SimObject*, S32 argc, ConsoleValueRef *argv )\
  2164. { \
  2165. return _EngineConsoleThunkType< returnType >::ReturnType( _EngineConsoleThunk< 1, returnType args >::thunk( \
  2166. argc, argv, &_fn ## className ## name ## impl, _fn ## className ## name ## DefaultArgs \
  2167. ) ); \
  2168. } \
  2169. static ConsoleFunctionHeader _ ## className ## name ## header \
  2170. ( #returnType, #args, #defaultArgs, true ); \
  2171. static ConsoleConstructor \
  2172. _ ## className ## name ## obj( #className, #name, _EngineConsoleThunkType< returnType >::CallbackType( _ ## className ## name ## caster ), usage, \
  2173. _EngineConsoleThunk< 1, returnType args >::NUM_ARGS - _EngineConsoleThunkCountArgs() defaultArgs, \
  2174. _EngineConsoleThunk< 1, returnType args >::NUM_ARGS, \
  2175. false, &_ ## className ## name ## header \
  2176. ); \
  2177. static inline returnType _fn ## className ## name ## impl args
  2178. // Convenience macros to allow defining functions that use the new marshalling features
  2179. // while being only visible in the console interop. When we drop the console system,
  2180. // these macros can be removed and all definitions that make use of them can be removed
  2181. // as well.
  2182. #define DefineConsoleFunction( name, returnType, args, defaultArgs, usage ) \
  2183. static inline returnType _fn ## name ## impl args; \
  2184. static _EngineFunctionDefaultArguments< void args > _fn ## name ## DefaultArgs defaultArgs; \
  2185. static _EngineConsoleThunkType< returnType >::ReturnType _ ## name ## caster( SimObject*, S32 argc, ConsoleValueRef *argv ) \
  2186. { \
  2187. return _EngineConsoleThunkType< returnType >::ReturnType( _EngineConsoleThunk< 1, returnType args >::thunk( \
  2188. argc, argv, &_fn ## name ## impl, _fn ## name ## DefaultArgs \
  2189. ) ); \
  2190. } \
  2191. static ConsoleFunctionHeader _ ## name ## header \
  2192. ( #returnType, #args, #defaultArgs ); \
  2193. static ConsoleConstructor \
  2194. _ ## name ## obj( NULL, #name, _EngineConsoleThunkType< returnType >::CallbackType( _ ## name ## caster ), usage, \
  2195. _EngineConsoleThunk< 1, returnType args >::NUM_ARGS - _EngineConsoleThunkCountArgs() defaultArgs, \
  2196. _EngineConsoleThunk< 1, returnType args >::NUM_ARGS, \
  2197. false, &_ ## name ## header \
  2198. ); \
  2199. static inline returnType _fn ## name ## impl args
  2200. #define DefineConsoleMethod( className, name, returnType, args, defaultArgs, usage ) \
  2201. struct _ ## className ## name ## frame \
  2202. { \
  2203. typedef className ObjectType; \
  2204. className* object; \
  2205. inline returnType _exec args const; \
  2206. }; \
  2207. static _EngineFunctionDefaultArguments< _EngineMethodTrampoline< _ ## className ## name ## frame, void args >::FunctionType > \
  2208. _fn ## className ## name ## DefaultArgs defaultArgs; \
  2209. static _EngineConsoleThunkType< returnType >::ReturnType _ ## className ## name ## caster( SimObject* object, S32 argc, ConsoleValueRef *argv ) \
  2210. { \
  2211. _ ## className ## name ## frame frame; \
  2212. frame.object = static_cast< className* >( object ); \
  2213. return _EngineConsoleThunkType< returnType >::ReturnType( _EngineConsoleThunk< 2, returnType args >::thunk( \
  2214. argc, argv, &_ ## className ## name ## frame::_exec, &frame, _fn ## className ## name ## DefaultArgs \
  2215. ) ); \
  2216. } \
  2217. static ConsoleFunctionHeader _ ## className ## name ## header \
  2218. ( #returnType, #args, #defaultArgs ); \
  2219. static ConsoleConstructor \
  2220. className ## name ## obj( #className, #name, \
  2221. _EngineConsoleThunkType< returnType >::CallbackType( _ ## className ## name ## caster ), usage, \
  2222. _EngineConsoleThunk< 2, returnType args >::NUM_ARGS - _EngineConsoleThunkCountArgs() defaultArgs, \
  2223. _EngineConsoleThunk< 2, returnType args >::NUM_ARGS, \
  2224. false, &_ ## className ## name ## header \
  2225. ); \
  2226. returnType _ ## className ## name ## frame::_exec args const
  2227. #define DefineConsoleStaticMethod( className, name, returnType, args, defaultArgs, usage ) \
  2228. static inline returnType _fn ## className ## name ## impl args; \
  2229. static _EngineFunctionDefaultArguments< void args > _fn ## className ## name ## DefaultArgs defaultArgs; \
  2230. static _EngineConsoleThunkType< returnType >::ReturnType _ ## className ## name ## caster( SimObject*, S32 argc, ConsoleValueRef *argv )\
  2231. { \
  2232. return _EngineConsoleThunkType< returnType >::ReturnType( _EngineConsoleThunk< 1, returnType args >::thunk( \
  2233. argc, argv, &_fn ## className ## name ## impl, _fn ## className ## name ## DefaultArgs \
  2234. ) ); \
  2235. } \
  2236. static ConsoleFunctionHeader _ ## className ## name ## header \
  2237. ( #returnType, #args, #defaultArgs, true ); \
  2238. static ConsoleConstructor \
  2239. _ ## className ## name ## obj( #className, #name, _EngineConsoleThunkType< returnType >::CallbackType( _ ## className ## name ## caster ), usage, \
  2240. _EngineConsoleThunk< 1, returnType args >::NUM_ARGS - _EngineConsoleThunkCountArgs() defaultArgs, \
  2241. _EngineConsoleThunk< 1, returnType args >::NUM_ARGS, \
  2242. false, &_ ## className ## name ## header \
  2243. ); \
  2244. static inline returnType _fn ## className ## name ## impl args
  2245. // The following three macros are only temporary. They allow to define engineAPI functions using the framework
  2246. // here in this file while being visible only in the new API. When the console interop is removed, these macros
  2247. // can be removed and all their uses be replaced with their corresponding versions that now still include support
  2248. // for the console (e.g. DefineNewEngineFunction should become DefineEngineFunction).
  2249. #define DefineNewEngineFunction( name, returnType, args, defaultArgs, usage ) \
  2250. static inline returnType _fn ## name ## impl args; \
  2251. TORQUE_API EngineTypeTraits< returnType >::ReturnValueType fn ## name \
  2252. ( _EngineFunctionTrampoline< returnType args >::Args a ) \
  2253. { \
  2254. _CHECK_ENGINE_INITIALIZED( name, returnType ); \
  2255. return EngineTypeTraits< returnType >::ReturnValue( \
  2256. _EngineFunctionTrampoline< returnType args >::jmp( _fn ## name ## impl, a ) \
  2257. ); \
  2258. } \
  2259. static _EngineFunctionDefaultArguments< void args > _fn ## name ## DefaultArgs defaultArgs; \
  2260. static EngineFunctionInfo _fn ## name ## FunctionInfo( \
  2261. #name, \
  2262. &_SCOPE<>()(), \
  2263. usage, \
  2264. #returnType " " #name #args, \
  2265. "fn" #name, \
  2266. TYPE< returnType args >(), \
  2267. &_fn ## name ## DefaultArgs, \
  2268. ( void* ) &fn ## name, \
  2269. 0 \
  2270. ); \
  2271. static inline returnType _fn ## name ## impl args
  2272. #define DefineNewEngineMethod( className, name, returnType, args, defaultArgs, usage ) \
  2273. struct _ ## className ## name ## frame \
  2274. { \
  2275. typedef className ObjectType; \
  2276. className* object; \
  2277. inline returnType _exec args const; \
  2278. }; \
  2279. _DefineMethodTrampoline( className, name, returnType, args ); \
  2280. static _EngineFunctionDefaultArguments< _EngineMethodTrampoline< _ ## className ## name ## frame, void args >::FunctionType > \
  2281. _fn ## className ## name ## DefaultArgs defaultArgs; \
  2282. static EngineFunctionInfo _fn ## className ## name ## FunctionInfo( \
  2283. #name, \
  2284. &_SCOPE< className >()(), \
  2285. usage, \
  2286. "virtual " #returnType " " #name #args, \
  2287. "fn" #className "_" #name, \
  2288. TYPE< _EngineMethodTrampoline< _ ## className ## name ## frame, returnType args >::FunctionType >(), \
  2289. &_fn ## className ## name ## DefaultArgs, \
  2290. ( void* ) &fn ## className ## _ ## name, \
  2291. 0 \
  2292. ); \
  2293. returnType _ ## className ## name ## frame::_exec args const
  2294. #define DefineNewEngineStaticMethod( className, name, returnType, args, defaultArgs, usage ) \
  2295. static inline returnType _fn ## className ## name ## impl args; \
  2296. TORQUE_API EngineTypeTraits< returnType >::ReturnValueType fn ## className ## _ ## name \
  2297. ( _EngineFunctionTrampoline< returnType args >::Args a ) \
  2298. { \
  2299. _CHECK_ENGINE_INITIALIZED( className::name, returnType ); \
  2300. return EngineTypeTraits< returnType >::ReturnValue( \
  2301. _EngineFunctionTrampoline< returnType args >::jmp( _fn ## className ## name ## impl, a ) \
  2302. ); \
  2303. } \
  2304. static _EngineFunctionDefaultArguments< void args > _fn ## className ## name ## DefaultArgs defaultArgs; \
  2305. static EngineFunctionInfo _fn ## name ## FunctionInfo( \
  2306. #name, \
  2307. &_SCOPE< className >()(), \
  2308. usage, \
  2309. #returnType " " #name #args, \
  2310. "fn" #className "_" #name, \
  2311. TYPE< returnType args >(), \
  2312. &_fn ## className ## name ## DefaultArgs, \
  2313. ( void* ) &fn ## className ## _ ## name, \
  2314. 0 \
  2315. ); \
  2316. static inline returnType _fn ## className ## name ## impl args
  2317. /// @}
  2318. //=============================================================================
  2319. // Callbacks.
  2320. //=============================================================================
  2321. /// Matching implement for DECLARE_CALLBACK.
  2322. ///
  2323. ///
  2324. /// @warn With the new interop system, method-style callbacks <em>must not</em> be triggered on object
  2325. /// that are being created! This is because the control layer will likely not yet have a fully valid wrapper
  2326. /// object in place for the EngineObject under construction.
  2327. #define IMPLEMENT_CALLBACK( class, name, returnType, args, argNames, usageString ) \
  2328. struct _ ## class ## name ## frame { typedef class ObjectType; }; \
  2329. TORQUE_API _EngineMethodTrampoline< _ ## class ## name ## frame, returnType args >::FunctionType* cb ## class ## _ ## name; \
  2330. TORQUE_API void set_cb ## class ## _ ## name( \
  2331. _EngineMethodTrampoline< _ ## class ## name ## frame, returnType args >::FunctionType fn ) \
  2332. { cb ## class ## _ ## name = fn; } \
  2333. _EngineMethodTrampoline< _ ## class ## name ## frame, returnType args >::FunctionType* cb ## class ## _ ## name; \
  2334. namespace { \
  2335. ::EngineFunctionInfo _cb ## class ## name( \
  2336. #name, \
  2337. &::_SCOPE< class >()(), \
  2338. usageString, \
  2339. "virtual " #returnType " " #name #args, \
  2340. "cb" #class "_" #name, \
  2341. ::TYPE< _EngineMethodTrampoline< _ ## class ## name ## frame, returnType args >::FunctionType >(), \
  2342. NULL, \
  2343. ( void* ) &cb ## class ## _ ## name, \
  2344. EngineFunctionCallout \
  2345. ); \
  2346. } \
  2347. returnType class::name ## _callback args \
  2348. { \
  2349. if( cb ## class ## _ ## name ) { \
  2350. _EngineCallbackHelper cbh( this, reinterpret_cast< const void* >( cb ## class ## _ ## name ) ); \
  2351. return returnType( cbh.call< returnType > argNames ); \
  2352. } \
  2353. if( engineAPI::gUseConsoleInterop ) \
  2354. { \
  2355. static StringTableEntry sName = StringTable->insert( #name ); \
  2356. _EngineConsoleCallbackHelper cbh( sName, this ); \
  2357. return returnType( cbh.call< returnType > argNames ); \
  2358. } \
  2359. return returnType(); \
  2360. } \
  2361. namespace { \
  2362. ConsoleFunctionHeader _ ## class ## name ## header( \
  2363. #returnType, #args, "" ); \
  2364. ConsoleConstructor _ ## class ## name ## obj( #class, #name, usageString, &_ ## class ## name ## header ); \
  2365. }
  2366. /// Used to define global callbacks not associated with
  2367. /// any particular class or namespace.
  2368. #define IMPLEMENT_GLOBAL_CALLBACK( name, returnType, args, argNames, usageString ) \
  2369. DEFINE_CALLOUT( cb ## name, name,, returnType, args, 0, usageString ); \
  2370. returnType name ## _callback args \
  2371. { \
  2372. if( cb ## name ) \
  2373. return returnType( cb ## name argNames ); \
  2374. if( engineAPI::gUseConsoleInterop ) \
  2375. { \
  2376. static StringTableEntry sName = StringTable->insert( #name ); \
  2377. _EngineConsoleCallbackHelper cbh( sName, NULL ); \
  2378. return returnType( cbh.call< returnType > argNames ); \
  2379. } \
  2380. return returnType(); \
  2381. } \
  2382. namespace { \
  2383. ConsoleFunctionHeader _ ## name ## header( \
  2384. #returnType, #args, "" ); \
  2385. ConsoleConstructor _ ## name ## obj( NULL, #name, usageString, &_ ## name ## header ); \
  2386. }
  2387. // Again, temporary macros to allow splicing the API while we still have the console interop around.
  2388. #define IMPLEMENT_CONSOLE_CALLBACK( class, name, returnType, args, argNames, usageString ) \
  2389. returnType class::name ## _callback args \
  2390. { \
  2391. if( engineAPI::gUseConsoleInterop ) \
  2392. { \
  2393. static StringTableEntry sName = StringTable->insert( #name ); \
  2394. _EngineConsoleCallbackHelper cbh( sName, this ); \
  2395. return returnType( cbh.call< returnType > argNames ); \
  2396. } \
  2397. return returnType(); \
  2398. } \
  2399. namespace { \
  2400. ConsoleFunctionHeader _ ## class ## name ## header( \
  2401. #returnType, #args, "" ); \
  2402. ConsoleConstructor _ ## class ## name ## obj( #class, #name, usageString, &_ ## class ## name ## header ); \
  2403. }
  2404. #define IMPLEMENT_NEW_CALLBACK( class, name, returnType, args, argNames, usageString ) \
  2405. struct _ ## class ## name ## frame { typedef class ObjectType; }; \
  2406. TORQUE_API _EngineMethodTrampoline< _ ## class ## name ## frame, returnType args >::FunctionType* cb ## class ## _ ## name; \
  2407. TORQUE_API void set_cb ## class ## _ ## name( \
  2408. _EngineMethodTrampoline< _ ## class ## name ## frame, returnType args >::FunctionType fn ) \
  2409. { cb ## class ## _ ## name = fn; } \
  2410. _EngineMethodTrampoline< _ ## class ## name ## frame, returnType args >::FunctionType* cb ## class ## _ ## name; \
  2411. namespace { \
  2412. ::EngineFunctionInfo _cb ## class ## name( \
  2413. #name, \
  2414. &::_SCOPE< class >()(), \
  2415. usageString, \
  2416. "virtual " #returnType " " #name #args, \
  2417. "cb" #class "_" #name, \
  2418. ::TYPE< _EngineMethodTrampoline< _ ## class ## name ## frame, returnType args >::FunctionType >(), \
  2419. NULL, \
  2420. &cb ## class ## _ ## name, \
  2421. EngineFunctionCallout \
  2422. ); \
  2423. } \
  2424. returnType class::name ## _callback args \
  2425. { \
  2426. if( cb ## class ## _ ## name ) { \
  2427. _EngineCallbackHelper cbh( this, reinterpret_cast< const void* >( cb ## class ## _ ## name ) ); \
  2428. return returnType( cbh.call< returnType > argNames ); \
  2429. } \
  2430. return returnType(); \
  2431. }
  2432. // Internal helper class for doing call-outs in the new interop.
  2433. struct _EngineCallbackHelper
  2434. {
  2435. protected:
  2436. EngineObject* mThis;
  2437. const void* mFn;
  2438. public:
  2439. _EngineCallbackHelper( EngineObject* pThis, const void* fn )
  2440. : mThis( pThis ),
  2441. mFn( fn ) {}
  2442. template< typename R >
  2443. R call() const
  2444. {
  2445. typedef R( FunctionType )( EngineObject* );
  2446. return R( reinterpret_cast< FunctionType* >( const_cast<void*>(mFn) )( mThis ) );
  2447. }
  2448. template< typename R, typename A >
  2449. R call( A a ) const
  2450. {
  2451. typedef R( FunctionType )( EngineObject*, A );
  2452. return R( reinterpret_cast< FunctionType* >( const_cast<void*>(mFn) )( mThis, a ) );
  2453. }
  2454. template< typename R, typename A, typename B >
  2455. R call( A a, B b ) const
  2456. {
  2457. typedef R( FunctionType )( EngineObject*, A, B );
  2458. return R( reinterpret_cast< FunctionType* >( const_cast<void*>(mFn) )( mThis, a, b ) );
  2459. }
  2460. template< typename R, typename A, typename B, typename C >
  2461. R call( A a, B b, C c ) const
  2462. {
  2463. typedef R( FunctionType )( EngineObject*, A, B, C );
  2464. return R( reinterpret_cast< FunctionType* >( const_cast<void*>(mFn) )( mThis, a, b, c ) );
  2465. }
  2466. template< typename R, typename A, typename B, typename C, typename D >
  2467. R call( A a, B b, C c, D d ) const
  2468. {
  2469. typedef R( FunctionType )( EngineObject*, A, B, C, D );
  2470. return R( reinterpret_cast< FunctionType* >( const_cast<void*>(mFn) )( mThis, a, b, c, d ) );
  2471. }
  2472. template< typename R, typename A, typename B, typename C, typename D, typename E >
  2473. R call( A a, B b, C c, D d, E e ) const
  2474. {
  2475. typedef R( FunctionType )( EngineObject*, A, B, C, D, E );
  2476. return R( reinterpret_cast< FunctionType* >( const_cast<void*>(mFn) )( mThis, a, b, c, d, e ) );
  2477. }
  2478. template< typename R, typename A, typename B, typename C, typename D, typename E, typename F >
  2479. R call( A a, B b, C c, D d, E e, F f ) const
  2480. {
  2481. typedef R( FunctionType )( EngineObject*, A, B, C, D, E, F );
  2482. return R( reinterpret_cast< FunctionType* >( const_cast<void*>(mFn) )( mThis, a, b, c, d, e, f ) );
  2483. }
  2484. template< typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G >
  2485. R call( A a, B b, C c, D d, E e, F f, G g ) const
  2486. {
  2487. typedef R( FunctionType )( EngineObject*, A, B, C, D, E, F, G );
  2488. return R( reinterpret_cast< FunctionType* >( const_cast<void*>(mFn) )( mThis, a, b, c, d, e, f, g ) );
  2489. }
  2490. template< typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H >
  2491. R call( A a, B b, C c, D d, E e, F f, G g, H h ) const
  2492. {
  2493. typedef R( FunctionType )( EngineObject*, A, B, C, D, E, F, G, H );
  2494. return R( reinterpret_cast< FunctionType* >( const_cast<void*>(mFn) )( mThis, a, b, c, d, e, f, g, h ) );
  2495. }
  2496. template< typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I >
  2497. R call( A a, B b, C c, D d, E e, F f, G g, H h, I i ) const
  2498. {
  2499. typedef R( FunctionType )( EngineObject*, A, B, C, D, E, F, G, H, I );
  2500. return R( reinterpret_cast< FunctionType* >( const_cast<void*>(mFn) )( mThis, a, b, c, d, e, f, g, h, i ) );
  2501. }
  2502. template< typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I, typename J >
  2503. R call( A a, B b, C c, D d, E e, F f, G g, H h, I i, J j ) const
  2504. {
  2505. typedef R( FunctionType )( EngineObject*, A, B, C, D, E, F, G, H, I, J );
  2506. return R( reinterpret_cast< FunctionType* >( const_cast<void*>(mFn) )( mThis, a, b, c, d, e, f, g, h, i, j ) );
  2507. }
  2508. template< typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I, typename J, typename K >
  2509. R call( A a, B b, C c, D d, E e, F f, G g, H h, I i, J j, K k ) const
  2510. {
  2511. typedef R( FunctionType )( EngineObject*, A, B, C, D, E, F, G, H, I, J, K );
  2512. return R( reinterpret_cast< FunctionType* >( const_cast<void*>(mFn) )( mThis, a, b, c, d, e, f, g, h, i, j, k ) );
  2513. }
  2514. template< typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I, typename J, typename K, typename L >
  2515. R call( A a, B b, C c, D d, E e, F f, G g, H h, I i, J j, K k, L l ) const
  2516. {
  2517. typedef R( FunctionType )( EngineObject*, A, B, C, D, E, F, G, H, I, J, K, L l );
  2518. return R( reinterpret_cast< FunctionType* >( const_cast<void*>(mFn) )( mThis, a, b, c, d, e, f, g, h, i, j, k, l ) );
  2519. }
  2520. };
  2521. // Internal helper for callback support in legacy console system.
  2522. struct _EngineConsoleCallbackHelper
  2523. {
  2524. protected:
  2525. /// Matches up to storeArgs.
  2526. static const U32 MAX_ARGUMENTS = 11;
  2527. SimObject* mThis;
  2528. S32 mArgc;
  2529. ConsoleValueRef mArgv[ MAX_ARGUMENTS + 2 ];
  2530. const char* _exec()
  2531. {
  2532. if( mThis )
  2533. {
  2534. // Cannot invoke callback until object has been registered
  2535. if (mThis->isProperlyAdded()) {
  2536. return Con::execute( mThis, mArgc, mArgv );
  2537. } else {
  2538. Con::resetStackFrame(); // We might have pushed some vars here
  2539. return "";
  2540. }
  2541. }
  2542. else
  2543. return Con::execute( mArgc, mArgv );
  2544. }
  2545. public:
  2546. _EngineConsoleCallbackHelper( StringTableEntry callbackName, SimObject* pThis )
  2547. : mThis( pThis ),
  2548. mArgc( pThis ? 2 : 1 )
  2549. {
  2550. mArgv[ 0 ] = callbackName;
  2551. }
  2552. template< typename R >
  2553. R call()
  2554. {
  2555. return R( EngineUnmarshallData< R >()( _exec() ) );
  2556. }
  2557. template< typename R, typename A >
  2558. R call( A a )
  2559. {
  2560. EngineMarshallData( a, mArgc, mArgv );
  2561. return R( EngineUnmarshallData< R >()( _exec() ) );
  2562. }
  2563. template< typename R, typename A, typename B >
  2564. R call( A a, B b )
  2565. {
  2566. EngineMarshallData( a, mArgc, mArgv );
  2567. EngineMarshallData( b, mArgc, mArgv );
  2568. return R( EngineUnmarshallData< R >()( _exec() ) );
  2569. }
  2570. template< typename R, typename A, typename B, typename C >
  2571. R call( A a, B b, C c )
  2572. {
  2573. EngineMarshallData( a, mArgc, mArgv );
  2574. EngineMarshallData( b, mArgc, mArgv );
  2575. EngineMarshallData( c, mArgc, mArgv );
  2576. return R( EngineUnmarshallData< R >()( _exec() ) );
  2577. }
  2578. template< typename R, typename A, typename B, typename C, typename D >
  2579. R call( A a, B b, C c, D d )
  2580. {
  2581. EngineMarshallData( a, mArgc, mArgv );
  2582. EngineMarshallData( b, mArgc, mArgv );
  2583. EngineMarshallData( c, mArgc, mArgv );
  2584. EngineMarshallData( d, mArgc, mArgv );
  2585. return R( EngineUnmarshallData< R >()( _exec() ) );
  2586. }
  2587. template< typename R, typename A, typename B, typename C, typename D, typename E >
  2588. R call( A a, B b, C c, D d, E e )
  2589. {
  2590. EngineMarshallData( a, mArgc, mArgv );
  2591. EngineMarshallData( b, mArgc, mArgv );
  2592. EngineMarshallData( c, mArgc, mArgv );
  2593. EngineMarshallData( d, mArgc, mArgv );
  2594. EngineMarshallData( e, mArgc, mArgv );
  2595. return R( EngineUnmarshallData< R >()( _exec() ) );
  2596. }
  2597. template< typename R, typename A, typename B, typename C, typename D, typename E, typename F >
  2598. R call( A a, B b, C c, D d, E e, F f )
  2599. {
  2600. EngineMarshallData( a, mArgc, mArgv );
  2601. EngineMarshallData( b, mArgc, mArgv );
  2602. EngineMarshallData( c, mArgc, mArgv );
  2603. EngineMarshallData( d, mArgc, mArgv );
  2604. EngineMarshallData( e, mArgc, mArgv );
  2605. EngineMarshallData( f, mArgc, mArgv );
  2606. return R( EngineUnmarshallData< R >()( _exec() ) );
  2607. }
  2608. template< typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G >
  2609. R call( A a, B b, C c, D d, E e, F f, G g )
  2610. {
  2611. EngineMarshallData( a, mArgc, mArgv );
  2612. EngineMarshallData( b, mArgc, mArgv );
  2613. EngineMarshallData( c, mArgc, mArgv );
  2614. EngineMarshallData( d, mArgc, mArgv );
  2615. EngineMarshallData( e, mArgc, mArgv );
  2616. EngineMarshallData( f, mArgc, mArgv );
  2617. EngineMarshallData( g, mArgc, mArgv );
  2618. return R( EngineUnmarshallData< R >()( _exec() ) );
  2619. }
  2620. template< typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H >
  2621. R call( A a, B b, C c, D d, E e, F f, G g, H h )
  2622. {
  2623. EngineMarshallData( a, mArgc, mArgv );
  2624. EngineMarshallData( b, mArgc, mArgv );
  2625. EngineMarshallData( c, mArgc, mArgv );
  2626. EngineMarshallData( d, mArgc, mArgv );
  2627. EngineMarshallData( e, mArgc, mArgv );
  2628. EngineMarshallData( f, mArgc, mArgv );
  2629. EngineMarshallData( g, mArgc, mArgv );
  2630. EngineMarshallData( h, mArgc, mArgv );
  2631. return R( EngineUnmarshallData< R >()( _exec() ) );
  2632. }
  2633. template< typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I >
  2634. R call( A a, B b, C c, D d, E e, F f, G g, H h, I i )
  2635. {
  2636. EngineMarshallData( a, mArgc, mArgv );
  2637. EngineMarshallData( b, mArgc, mArgv );
  2638. EngineMarshallData( c, mArgc, mArgv );
  2639. EngineMarshallData( d, mArgc, mArgv );
  2640. EngineMarshallData( e, mArgc, mArgv );
  2641. EngineMarshallData( f, mArgc, mArgv );
  2642. EngineMarshallData( g, mArgc, mArgv );
  2643. EngineMarshallData( h, mArgc, mArgv );
  2644. EngineMarshallData( i, mArgc, mArgv );
  2645. return R( EngineUnmarshallData< R >()( _exec() ) );
  2646. }
  2647. template< typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I, typename J >
  2648. R call( A a, B b, C c, D d, E e, F f, G g, H h, I i, J j )
  2649. {
  2650. EngineMarshallData( a, mArgc, mArgv );
  2651. EngineMarshallData( b, mArgc, mArgv );
  2652. EngineMarshallData( c, mArgc, mArgv );
  2653. EngineMarshallData( d, mArgc, mArgv );
  2654. EngineMarshallData( e, mArgc, mArgv );
  2655. EngineMarshallData( f, mArgc, mArgv );
  2656. EngineMarshallData( g, mArgc, mArgv );
  2657. EngineMarshallData( h, mArgc, mArgv );
  2658. EngineMarshallData( i, mArgc, mArgv );
  2659. EngineMarshallData( j, mArgc, mArgv );
  2660. return R( EngineUnmarshallData< R >()( _exec() ) );
  2661. }
  2662. template< typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I, typename J, typename K >
  2663. R call( A a, B b, C c, D d, E e, F f, G g, H h, I i, J j, K k )
  2664. {
  2665. EngineMarshallData( a, mArgc, mArgv );
  2666. EngineMarshallData( b, mArgc, mArgv );
  2667. EngineMarshallData( c, mArgc, mArgv );
  2668. EngineMarshallData( d, mArgc, mArgv );
  2669. EngineMarshallData( e, mArgc, mArgv );
  2670. EngineMarshallData( f, mArgc, mArgv );
  2671. EngineMarshallData( g, mArgc, mArgv );
  2672. EngineMarshallData( h, mArgc, mArgv );
  2673. EngineMarshallData( i, mArgc, mArgv );
  2674. EngineMarshallData( j, mArgc, mArgv );
  2675. EngineMarshallData( k, mArgc, mArgv );
  2676. return R( EngineUnmarshallData< R >()( _exec() ) );
  2677. }
  2678. template< typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I, typename J, typename K, typename L >
  2679. R call( A a, B b, C c, D d, E e, F f, G g, H h, I i, J j, K k, L l )
  2680. {
  2681. EngineMarshallData( a, mArgc, mArgv );
  2682. EngineMarshallData( b, mArgc, mArgv );
  2683. EngineMarshallData( c, mArgc, mArgv );
  2684. EngineMarshallData( d, mArgc, mArgv );
  2685. EngineMarshallData( e, mArgc, mArgv );
  2686. EngineMarshallData( f, mArgc, mArgv );
  2687. EngineMarshallData( g, mArgc, mArgv );
  2688. EngineMarshallData( h, mArgc, mArgv );
  2689. EngineMarshallData( i, mArgc, mArgv );
  2690. EngineMarshallData( j, mArgc, mArgv );
  2691. EngineMarshallData( k, mArgc, mArgv );
  2692. EngineMarshallData( l, mArgc, mArgv );
  2693. return R( EngineUnmarshallData< R >()( _exec() ) );
  2694. }
  2695. };
  2696. // Re-enable some VC warnings we disabled for this file.
  2697. #pragma warning( pop ) // 4510 and 4610
  2698. #endif // !_ENGINEAPI_H_