engineAPI.h 179 KB

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