engineAPI.h 246 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654
  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. // Needed for the executef macros. Blame GCC.
  48. #ifndef _SIMEVENTS_H_
  49. #include "console/simEvents.h"
  50. #endif
  51. /// @file
  52. /// Definitions for exposing engine functionality to the control layer.
  53. ///
  54. /// This file provides a convenience layer around the underlying engine interop system (which at
  55. /// the moment still includes the legacy TorqueScript interop a.k.a. "console system"). The
  56. /// macros exposed here will automatically take care of all marshalling, value type constraints,
  57. /// reflection info instancing, etc. involved in defining engine API call-ins and call-outs.
  58. ///
  59. /// @note At the moment, this file supplies both the legacy TorqueScript console system as well
  60. /// as the new engine export system with the structures and information they need. In the
  61. /// near future, the console-based parts will get purged. This will not result in visible
  62. /// changes to users of the functionality here except for the string-based marshalling
  63. /// functions currently exposed (which will also disappear).
  64. //TODO: Disable warning for extern "C" functions returning UDTs for now; need to take a closer look at this
  65. #pragma warning( disable : 4190 )
  66. // Disable some VC warnings that are irrelevant to us.
  67. #pragma warning( push )
  68. #pragma warning( disable : 4510 ) // default constructor could not be generated; all the Args structures are never constructed by us
  69. #pragma warning( disable : 4610 ) // can never be instantiated; again Args is never constructed by us
  70. namespace engineAPI {
  71. /// Flag for enabling legacy console behavior in the interop system while
  72. /// we still have it around. Will disappear along with console.
  73. extern bool gUseConsoleInterop;
  74. /// Flag to allow engine functions to detect whether the engine had been
  75. /// initialized or shut down.
  76. extern bool gIsInitialized;
  77. }
  78. //FIXME: this allows const char* to be used as a struct field type
  79. // Temp support for allowing const char* to remain in the API functions as long as we
  80. // still have the console system around. When that is purged, these definitions should
  81. // be deleted and all const char* uses be replaced with String.
  82. template<> struct EngineTypeTraits< const char* > : public EngineTypeTraits< String > {};
  83. template<> inline const EngineTypeInfo* TYPE< const char* >() { return TYPE< String >(); }
  84. /// @name Marshalling
  85. ///
  86. /// Functions for converting to/from string-based data representations.
  87. ///
  88. /// @note This functionality is specific to the console interop.
  89. /// @{
  90. /// Marshal a single piece of data from native into client form.
  91. template< typename T >
  92. inline const char* EngineMarshallData( const T& value )
  93. {
  94. return castConsoleTypeToString( value );
  95. }
  96. inline const char* EngineMarshallData( bool value )
  97. {
  98. if( value )
  99. return "1";
  100. else
  101. return "0";
  102. }
  103. inline const char* EngineMarshallData( const char* str )
  104. {
  105. // The API assumes that if you pass a plain "const char*" through it, then you are referring
  106. // to string storage with non-local lifetime that can be safely passed to the control layer.
  107. return str;
  108. }
  109. template< typename T >
  110. inline const char* EngineMarshallData( T* object )
  111. {
  112. return ( object ? object->getIdString() : "0" );
  113. }
  114. template< typename T >
  115. inline const char* EngineMarshallData( const T* object )
  116. {
  117. return ( object ? object->getIdString() : "0" );
  118. }
  119. inline const char* EngineMarshallData( U32 value )
  120. {
  121. return EngineMarshallData( S32( value ) );
  122. }
  123. /// Marshal data from native into client form stored directly in
  124. /// client function invocation vector.
  125. template< typename T >
  126. inline void EngineMarshallData( const T& arg, S32& argc, ConsoleValueRef *argv )
  127. {
  128. argv[ argc ] = castConsoleTypeToString( arg );
  129. argc ++;
  130. }
  131. inline void EngineMarshallData( bool arg, S32& argc, ConsoleValueRef *argv )
  132. {
  133. if( arg )
  134. argv[ argc ] = 1;
  135. else
  136. argv[ argc ] = 0;
  137. argc ++;
  138. }
  139. inline void EngineMarshallData( S32 arg, S32& argc, ConsoleValueRef *argv )
  140. {
  141. argv[ argc ] = arg;
  142. argc ++;
  143. }
  144. inline void EngineMarshallData( U32 arg, S32& argc, ConsoleValueRef *argv )
  145. {
  146. EngineMarshallData( S32( arg ), argc, argv );
  147. }
  148. inline void EngineMarshallData( F32 arg, S32& argc, ConsoleValueRef *argv )
  149. {
  150. argv[ argc ] = arg;
  151. argc ++;
  152. }
  153. inline void EngineMarshallData( const char* arg, S32& argc, ConsoleValueRef *argv )
  154. {
  155. argv[ argc ] = arg;
  156. argc ++;
  157. }
  158. inline void EngineMarshallData( char* arg, S32& argc, ConsoleValueRef *argv )
  159. {
  160. argv[ argc ] = arg;
  161. argc ++;
  162. }
  163. template< typename T >
  164. inline void EngineMarshallData( T* object, S32& argc, ConsoleValueRef *argv )
  165. {
  166. argv[ argc ] = object ? object->getId() : 0;
  167. argc ++;
  168. }
  169. template< typename T >
  170. inline void EngineMarshallData( const T* object, S32& argc, ConsoleValueRef *argv )
  171. {
  172. argv[ argc ] = object ? object->getId() : 0;
  173. argc ++;
  174. }
  175. /// Unmarshal data from client form to engine form.
  176. ///
  177. /// This is wrapped in an a struct as partial specializations on function
  178. /// templates are not allowed in C++.
  179. template< typename T >
  180. struct EngineUnmarshallData
  181. {
  182. T operator()( const char* str ) const
  183. {
  184. T value;
  185. castConsoleTypeFromString( value, str );
  186. return value;
  187. }
  188. };
  189. template<>
  190. struct EngineUnmarshallData< S32 >
  191. {
  192. S32 operator()( ConsoleValueRef &ref ) const
  193. {
  194. return (S32)ref;
  195. }
  196. S32 operator()( const char* str ) const
  197. {
  198. return dAtoi( str );
  199. }
  200. };
  201. template<>
  202. struct EngineUnmarshallData< U32 >
  203. {
  204. U32 operator()( ConsoleValueRef &ref ) const
  205. {
  206. return (U32)((S32)ref);
  207. }
  208. U32 operator()( const char* str ) const
  209. {
  210. return dAtoui( str );
  211. }
  212. };
  213. template<>
  214. struct EngineUnmarshallData< F32 >
  215. {
  216. F32 operator()( ConsoleValueRef &ref ) const
  217. {
  218. return (F32)ref;
  219. }
  220. F32 operator()( const char* str ) const
  221. {
  222. return dAtof( str );
  223. }
  224. };
  225. template<>
  226. struct EngineUnmarshallData< U8 >
  227. {
  228. U8 operator()( ConsoleValueRef &ref ) const
  229. {
  230. return (U8)((S32)ref);
  231. }
  232. U8 operator()( const char* str ) const
  233. {
  234. return dAtoui( str );
  235. }
  236. };
  237. template<>
  238. struct EngineUnmarshallData< const char* >
  239. {
  240. const char* operator()( ConsoleValueRef &ref ) const
  241. {
  242. return ref.getStringValue();
  243. }
  244. const char* operator()( const char* str ) const
  245. {
  246. return str;
  247. }
  248. };
  249. template< typename T >
  250. struct EngineUnmarshallData< T* >
  251. {
  252. T* operator()( ConsoleValueRef &ref ) const
  253. {
  254. return dynamic_cast< T* >( Sim::findObject( ref.getStringValue() ) );
  255. }
  256. T* operator()( const char* str ) const
  257. {
  258. return dynamic_cast< T* >( Sim::findObject( str ) );
  259. }
  260. };
  261. template<>
  262. struct EngineUnmarshallData< void >
  263. {
  264. void operator()( ConsoleValueRef& ) const {}
  265. void operator()( const char* ) const {}
  266. };
  267. template<>
  268. struct EngineUnmarshallData< ConsoleValueRef >
  269. {
  270. ConsoleValueRef operator()( ConsoleValueRef ref ) const
  271. {
  272. return ref;
  273. }
  274. };
  275. /// @}
  276. /// @name C to C++ Trampolines
  277. ///
  278. /// The trampolines serve two purposes:
  279. ///
  280. /// For one, they ensure that no matter what argument types are specified by users of the engine API macros, the correct
  281. /// argument value types are enforced on the functions exported by the engine. Let's say, for example, the user writes
  282. /// a function that takes a "Point3F direction" argument, then the template machinery here will automatically expose an
  283. /// API function that takes a "Point3F& direction" argument.
  284. ///
  285. /// Secondly, the templates jump the incoming calls from extern "C" space into C++ space. This is mostly relevant for
  286. /// methods only as they will need an implicit object type argument.
  287. ///
  288. /// @{
  289. // Helper type to factor out commonalities between function and method trampolines.
  290. template< typename T >
  291. struct _EngineTrampoline
  292. {
  293. struct Args {};
  294. };
  295. template< typename R, typename A >
  296. struct _EngineTrampoline< R( A ) >
  297. {
  298. struct Args
  299. {
  300. char data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) ];
  301. typename EngineTypeTraits< A >::ValueType a() const
  302. {
  303. return EngineTypeTraits< A >::ArgumentToValue(
  304. *( reinterpret_cast< const typename EngineTypeTraits< A >::ArgumentValueType* >
  305. ( &data[ 0 ] ) ) );
  306. }
  307. };
  308. };
  309. template< typename R, typename A, typename B >
  310. struct _EngineTrampoline< R( A, B ) >
  311. {
  312. struct Args
  313. {
  314. char data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  315. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) ];
  316. typename EngineTypeTraits< A >::ValueType a() const
  317. {
  318. return EngineTypeTraits< A >::ArgumentToValue(
  319. *( reinterpret_cast< const typename EngineTypeTraits< A >::ArgumentValueType* >
  320. ( &data[ 0 ] ) ) );
  321. }
  322. typename EngineTypeTraits< B >::ValueType b() const
  323. {
  324. return EngineTypeTraits< B >::ArgumentToValue(
  325. *( reinterpret_cast< const typename EngineTypeTraits< B >::ArgumentValueType* >
  326. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) ] ) ) );
  327. }
  328. };
  329. };
  330. template< typename R, typename A, typename B, typename C >
  331. struct _EngineTrampoline< R( A, B, C ) >
  332. {
  333. struct Args
  334. {
  335. char data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  336. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  337. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) ];
  338. typename EngineTypeTraits< A >::ValueType a() const
  339. {
  340. return EngineTypeTraits< A >::ArgumentToValue(
  341. *( reinterpret_cast< const typename EngineTypeTraits< A >::ArgumentValueType* >
  342. ( &data[ 0 ] ) ) );
  343. }
  344. typename EngineTypeTraits< B >::ValueType b() const
  345. {
  346. return EngineTypeTraits< B >::ArgumentToValue(
  347. *( reinterpret_cast< const typename EngineTypeTraits< B >::ArgumentValueType* >
  348. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) ] ) ) );
  349. }
  350. typename EngineTypeTraits< C >::ValueType c() const
  351. {
  352. return EngineTypeTraits< C >::ArgumentToValue(
  353. *( reinterpret_cast< const typename EngineTypeTraits< C >::ArgumentValueType* >
  354. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  355. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) ] ) ) );
  356. }
  357. };
  358. };
  359. template< typename R, typename A, typename B, typename C, typename D >
  360. struct _EngineTrampoline< R( A, B, C, D ) >
  361. {
  362. struct Args
  363. {
  364. char data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  365. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  366. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  367. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) ];
  368. typename EngineTypeTraits< A >::ValueType a() const
  369. {
  370. return EngineTypeTraits< A >::ArgumentToValue(
  371. *( reinterpret_cast< const typename EngineTypeTraits< A >::ArgumentValueType* >
  372. ( &data[ 0 ] ) ) );
  373. }
  374. typename EngineTypeTraits< B >::ValueType b() const
  375. {
  376. return EngineTypeTraits< B >::ArgumentToValue(
  377. *( reinterpret_cast< const typename EngineTypeTraits< B >::ArgumentValueType* >
  378. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) ] ) ) );
  379. }
  380. typename EngineTypeTraits< C >::ValueType c() const
  381. {
  382. return EngineTypeTraits< C >::ArgumentToValue(
  383. *( reinterpret_cast< const typename EngineTypeTraits< C >::ArgumentValueType* >
  384. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  385. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) ] ) ) );
  386. }
  387. typename EngineTypeTraits< D >::ValueType d() const
  388. {
  389. return EngineTypeTraits< D >::ArgumentToValue(
  390. *( reinterpret_cast< const typename EngineTypeTraits< D >::ArgumentValueType* >
  391. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  392. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  393. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) ] ) ) );
  394. }
  395. };
  396. };
  397. template< typename R, typename A, typename B, typename C, typename D, typename E >
  398. struct _EngineTrampoline< R( A, B, C, D, E ) >
  399. {
  400. struct Args
  401. {
  402. char data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  403. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  404. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  405. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) +
  406. sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) ];
  407. typename EngineTypeTraits< A >::ValueType a() const
  408. {
  409. return EngineTypeTraits< A >::ArgumentToValue(
  410. *( reinterpret_cast< const typename EngineTypeTraits< A >::ArgumentValueType* >
  411. ( &data[ 0 ] ) ) );
  412. }
  413. typename EngineTypeTraits< B >::ValueType b() const
  414. {
  415. return EngineTypeTraits< B >::ArgumentToValue(
  416. *( reinterpret_cast< const typename EngineTypeTraits< B >::ArgumentValueType* >
  417. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) ] ) ) );
  418. }
  419. typename EngineTypeTraits< C >::ValueType c() const
  420. {
  421. return EngineTypeTraits< C >::ArgumentToValue(
  422. *( reinterpret_cast< const typename EngineTypeTraits< C >::ArgumentValueType* >
  423. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  424. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) ] ) ) );
  425. }
  426. typename EngineTypeTraits< D >::ValueType d() const
  427. {
  428. return EngineTypeTraits< D >::ArgumentToValue(
  429. *( reinterpret_cast< const typename EngineTypeTraits< D >::ArgumentValueType* >
  430. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  431. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  432. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) ] ) ) );
  433. }
  434. typename EngineTypeTraits< E >::ValueType e() const
  435. {
  436. return EngineTypeTraits< E >::ArgumentToValue(
  437. *( reinterpret_cast< const typename EngineTypeTraits< E >::ArgumentValueType* >
  438. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  439. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  440. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  441. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) ] ) ) );
  442. }
  443. };
  444. };
  445. template< typename R, typename A, typename B, typename C, typename D, typename E, typename F >
  446. struct _EngineTrampoline< R( A, B, C, D, E, F ) >
  447. {
  448. struct Args
  449. {
  450. char data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  451. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  452. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  453. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) +
  454. sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) +
  455. sizeof( typename EngineTypeTraits< F >::ArgumentValueType ) ];
  456. typename EngineTypeTraits< A >::ValueType a() const
  457. {
  458. return EngineTypeTraits< A >::ArgumentToValue(
  459. *( reinterpret_cast< const typename EngineTypeTraits< A >::ArgumentValueType* >
  460. ( &data[ 0 ] ) ) );
  461. }
  462. typename EngineTypeTraits< B >::ValueType b() const
  463. {
  464. return EngineTypeTraits< B >::ArgumentToValue(
  465. *( reinterpret_cast< const typename EngineTypeTraits< B >::ArgumentValueType* >
  466. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) ] ) ) );
  467. }
  468. typename EngineTypeTraits< C >::ValueType c() const
  469. {
  470. return EngineTypeTraits< C >::ArgumentToValue(
  471. *( reinterpret_cast< const typename EngineTypeTraits< C >::ArgumentValueType* >
  472. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  473. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) ] ) ) );
  474. }
  475. typename EngineTypeTraits< D >::ValueType d() const
  476. {
  477. return EngineTypeTraits< D >::ArgumentToValue(
  478. *( reinterpret_cast< const typename EngineTypeTraits< D >::ArgumentValueType* >
  479. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  480. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  481. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) ] ) ) );
  482. }
  483. typename EngineTypeTraits< E >::ValueType e() const
  484. {
  485. return EngineTypeTraits< E >::ArgumentToValue(
  486. *( reinterpret_cast< const typename EngineTypeTraits< E >::ArgumentValueType* >
  487. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  488. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  489. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  490. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) ] ) ) );
  491. }
  492. typename EngineTypeTraits< F >::ValueType f() const
  493. {
  494. return EngineTypeTraits< F >::ArgumentToValue(
  495. *( reinterpret_cast< const typename EngineTypeTraits< F >::ArgumentValueType* >
  496. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  497. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  498. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  499. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) +
  500. sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) ] ) ) );
  501. }
  502. };
  503. };
  504. template< typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G >
  505. struct _EngineTrampoline< R( A, B, C, D, E, F, G ) >
  506. {
  507. struct Args
  508. {
  509. char 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. sizeof( typename EngineTypeTraits< G >::ArgumentValueType ) ];
  516. typename EngineTypeTraits< A >::ValueType a() const
  517. {
  518. return EngineTypeTraits< A >::ArgumentToValue(
  519. *( reinterpret_cast< const typename EngineTypeTraits< A >::ArgumentValueType* >
  520. ( &data[ 0 ] ) ) );
  521. }
  522. typename EngineTypeTraits< B >::ValueType b() const
  523. {
  524. return EngineTypeTraits< B >::ArgumentToValue(
  525. *( reinterpret_cast< const typename EngineTypeTraits< B >::ArgumentValueType* >
  526. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) ] ) ) );
  527. }
  528. typename EngineTypeTraits< C >::ValueType c() const
  529. {
  530. return EngineTypeTraits< C >::ArgumentToValue(
  531. *( reinterpret_cast< const typename EngineTypeTraits< C >::ArgumentValueType* >
  532. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  533. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) ] ) ) );
  534. }
  535. typename EngineTypeTraits< D >::ValueType d() const
  536. {
  537. return EngineTypeTraits< D >::ArgumentToValue(
  538. *( reinterpret_cast< const typename EngineTypeTraits< D >::ArgumentValueType* >
  539. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  540. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  541. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) ] ) ) );
  542. }
  543. typename EngineTypeTraits< E >::ValueType e() const
  544. {
  545. return EngineTypeTraits< E >::ArgumentToValue(
  546. *( reinterpret_cast< const typename EngineTypeTraits< E >::ArgumentValueType* >
  547. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  548. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  549. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  550. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) ] ) ) );
  551. }
  552. typename EngineTypeTraits< F >::ValueType f() const
  553. {
  554. return EngineTypeTraits< F >::ArgumentToValue(
  555. *( reinterpret_cast< const typename EngineTypeTraits< F >::ArgumentValueType* >
  556. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  557. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  558. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  559. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) +
  560. sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) ] ) ) );
  561. }
  562. typename EngineTypeTraits< G >::ValueType g() const
  563. {
  564. return EngineTypeTraits< G >::ArgumentToValue(
  565. *( reinterpret_cast< const typename EngineTypeTraits< G >::ArgumentValueType* >
  566. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  567. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  568. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  569. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) +
  570. sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) +
  571. sizeof( typename EngineTypeTraits< F >::ArgumentValueType ) ] ) ) );
  572. }
  573. };
  574. };
  575. template< typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H >
  576. struct _EngineTrampoline< R( A, B, C, D, E, F, G, H ) >
  577. {
  578. struct Args
  579. {
  580. char 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. sizeof( typename EngineTypeTraits< G >::ArgumentValueType ) +
  587. sizeof( typename EngineTypeTraits< H >::ArgumentValueType ) ];
  588. typename EngineTypeTraits< A >::ValueType a() const
  589. {
  590. return EngineTypeTraits< A >::ArgumentToValue(
  591. *( reinterpret_cast< const typename EngineTypeTraits< A >::ArgumentValueType* >
  592. ( &data[ 0 ] ) ) );
  593. }
  594. typename EngineTypeTraits< B >::ValueType b() const
  595. {
  596. return EngineTypeTraits< B >::ArgumentToValue(
  597. *( reinterpret_cast< const typename EngineTypeTraits< B >::ArgumentValueType* >
  598. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) ] ) ) );
  599. }
  600. typename EngineTypeTraits< C >::ValueType c() const
  601. {
  602. return EngineTypeTraits< C >::ArgumentToValue(
  603. *( reinterpret_cast< const typename EngineTypeTraits< C >::ArgumentValueType* >
  604. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  605. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) ] ) ) );
  606. }
  607. typename EngineTypeTraits< D >::ValueType d() const
  608. {
  609. return EngineTypeTraits< D >::ArgumentToValue(
  610. *( reinterpret_cast< const typename EngineTypeTraits< D >::ArgumentValueType* >
  611. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  612. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  613. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) ] ) ) );
  614. }
  615. typename EngineTypeTraits< E >::ValueType e() const
  616. {
  617. return EngineTypeTraits< E >::ArgumentToValue(
  618. *( reinterpret_cast< const typename EngineTypeTraits< E >::ArgumentValueType* >
  619. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  620. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  621. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  622. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) ] ) ) );
  623. }
  624. typename EngineTypeTraits< F >::ValueType f() const
  625. {
  626. return EngineTypeTraits< F >::ArgumentToValue(
  627. *( reinterpret_cast< const typename EngineTypeTraits< F >::ArgumentValueType* >
  628. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  629. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  630. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  631. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) +
  632. sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) ] ) ) );
  633. }
  634. typename EngineTypeTraits< G >::ValueType g() const
  635. {
  636. return EngineTypeTraits< G >::ArgumentToValue(
  637. *( reinterpret_cast< const typename EngineTypeTraits< G >::ArgumentValueType* >
  638. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  639. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  640. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  641. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) +
  642. sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) +
  643. sizeof( typename EngineTypeTraits< F >::ArgumentValueType ) ] ) ) );
  644. }
  645. typename EngineTypeTraits< H >::ValueType h() const
  646. {
  647. return EngineTypeTraits< H >::ArgumentToValue(
  648. *( reinterpret_cast< const typename EngineTypeTraits< H >::ArgumentValueType* >
  649. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  650. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  651. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  652. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) +
  653. sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) +
  654. sizeof( typename EngineTypeTraits< F >::ArgumentValueType ) +
  655. sizeof( typename EngineTypeTraits< G >::ArgumentValueType ) ] ) ) );
  656. }
  657. };
  658. };
  659. template< typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I >
  660. struct _EngineTrampoline< R( A, B, C, D, E, F, G, H, I ) >
  661. {
  662. struct Args
  663. {
  664. char 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. sizeof( typename EngineTypeTraits< G >::ArgumentValueType ) +
  671. sizeof( typename EngineTypeTraits< H >::ArgumentValueType ) +
  672. sizeof( typename EngineTypeTraits< I >::ArgumentValueType ) ];
  673. typename EngineTypeTraits< A >::ValueType a() const
  674. {
  675. return EngineTypeTraits< A >::ArgumentToValue(
  676. *( reinterpret_cast< const typename EngineTypeTraits< A >::ArgumentValueType* >
  677. ( &data[ 0 ] ) ) );
  678. }
  679. typename EngineTypeTraits< B >::ValueType b() const
  680. {
  681. return EngineTypeTraits< B >::ArgumentToValue(
  682. *( reinterpret_cast< const typename EngineTypeTraits< B >::ArgumentValueType* >
  683. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) ] ) ) );
  684. }
  685. typename EngineTypeTraits< C >::ValueType c() const
  686. {
  687. return EngineTypeTraits< C >::ArgumentToValue(
  688. *( reinterpret_cast< const typename EngineTypeTraits< C >::ArgumentValueType* >
  689. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  690. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) ] ) ) );
  691. }
  692. typename EngineTypeTraits< D >::ValueType d() const
  693. {
  694. return EngineTypeTraits< D >::ArgumentToValue(
  695. *( reinterpret_cast< const typename EngineTypeTraits< D >::ArgumentValueType* >
  696. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  697. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  698. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) ] ) ) );
  699. }
  700. typename EngineTypeTraits< E >::ValueType e() const
  701. {
  702. return EngineTypeTraits< E >::ArgumentToValue(
  703. *( reinterpret_cast< const typename EngineTypeTraits< E >::ArgumentValueType* >
  704. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  705. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  706. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  707. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) ] ) ) );
  708. }
  709. typename EngineTypeTraits< F >::ValueType f() const
  710. {
  711. return EngineTypeTraits< F >::ArgumentToValue(
  712. *( reinterpret_cast< const typename EngineTypeTraits< F >::ArgumentValueType* >
  713. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  714. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  715. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  716. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) +
  717. sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) ] ) ) );
  718. }
  719. typename EngineTypeTraits< G >::ValueType g() const
  720. {
  721. return EngineTypeTraits< G >::ArgumentToValue(
  722. *( reinterpret_cast< const typename EngineTypeTraits< G >::ArgumentValueType* >
  723. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  724. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  725. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  726. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) +
  727. sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) +
  728. sizeof( typename EngineTypeTraits< F >::ArgumentValueType ) ] ) ) );
  729. }
  730. typename EngineTypeTraits< H >::ValueType h() const
  731. {
  732. return EngineTypeTraits< H >::ArgumentToValue(
  733. *( reinterpret_cast< const typename EngineTypeTraits< H >::ArgumentValueType* >
  734. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  735. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  736. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  737. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) +
  738. sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) +
  739. sizeof( typename EngineTypeTraits< F >::ArgumentValueType ) +
  740. sizeof( typename EngineTypeTraits< G >::ArgumentValueType ) ] ) ) );
  741. }
  742. typename EngineTypeTraits< I >::ValueType i() const
  743. {
  744. return EngineTypeTraits< I >::ArgumentToValue(
  745. *( reinterpret_cast< const typename EngineTypeTraits< I >::ArgumentValueType* >
  746. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  747. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  748. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  749. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) +
  750. sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) +
  751. sizeof( typename EngineTypeTraits< F >::ArgumentValueType ) +
  752. sizeof( typename EngineTypeTraits< G >::ArgumentValueType ) +
  753. sizeof( typename EngineTypeTraits< H >::ArgumentValueType ) ] ) ) );
  754. }
  755. };
  756. };
  757. template< typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I, typename J >
  758. struct _EngineTrampoline< R( A, B, C, D, E, F, G, H, I, J ) >
  759. {
  760. struct Args
  761. {
  762. char 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. sizeof( typename EngineTypeTraits< G >::ArgumentValueType ) +
  769. sizeof( typename EngineTypeTraits< H >::ArgumentValueType ) +
  770. sizeof( typename EngineTypeTraits< I >::ArgumentValueType ) +
  771. sizeof( typename EngineTypeTraits< J >::ArgumentValueType ) ];
  772. typename EngineTypeTraits< A >::ValueType a() const
  773. {
  774. return EngineTypeTraits< A >::ArgumentToValue(
  775. *( reinterpret_cast< const typename EngineTypeTraits< A >::ArgumentValueType* >
  776. ( &data[ 0 ] ) ) );
  777. }
  778. typename EngineTypeTraits< B >::ValueType b() const
  779. {
  780. return EngineTypeTraits< B >::ArgumentToValue(
  781. *( reinterpret_cast< const typename EngineTypeTraits< B >::ArgumentValueType* >
  782. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) ] ) ) );
  783. }
  784. typename EngineTypeTraits< C >::ValueType c() const
  785. {
  786. return EngineTypeTraits< C >::ArgumentToValue(
  787. *( reinterpret_cast< const typename EngineTypeTraits< C >::ArgumentValueType* >
  788. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  789. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) ] ) ) );
  790. }
  791. typename EngineTypeTraits< D >::ValueType d() const
  792. {
  793. return EngineTypeTraits< D >::ArgumentToValue(
  794. *( reinterpret_cast< const typename EngineTypeTraits< D >::ArgumentValueType* >
  795. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  796. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  797. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) ] ) ) );
  798. }
  799. typename EngineTypeTraits< E >::ValueType e() const
  800. {
  801. return EngineTypeTraits< E >::ArgumentToValue(
  802. *( reinterpret_cast< const typename EngineTypeTraits< E >::ArgumentValueType* >
  803. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  804. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  805. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  806. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) ] ) ) );
  807. }
  808. typename EngineTypeTraits< F >::ValueType f() const
  809. {
  810. return EngineTypeTraits< F >::ArgumentToValue(
  811. *( reinterpret_cast< const typename EngineTypeTraits< F >::ArgumentValueType* >
  812. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  813. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  814. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  815. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) +
  816. sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) ] ) ) );
  817. }
  818. typename EngineTypeTraits< G >::ValueType g() const
  819. {
  820. return EngineTypeTraits< G >::ArgumentToValue(
  821. *( reinterpret_cast< const typename EngineTypeTraits< G >::ArgumentValueType* >
  822. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  823. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  824. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  825. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) +
  826. sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) +
  827. sizeof( typename EngineTypeTraits< F >::ArgumentValueType ) ] ) ) );
  828. }
  829. typename EngineTypeTraits< H >::ValueType h() const
  830. {
  831. return EngineTypeTraits< H >::ArgumentToValue(
  832. *( reinterpret_cast< const typename EngineTypeTraits< H >::ArgumentValueType* >
  833. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  834. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  835. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  836. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) +
  837. sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) +
  838. sizeof( typename EngineTypeTraits< F >::ArgumentValueType ) +
  839. sizeof( typename EngineTypeTraits< G >::ArgumentValueType ) ] ) ) );
  840. }
  841. typename EngineTypeTraits< I >::ValueType i() const
  842. {
  843. return EngineTypeTraits< I >::ArgumentToValue(
  844. *( reinterpret_cast< const typename EngineTypeTraits< I >::ArgumentValueType* >
  845. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  846. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  847. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  848. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) +
  849. sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) +
  850. sizeof( typename EngineTypeTraits< F >::ArgumentValueType ) +
  851. sizeof( typename EngineTypeTraits< G >::ArgumentValueType ) +
  852. sizeof( typename EngineTypeTraits< H >::ArgumentValueType ) ] ) ) );
  853. }
  854. typename EngineTypeTraits< J >::ValueType j() const
  855. {
  856. return EngineTypeTraits< J >::ArgumentToValue(
  857. *( reinterpret_cast< const typename EngineTypeTraits< J >::ArgumentValueType* >
  858. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  859. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  860. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  861. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) +
  862. sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) +
  863. sizeof( typename EngineTypeTraits< F >::ArgumentValueType ) +
  864. sizeof( typename EngineTypeTraits< G >::ArgumentValueType ) +
  865. sizeof( typename EngineTypeTraits< H >::ArgumentValueType ) +
  866. sizeof( typename EngineTypeTraits< I >::ArgumentValueType ) ] ) ) );
  867. }
  868. };
  869. };
  870. 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 >
  871. struct _EngineTrampoline< R( A, B, C, D, E, F, G, H, I, J, K ) >
  872. {
  873. struct Args
  874. {
  875. char 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. sizeof( typename EngineTypeTraits< G >::ArgumentValueType ) +
  882. sizeof( typename EngineTypeTraits< H >::ArgumentValueType ) +
  883. sizeof( typename EngineTypeTraits< I >::ArgumentValueType ) +
  884. sizeof( typename EngineTypeTraits< J >::ArgumentValueType ) +
  885. sizeof( typename EngineTypeTraits< K >::ArgumentValueType ) ];
  886. typename EngineTypeTraits< A >::ValueType a() const
  887. {
  888. return EngineTypeTraits< A >::ArgumentToValue(
  889. *( reinterpret_cast< const typename EngineTypeTraits< A >::ArgumentValueType* >
  890. ( &data[ 0 ] ) ) );
  891. }
  892. typename EngineTypeTraits< B >::ValueType b() const
  893. {
  894. return EngineTypeTraits< B >::ArgumentToValue(
  895. *( reinterpret_cast< const typename EngineTypeTraits< B >::ArgumentValueType* >
  896. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) ] ) ) );
  897. }
  898. typename EngineTypeTraits< C >::ValueType c() const
  899. {
  900. return EngineTypeTraits< C >::ArgumentToValue(
  901. *( reinterpret_cast< const typename EngineTypeTraits< C >::ArgumentValueType* >
  902. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  903. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) ] ) ) );
  904. }
  905. typename EngineTypeTraits< D >::ValueType d() const
  906. {
  907. return EngineTypeTraits< D >::ArgumentToValue(
  908. *( reinterpret_cast< const typename EngineTypeTraits< D >::ArgumentValueType* >
  909. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  910. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  911. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) ] ) ) );
  912. }
  913. typename EngineTypeTraits< E >::ValueType e() const
  914. {
  915. return EngineTypeTraits< E >::ArgumentToValue(
  916. *( reinterpret_cast< const typename EngineTypeTraits< E >::ArgumentValueType* >
  917. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  918. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  919. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  920. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) ] ) ) );
  921. }
  922. typename EngineTypeTraits< F >::ValueType f() const
  923. {
  924. return EngineTypeTraits< F >::ArgumentToValue(
  925. *( reinterpret_cast< const typename EngineTypeTraits< F >::ArgumentValueType* >
  926. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  927. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  928. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  929. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) +
  930. sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) ] ) ) );
  931. }
  932. typename EngineTypeTraits< G >::ValueType g() const
  933. {
  934. return EngineTypeTraits< G >::ArgumentToValue(
  935. *( reinterpret_cast< const typename EngineTypeTraits< G >::ArgumentValueType* >
  936. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  937. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  938. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  939. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) +
  940. sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) +
  941. sizeof( typename EngineTypeTraits< F >::ArgumentValueType ) ] ) ) );
  942. }
  943. typename EngineTypeTraits< H >::ValueType h() const
  944. {
  945. return EngineTypeTraits< H >::ArgumentToValue(
  946. *( reinterpret_cast< const typename EngineTypeTraits< H >::ArgumentValueType* >
  947. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  948. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  949. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  950. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) +
  951. sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) +
  952. sizeof( typename EngineTypeTraits< F >::ArgumentValueType ) +
  953. sizeof( typename EngineTypeTraits< G >::ArgumentValueType ) ] ) ) );
  954. }
  955. typename EngineTypeTraits< I >::ValueType i() const
  956. {
  957. return EngineTypeTraits< I >::ArgumentToValue(
  958. *( reinterpret_cast< const typename EngineTypeTraits< I >::ArgumentValueType* >
  959. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  960. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  961. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  962. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) +
  963. sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) +
  964. sizeof( typename EngineTypeTraits< F >::ArgumentValueType ) +
  965. sizeof( typename EngineTypeTraits< G >::ArgumentValueType ) +
  966. sizeof( typename EngineTypeTraits< H >::ArgumentValueType ) ] ) ) );
  967. }
  968. typename EngineTypeTraits< J >::ValueType j() const
  969. {
  970. return EngineTypeTraits< J >::ArgumentToValue(
  971. *( reinterpret_cast< const typename EngineTypeTraits< J >::ArgumentValueType* >
  972. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  973. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  974. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  975. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) +
  976. sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) +
  977. sizeof( typename EngineTypeTraits< F >::ArgumentValueType ) +
  978. sizeof( typename EngineTypeTraits< G >::ArgumentValueType ) +
  979. sizeof( typename EngineTypeTraits< H >::ArgumentValueType ) +
  980. sizeof( typename EngineTypeTraits< I >::ArgumentValueType ) ] ) ) );
  981. }
  982. typename EngineTypeTraits< K >::ValueType k() const
  983. {
  984. return EngineTypeTraits< K >::ArgumentToValue(
  985. *( reinterpret_cast< const typename EngineTypeTraits< K >::ArgumentValueType* >
  986. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  987. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  988. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  989. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) +
  990. sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) +
  991. sizeof( typename EngineTypeTraits< F >::ArgumentValueType ) +
  992. sizeof( typename EngineTypeTraits< G >::ArgumentValueType ) +
  993. sizeof( typename EngineTypeTraits< H >::ArgumentValueType ) +
  994. sizeof( typename EngineTypeTraits< I >::ArgumentValueType ) +
  995. sizeof( typename EngineTypeTraits< J >::ArgumentValueType ) ] ) ) );
  996. }
  997. };
  998. };
  999. 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 >
  1000. struct _EngineTrampoline< R( A, B, C, D, E, F, G, H, I, J, K, L ) >
  1001. {
  1002. struct Args
  1003. {
  1004. char data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  1005. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  1006. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  1007. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) +
  1008. sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) +
  1009. sizeof( typename EngineTypeTraits< F >::ArgumentValueType ) +
  1010. sizeof( typename EngineTypeTraits< G >::ArgumentValueType ) +
  1011. sizeof( typename EngineTypeTraits< H >::ArgumentValueType ) +
  1012. sizeof( typename EngineTypeTraits< I >::ArgumentValueType ) +
  1013. sizeof( typename EngineTypeTraits< J >::ArgumentValueType ) +
  1014. sizeof( typename EngineTypeTraits< K >::ArgumentValueType ) +
  1015. sizeof( typename EngineTypeTraits< L >::ArgumentValueType ) ];
  1016. typename EngineTypeTraits< A >::ValueType a() const
  1017. {
  1018. return EngineTypeTraits< A >::ArgumentToValue(
  1019. *( reinterpret_cast< const typename EngineTypeTraits< A >::ArgumentValueType* >
  1020. ( &data[ 0 ] ) ) );
  1021. }
  1022. typename EngineTypeTraits< B >::ValueType b() const
  1023. {
  1024. return EngineTypeTraits< B >::ArgumentToValue(
  1025. *( reinterpret_cast< const typename EngineTypeTraits< B >::ArgumentValueType* >
  1026. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) ] ) ) );
  1027. }
  1028. typename EngineTypeTraits< C >::ValueType c() const
  1029. {
  1030. return EngineTypeTraits< C >::ArgumentToValue(
  1031. *( reinterpret_cast< const typename EngineTypeTraits< C >::ArgumentValueType* >
  1032. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  1033. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) ] ) ) );
  1034. }
  1035. typename EngineTypeTraits< D >::ValueType d() const
  1036. {
  1037. return EngineTypeTraits< D >::ArgumentToValue(
  1038. *( reinterpret_cast< const typename EngineTypeTraits< D >::ArgumentValueType* >
  1039. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  1040. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  1041. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) ] ) ) );
  1042. }
  1043. typename EngineTypeTraits< E >::ValueType e() const
  1044. {
  1045. return EngineTypeTraits< E >::ArgumentToValue(
  1046. *( reinterpret_cast< const typename EngineTypeTraits< E >::ArgumentValueType* >
  1047. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  1048. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  1049. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  1050. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) ] ) ) );
  1051. }
  1052. typename EngineTypeTraits< F >::ValueType f() const
  1053. {
  1054. return EngineTypeTraits< F >::ArgumentToValue(
  1055. *( reinterpret_cast< const typename EngineTypeTraits< F >::ArgumentValueType* >
  1056. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  1057. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  1058. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  1059. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) +
  1060. sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) ] ) ) );
  1061. }
  1062. typename EngineTypeTraits< G >::ValueType g() const
  1063. {
  1064. return EngineTypeTraits< G >::ArgumentToValue(
  1065. *( reinterpret_cast< const typename EngineTypeTraits< G >::ArgumentValueType* >
  1066. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  1067. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  1068. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  1069. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) +
  1070. sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) +
  1071. sizeof( typename EngineTypeTraits< F >::ArgumentValueType ) ] ) ) );
  1072. }
  1073. typename EngineTypeTraits< H >::ValueType h() const
  1074. {
  1075. return EngineTypeTraits< H >::ArgumentToValue(
  1076. *( reinterpret_cast< const typename EngineTypeTraits< H >::ArgumentValueType* >
  1077. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  1078. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  1079. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  1080. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) +
  1081. sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) +
  1082. sizeof( typename EngineTypeTraits< F >::ArgumentValueType ) +
  1083. sizeof( typename EngineTypeTraits< G >::ArgumentValueType ) ] ) ) );
  1084. }
  1085. typename EngineTypeTraits< I >::ValueType i() const
  1086. {
  1087. return EngineTypeTraits< I >::ArgumentToValue(
  1088. *( reinterpret_cast< const typename EngineTypeTraits< I >::ArgumentValueType* >
  1089. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  1090. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  1091. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  1092. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) +
  1093. sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) +
  1094. sizeof( typename EngineTypeTraits< F >::ArgumentValueType ) +
  1095. sizeof( typename EngineTypeTraits< G >::ArgumentValueType ) +
  1096. sizeof( typename EngineTypeTraits< H >::ArgumentValueType ) ] ) ) );
  1097. }
  1098. typename EngineTypeTraits< J >::ValueType j() const
  1099. {
  1100. return EngineTypeTraits< J >::ArgumentToValue(
  1101. *( reinterpret_cast< const typename EngineTypeTraits< J >::ArgumentValueType* >
  1102. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  1103. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  1104. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  1105. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) +
  1106. sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) +
  1107. sizeof( typename EngineTypeTraits< F >::ArgumentValueType ) +
  1108. sizeof( typename EngineTypeTraits< G >::ArgumentValueType ) +
  1109. sizeof( typename EngineTypeTraits< H >::ArgumentValueType ) +
  1110. sizeof( typename EngineTypeTraits< I >::ArgumentValueType ) ] ) ) );
  1111. }
  1112. typename EngineTypeTraits< K >::ValueType k() const
  1113. {
  1114. return EngineTypeTraits< K >::ArgumentToValue(
  1115. *( reinterpret_cast< const typename EngineTypeTraits< K >::ArgumentValueType* >
  1116. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  1117. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  1118. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  1119. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) +
  1120. sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) +
  1121. sizeof( typename EngineTypeTraits< F >::ArgumentValueType ) +
  1122. sizeof( typename EngineTypeTraits< G >::ArgumentValueType ) +
  1123. sizeof( typename EngineTypeTraits< H >::ArgumentValueType ) +
  1124. sizeof( typename EngineTypeTraits< I >::ArgumentValueType ) +
  1125. sizeof( typename EngineTypeTraits< J >::ArgumentValueType ) ] ) ) );
  1126. }
  1127. typename EngineTypeTraits< L >::ValueType l() const
  1128. {
  1129. return EngineTypeTraits< L >::ArgumentToValue(
  1130. *( reinterpret_cast< const typename EngineTypeTraits< L >::ArgumentValueType* >
  1131. ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) +
  1132. sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) +
  1133. sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) +
  1134. sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) +
  1135. sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) +
  1136. sizeof( typename EngineTypeTraits< F >::ArgumentValueType ) +
  1137. sizeof( typename EngineTypeTraits< G >::ArgumentValueType ) +
  1138. sizeof( typename EngineTypeTraits< H >::ArgumentValueType ) +
  1139. sizeof( typename EngineTypeTraits< I >::ArgumentValueType ) +
  1140. sizeof( typename EngineTypeTraits< J >::ArgumentValueType ) +
  1141. sizeof( typename EngineTypeTraits< K >::ArgumentValueType ) ] ) ) );
  1142. }
  1143. };
  1144. };
  1145. template< typename T >
  1146. struct _EngineFunctionTrampolineBase : public _EngineTrampoline< T >
  1147. {
  1148. typedef T FunctionType;
  1149. };
  1150. // Trampolines for any call-ins that aren't methods.
  1151. template< typename T >
  1152. struct _EngineFunctionTrampoline {};
  1153. template< typename R >
  1154. struct _EngineFunctionTrampoline< R() > : public _EngineFunctionTrampolineBase< R() >
  1155. {
  1156. static R jmp( R ( *fn )(), const typename _EngineFunctionTrampolineBase< R() >::Args& args )
  1157. {
  1158. return R( fn() );
  1159. }
  1160. };
  1161. template< typename R, typename A >
  1162. struct _EngineFunctionTrampoline< R( A ) > : public _EngineFunctionTrampolineBase< R( A ) >
  1163. {
  1164. static R jmp( R ( *fn )( A ), const typename _EngineFunctionTrampolineBase< R( A ) >::Args& args )
  1165. {
  1166. return R( fn( args.a() ) );
  1167. }
  1168. };
  1169. template< typename R, typename A, typename B >
  1170. struct _EngineFunctionTrampoline< R( A, B ) > : public _EngineFunctionTrampolineBase< R( A, B ) >
  1171. {
  1172. static R jmp( R ( *fn )( A, B ), const typename _EngineFunctionTrampolineBase< R( A, B ) >::Args& args )
  1173. {
  1174. return R( fn( args.a(), args.b() ) );
  1175. }
  1176. };
  1177. template< typename R, typename A, typename B, typename C >
  1178. struct _EngineFunctionTrampoline< R( A, B, C ) > : public _EngineFunctionTrampolineBase< R( A, B, C ) >
  1179. {
  1180. static R jmp( R ( *fn )( A, B, C ), const typename _EngineFunctionTrampolineBase< R( A, B, C ) >::Args& args )
  1181. {
  1182. return R( fn( args.a(), args.b(), args.c() ) );
  1183. }
  1184. };
  1185. template< typename R, typename A, typename B, typename C, typename D >
  1186. struct _EngineFunctionTrampoline< R( A, B, C, D ) > : public _EngineFunctionTrampolineBase< R( A, B, C, D ) >
  1187. {
  1188. static R jmp( R ( *fn )( A, B, C, D ), const typename _EngineFunctionTrampolineBase< R( A, B, C, D ) >::Args& args )
  1189. {
  1190. return R( fn( args.a(), args.b(), args.c(), args.d() ) );
  1191. }
  1192. };
  1193. template< typename R, typename A, typename B, typename C, typename D, typename E >
  1194. struct _EngineFunctionTrampoline< R( A, B, C, D, E ) > : public _EngineFunctionTrampolineBase< R( A, B, C, D, E ) >
  1195. {
  1196. static R jmp( R ( *fn )( A, B, C, D, E ), const typename _EngineFunctionTrampolineBase< R( A, B, C, D, E ) >::Args& args )
  1197. {
  1198. return R( fn( args.a(), args.b(), args.c(), args.d(), args.e() ) );
  1199. }
  1200. };
  1201. template< typename R, typename A, typename B, typename C, typename D, typename E, typename F >
  1202. struct _EngineFunctionTrampoline< R( A, B, C, D, E, F ) > : public _EngineFunctionTrampolineBase< R( A, B, C, D, E, F ) >
  1203. {
  1204. static R jmp( R ( *fn )( A, B, C, D, E, F ), const typename _EngineFunctionTrampolineBase< R( A, B, C, D, E, F ) >::Args& args )
  1205. {
  1206. return R( fn( args.a(), args.b(), args.c(), args.d(), args.e(), args.f() ) );
  1207. }
  1208. };
  1209. template< typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G >
  1210. struct _EngineFunctionTrampoline< R( A, B, C, D, E, F, G ) > : public _EngineFunctionTrampolineBase< R( A, B, C, D, E, F, G ) >
  1211. {
  1212. 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 )
  1213. {
  1214. return R( fn( args.a(), args.b(), args.c(), args.d(), args.e(), args.f(), args.g() ) );
  1215. }
  1216. };
  1217. template< typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H >
  1218. struct _EngineFunctionTrampoline< R( A, B, C, D, E, F, G, H ) > : public _EngineFunctionTrampolineBase< R( A, B, C, D, E, F, G, H ) >
  1219. {
  1220. 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 )
  1221. {
  1222. return R( fn( args.a(), args.b(), args.c(), args.d(), args.e(), args.f(), args.g(), args.h() ) );
  1223. }
  1224. };
  1225. template< typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I >
  1226. struct _EngineFunctionTrampoline< R( A, B, C, D, E, F, G, H, I ) > : public _EngineFunctionTrampolineBase< R( A, B, C, D, E, F, G, H, I ) >
  1227. {
  1228. 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 )
  1229. {
  1230. return R( fn( args.a(), args.b(), args.c(), args.d(), args.e(), args.f(), args.g(), args.h(), args.i() ) );
  1231. }
  1232. };
  1233. template< typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I, typename J >
  1234. 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 ) >
  1235. {
  1236. 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 )
  1237. {
  1238. return R( fn( args.a(), args.b(), args.c(), args.d(), args.e(), args.f(), args.g(), args.h(), args.i(), args.j() ) );
  1239. }
  1240. };
  1241. 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 >
  1242. 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 ) >
  1243. {
  1244. 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 )
  1245. {
  1246. 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() ) );
  1247. }
  1248. };
  1249. 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 >
  1250. struct _EngineFunctionTrampoline< R( A, B, C, D, E, F, G, H, I, J, K, L ) > : public _EngineFunctionTrampolineBase< R( A, B, C, D, E, F, G, H, I, J, K, L ) >
  1251. {
  1252. static R jmp( R ( *fn )( A, B, C, D, E, F, G, H, I, J, K, L ), const typename _EngineFunctionTrampolineBase< R( A, B, C, D, E, F, G, H, I, J, K, L ) >::Args& args )
  1253. {
  1254. 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(), args.l() ) );
  1255. }
  1256. };
  1257. // Trampolines for engine methods
  1258. template< typename T >
  1259. struct _EngineMethodTrampolineBase : public _EngineTrampoline< T > {};
  1260. template< typename Frame, typename T >
  1261. struct _EngineMethodTrampoline {};
  1262. template< typename Frame, typename R >
  1263. struct _EngineMethodTrampoline< Frame, R() > : public _EngineMethodTrampolineBase< R() >
  1264. {
  1265. typedef R( FunctionType )( typename Frame::ObjectType* );
  1266. static R jmp( typename Frame::ObjectType* object, const typename _EngineFunctionTrampolineBase< R() >::Args& args )
  1267. {
  1268. Frame f;
  1269. f.object = object;
  1270. return R( f._exec() );
  1271. }
  1272. };
  1273. template< typename Frame, typename R, typename A >
  1274. struct _EngineMethodTrampoline< Frame, R( A ) > : public _EngineMethodTrampolineBase< R( A ) >
  1275. {
  1276. typedef R( FunctionType )( typename Frame::ObjectType*, A );
  1277. static R jmp( typename Frame::ObjectType* object, const typename _EngineFunctionTrampolineBase< R( A ) >::Args& args )
  1278. {
  1279. Frame f;
  1280. f.object = object;
  1281. return R( f._exec( args.a() ) );
  1282. }
  1283. };
  1284. template< typename Frame, typename R, typename A, typename B >
  1285. struct _EngineMethodTrampoline< Frame, R( A, B ) > : public _EngineMethodTrampolineBase< R( A, B ) >
  1286. {
  1287. typedef R( FunctionType )( typename Frame::ObjectType*, A, B );
  1288. static R jmp( typename Frame::ObjectType* object, const typename _EngineFunctionTrampolineBase< R( A, B ) >::Args& args )
  1289. {
  1290. Frame f;
  1291. f.object = object;
  1292. return R( f._exec( args.a(), args.b() ) );
  1293. }
  1294. };
  1295. template< typename Frame, typename R, typename A, typename B, typename C >
  1296. struct _EngineMethodTrampoline< Frame, R( A, B, C ) > : public _EngineMethodTrampolineBase< R( A, B, C ) >
  1297. {
  1298. typedef R( FunctionType )( typename Frame::ObjectType*, A, B, C );
  1299. static R jmp( typename Frame::ObjectType* object, const typename _EngineFunctionTrampolineBase< R( A, B, C ) >::Args& args )
  1300. {
  1301. Frame f;
  1302. f.object = object;
  1303. return R( f._exec( args.a(), args.b(), args.c() ) );
  1304. }
  1305. };
  1306. template< typename Frame, typename R, typename A, typename B, typename C, typename D >
  1307. struct _EngineMethodTrampoline< Frame, R( A, B, C, D ) > : public _EngineMethodTrampolineBase< R( A, B, C, D ) >
  1308. {
  1309. typedef R( FunctionType )( typename Frame::ObjectType*, A, B, C, D );
  1310. static R jmp( typename Frame::ObjectType* object, const typename _EngineFunctionTrampolineBase< R( A, B, C, D ) >::Args& args )
  1311. {
  1312. Frame f;
  1313. f.object = object;
  1314. return R( f._exec( args.a(), args.b(), args.c(), args.d() ) );
  1315. }
  1316. };
  1317. template< typename Frame, typename R, typename A, typename B, typename C, typename D, typename E >
  1318. struct _EngineMethodTrampoline< Frame, R( A, B, C, D, E ) > : public _EngineMethodTrampolineBase< R( A, B, C, D, E ) >
  1319. {
  1320. typedef R( FunctionType )( typename Frame::ObjectType*, A, B, C, D, E );
  1321. static R jmp( typename Frame::ObjectType* object, const typename _EngineFunctionTrampolineBase< R( A, B, C, D, E ) >::Args& args )
  1322. {
  1323. Frame f;
  1324. f.object = object;
  1325. return R( f._exec( args.a(), args.b(), args.c(), args.d(), args.e() ) );
  1326. }
  1327. };
  1328. template< typename Frame, typename R, typename A, typename B, typename C, typename D, typename E, typename F >
  1329. struct _EngineMethodTrampoline< Frame, R( A, B, C, D, E, F ) > : public _EngineMethodTrampolineBase< R( A, B, C, D, E, F ) >
  1330. {
  1331. typedef R( FunctionType )( typename Frame::ObjectType*, A, B, C, D, E, F );
  1332. static R jmp( typename Frame::ObjectType* object, const typename _EngineFunctionTrampolineBase< R( A, B, C, D, E, F ) >::Args& args )
  1333. {
  1334. Frame f;
  1335. f.object = object;
  1336. return R( f._exec( args.a(), args.b(), args.c(), args.d(), args.e(), args.f() ) );
  1337. }
  1338. };
  1339. template< typename Frame, typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G >
  1340. struct _EngineMethodTrampoline< Frame, R( A, B, C, D, E, F, G ) > : public _EngineMethodTrampolineBase< R( A, B, C, D, E, F, G ) >
  1341. {
  1342. typedef R( FunctionType )( typename Frame::ObjectType*, A, B, C, D, E, F, G );
  1343. static R jmp( typename Frame::ObjectType* object, const typename _EngineFunctionTrampolineBase< R( A, B, C, D, E, F, G ) >::Args& args )
  1344. {
  1345. Frame f;
  1346. f.object = object;
  1347. return R( f._exec( args.a(), args.b(), args.c(), args.d(), args.e(), args.f(), args.g() ) );
  1348. }
  1349. };
  1350. template< typename Frame, typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H >
  1351. struct _EngineMethodTrampoline< Frame, R( A, B, C, D, E, F, G, H ) > : public _EngineMethodTrampolineBase< R( A, B, C, D, E, F, G, H ) >
  1352. {
  1353. typedef R( FunctionType )( typename Frame::ObjectType*, A, B, C, D, E, F, G, H );
  1354. static R jmp( typename Frame::ObjectType* object, const typename _EngineFunctionTrampolineBase< R( A, B, C, D, E, F, G, H ) >::Args& args )
  1355. {
  1356. Frame f;
  1357. f.object = object;
  1358. return R( f._exec( args.a(), args.b(), args.c(), args.d(), args.e(), args.f(), args.g(), args.h() ) );
  1359. }
  1360. };
  1361. template< typename Frame, typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I >
  1362. 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 ) >
  1363. {
  1364. typedef R( FunctionType )( typename Frame::ObjectType*, A, B, C, D, E, F, G, H, I );
  1365. static R jmp( typename Frame::ObjectType* object, const typename _EngineFunctionTrampolineBase< R( A, B, C, D, E, F, G, H, I ) >::Args& args )
  1366. {
  1367. Frame f;
  1368. f.object = object;
  1369. return R( f._exec( args.a(), args.b(), args.c(), args.d(), args.e(), args.f(), args.g(), args.h(), args.i() ) );
  1370. }
  1371. };
  1372. 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 >
  1373. 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 ) >
  1374. {
  1375. typedef R( FunctionType )( typename Frame::ObjectType*, A, B, C, D, E, F, G, H, I, J );
  1376. static R jmp( typename Frame::ObjectType* object, const typename _EngineFunctionTrampolineBase< R( A, B, C, D, E, F, G, H, I, J ) >::Args& args )
  1377. {
  1378. Frame f;
  1379. f.object = object;
  1380. return R( f._exec( args.a(), args.b(), args.c(), args.d(), args.e(), args.f(), args.g(), args.h(), args.i(), args.j() ) );
  1381. }
  1382. };
  1383. 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 >
  1384. 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 ) >
  1385. {
  1386. typedef R( FunctionType )( typename Frame::ObjectType*, A, B, C, D, E, F, G, H, I, J, K );
  1387. static R jmp( typename Frame::ObjectType* object, const typename _EngineFunctionTrampolineBase< R( A, B, C, D, E, F, G, H, I, J, K ) >::Args& args )
  1388. {
  1389. Frame f;
  1390. f.object = object;
  1391. 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() ) );
  1392. }
  1393. };
  1394. 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, typename L >
  1395. struct _EngineMethodTrampoline< Frame, R( A, B, C, D, E, F, G, H, I, J, K, L ) > : public _EngineMethodTrampolineBase< R( A, B, C, D, E, F, G, H, I, J, K, L ) >
  1396. {
  1397. typedef R( FunctionType )( typename Frame::ObjectType*, A, B, C, D, E, F, G, H, I, J, K, L );
  1398. static R jmp( typename Frame::ObjectType* object, const typename _EngineFunctionTrampolineBase< R( A, B, C, D, E, F, G, H, I, J, K, L ) >::Args& args )
  1399. {
  1400. Frame f;
  1401. f.object = object;
  1402. 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(), args.l() ) );
  1403. }
  1404. };
  1405. /// @}
  1406. /// @name Thunking
  1407. ///
  1408. /// Internal functionality for thunks placed between TorqueScript calls of engine functions and their native
  1409. /// implementations.
  1410. ///
  1411. /// @note The functionality in this group is specific to the console interop system.
  1412. /// @{
  1413. // Helper function to return data from a thunk.
  1414. template< typename T >
  1415. inline const char* _EngineConsoleThunkReturnValue( const T& value )
  1416. {
  1417. return EngineMarshallData( value );
  1418. }
  1419. inline bool _EngineConsoleThunkReturnValue( bool value )
  1420. {
  1421. return value;
  1422. }
  1423. inline S32 _EngineConsoleThunkReturnValue( S32 value )
  1424. {
  1425. return value;
  1426. }
  1427. inline F32 _EngineConsoleThunkReturnValue( F32 value )
  1428. {
  1429. return value;
  1430. }
  1431. inline const char* _EngineConsoleThunkReturnValue( const String& str )
  1432. {
  1433. return Con::getReturnBuffer( str );
  1434. }
  1435. inline const char* _EngineConsoleThunkReturnValue( const char* value )
  1436. {
  1437. return EngineMarshallData( value );
  1438. }
  1439. template< typename T >
  1440. inline const char* _EngineConsoleThunkReturnValue( T* value )
  1441. {
  1442. return ( value ? value->getIdString() : "" );
  1443. }
  1444. template< typename T >
  1445. inline const char* _EngineConsoleThunkReturnValue( const T* value )
  1446. {
  1447. return ( value ? value->getIdString() : "" );
  1448. }
  1449. // Helper class to determine the type of callback registered with the console system.
  1450. template< typename R >
  1451. struct _EngineConsoleThunkType
  1452. {
  1453. typedef const char* ReturnType;
  1454. typedef StringCallback CallbackType;
  1455. };
  1456. template<>
  1457. struct _EngineConsoleThunkType< S32 >
  1458. {
  1459. typedef S32 ReturnType;
  1460. typedef IntCallback CallbackType;
  1461. };
  1462. template<>
  1463. struct _EngineConsoleThunkType< U32 >
  1464. {
  1465. typedef U32 ReturnType;
  1466. typedef IntCallback CallbackType;
  1467. };
  1468. template<>
  1469. struct _EngineConsoleThunkType< F32 >
  1470. {
  1471. typedef F32 ReturnType;
  1472. typedef FloatCallback CallbackType;
  1473. };
  1474. template<>
  1475. struct _EngineConsoleThunkType< bool >
  1476. {
  1477. typedef bool ReturnType;
  1478. typedef BoolCallback CallbackType;
  1479. };
  1480. template<>
  1481. struct _EngineConsoleThunkType< void >
  1482. {
  1483. typedef void ReturnType;
  1484. typedef VoidCallback CallbackType;
  1485. };
  1486. // Helper struct to count the number of parameters in a function list.
  1487. // The setup through operator () allows omitting the the argument list entirely.
  1488. struct _EngineConsoleThunkCountArgs
  1489. {
  1490. template< typename A >
  1491. U32 operator ()( A a )
  1492. {
  1493. return 1;
  1494. }
  1495. template< typename A, typename B >
  1496. U32 operator ()( A a, B b )
  1497. {
  1498. return 2;
  1499. }
  1500. template< typename A, typename B, typename C >
  1501. U32 operator ()( A a, B b, C c )
  1502. {
  1503. return 3;
  1504. }
  1505. template< typename A, typename B, typename C, typename D >
  1506. U32 operator ()( A a, B b, C c, D d )
  1507. {
  1508. return 4;
  1509. }
  1510. template< typename A, typename B, typename C, typename D, typename E >
  1511. U32 operator ()( A a, B b, C c, D d, E e )
  1512. {
  1513. return 5;
  1514. }
  1515. template< typename A, typename B, typename C, typename D, typename E, typename F >
  1516. U32 operator ()( A a, B b, C c, D d, E e, F f )
  1517. {
  1518. return 6;
  1519. }
  1520. template< typename A, typename B, typename C, typename D, typename E, typename F, typename G >
  1521. U32 operator ()( A a, B b, C c, D d, E e, F f, G g )
  1522. {
  1523. return 7;
  1524. }
  1525. template< typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H >
  1526. U32 operator ()( A a, B b, C c, D d, E e, F f, G g, H h )
  1527. {
  1528. return 8;
  1529. }
  1530. template< typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I >
  1531. U32 operator ()( A a, B b, C c, D d, E e, F f, G g, H h, I i )
  1532. {
  1533. return 9;
  1534. }
  1535. template< typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I, typename J >
  1536. U32 operator ()( A a, B b, C c, D d, E e, F f, G g, H h, I i, J j )
  1537. {
  1538. return 10;
  1539. }
  1540. template< typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I, typename J, typename K >
  1541. U32 operator ()( A a, B b, C c, D d, E e, F f, G g, H h, I i, J j, K k )
  1542. {
  1543. return 11;
  1544. }
  1545. template< typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I, typename J, typename K, typename L >
  1546. U32 operator ()( A a, B b, C c, D d, E e, F f, G g, H h, I i, J j, K k, L l )
  1547. {
  1548. return 12;
  1549. }
  1550. operator U32() const
  1551. {
  1552. return 0;
  1553. }
  1554. };
  1555. // Encapsulation of a legacy console function invocation.
  1556. template< S32 startArgc, typename T >
  1557. struct _EngineConsoleThunk {};
  1558. template< S32 startArgc, typename R >
  1559. struct _EngineConsoleThunk< startArgc, R() >
  1560. {
  1561. typedef typename _EngineConsoleThunkType< R >::ReturnType ReturnType;
  1562. static const S32 NUM_ARGS = 0;
  1563. static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( *fn )(), const _EngineFunctionDefaultArguments< void() >& )
  1564. {
  1565. return _EngineConsoleThunkReturnValue( fn() );
  1566. }
  1567. template< typename Frame >
  1568. static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( Frame::*fn )() const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType* ) >& )
  1569. {
  1570. return _EngineConsoleThunkReturnValue( ( frame->*fn )() );
  1571. }
  1572. };
  1573. template< S32 startArgc >
  1574. struct _EngineConsoleThunk< startArgc, void() >
  1575. {
  1576. typedef void ReturnType;
  1577. static const S32 NUM_ARGS = 0;
  1578. static void thunk( S32 argc, ConsoleValueRef *argv, void ( *fn )(), const _EngineFunctionDefaultArguments< void() >& )
  1579. {
  1580. fn();
  1581. }
  1582. template< typename Frame >
  1583. static void thunk( S32 argc, ConsoleValueRef *argv, void ( Frame::*fn )() const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType* ) >& )
  1584. {
  1585. return ( frame->*fn )();
  1586. }
  1587. };
  1588. template< S32 startArgc, typename R, typename A >
  1589. struct _EngineConsoleThunk< startArgc, R( A ) >
  1590. {
  1591. typedef typename _EngineConsoleThunkType< R >::ReturnType ReturnType;
  1592. static const S32 NUM_ARGS = 1 + startArgc;
  1593. static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( *fn )( A ), const _EngineFunctionDefaultArguments< void( A ) >& defaultArgs )
  1594. {
  1595. A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.a ) );
  1596. return _EngineConsoleThunkReturnValue( fn( a ) );
  1597. }
  1598. template< typename Frame >
  1599. static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( Frame::*fn )( A ) const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, A ) >& defaultArgs )
  1600. {
  1601. A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.b ) );
  1602. return _EngineConsoleThunkReturnValue( ( frame->*fn )( a ) );
  1603. }
  1604. };
  1605. template< S32 startArgc, typename A >
  1606. struct _EngineConsoleThunk< startArgc, void( A ) >
  1607. {
  1608. typedef void ReturnType;
  1609. static const S32 NUM_ARGS = 1 + startArgc;
  1610. static void thunk( S32 argc, ConsoleValueRef *argv, void ( *fn )( A ), const _EngineFunctionDefaultArguments< void( A ) >& defaultArgs )
  1611. {
  1612. A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.a ) );
  1613. fn( a );
  1614. }
  1615. template< typename Frame >
  1616. static void thunk( S32 argc, ConsoleValueRef *argv, void ( Frame::*fn )( A ) const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, A ) >& defaultArgs )
  1617. {
  1618. A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.b ) );
  1619. ( frame->*fn )( a );
  1620. }
  1621. };
  1622. template< S32 startArgc, typename R, typename A, typename B >
  1623. struct _EngineConsoleThunk< startArgc, R( A, B ) >
  1624. {
  1625. typedef typename _EngineConsoleThunkType< R >::ReturnType ReturnType;
  1626. static const S32 NUM_ARGS = 2 + startArgc;
  1627. static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( *fn )( A, B ), const _EngineFunctionDefaultArguments< void( A, B ) >& defaultArgs )
  1628. {
  1629. A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.a ) );
  1630. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) );
  1631. return _EngineConsoleThunkReturnValue( fn( a, b ) );
  1632. }
  1633. template< typename Frame >
  1634. static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( Frame::*fn )( A, B ) const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, A, B ) >& defaultArgs )
  1635. {
  1636. A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.b ) );
  1637. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) );
  1638. return _EngineConsoleThunkReturnValue( ( frame->*fn )( a, b ) );
  1639. }
  1640. };
  1641. template< S32 startArgc, typename A, typename B >
  1642. struct _EngineConsoleThunk< startArgc, void( A, B ) >
  1643. {
  1644. typedef void ReturnType;
  1645. static const S32 NUM_ARGS = 2 + startArgc;
  1646. static void thunk( S32 argc, ConsoleValueRef *argv, void ( *fn )( A, B ), const _EngineFunctionDefaultArguments< void( A, B ) >& defaultArgs )
  1647. {
  1648. A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.a ) );
  1649. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) );
  1650. fn( a, b );
  1651. }
  1652. template< typename Frame >
  1653. static void thunk( S32 argc, ConsoleValueRef *argv, void ( Frame::*fn )( A, B ) const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, A, B ) >& defaultArgs )
  1654. {
  1655. A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.b ) );
  1656. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) );
  1657. ( frame->*fn )( a, b );
  1658. }
  1659. };
  1660. template< S32 startArgc, typename R, typename A, typename B, typename C >
  1661. struct _EngineConsoleThunk< startArgc, R( A, B, C ) >
  1662. {
  1663. typedef typename _EngineConsoleThunkType< R >::ReturnType ReturnType;
  1664. static const S32 NUM_ARGS = 3 + startArgc;
  1665. static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( *fn )( A, B, C ), const _EngineFunctionDefaultArguments< void( A, B, C ) >& defaultArgs )
  1666. {
  1667. A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.a ) );
  1668. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) );
  1669. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) );
  1670. return _EngineConsoleThunkReturnValue( fn( a, b, c ) );
  1671. }
  1672. template< typename Frame >
  1673. static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( Frame::*fn )( A, B, C ) const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, A, B, C ) >& defaultArgs )
  1674. {
  1675. A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.b ) );
  1676. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) );
  1677. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) );
  1678. return _EngineConsoleThunkReturnValue( ( frame->*fn )( a, b, c ) );
  1679. }
  1680. };
  1681. template< S32 startArgc, typename A, typename B, typename C >
  1682. struct _EngineConsoleThunk< startArgc, void( A, B, C ) >
  1683. {
  1684. typedef void ReturnType;
  1685. static const S32 NUM_ARGS = 3 + startArgc;
  1686. static void thunk( S32 argc, ConsoleValueRef *argv, void ( *fn )( A, B, C ), const _EngineFunctionDefaultArguments< void( A, B, C ) >& defaultArgs )
  1687. {
  1688. A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.a ) );
  1689. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) );
  1690. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) );
  1691. fn( a, b, c );
  1692. }
  1693. template< typename Frame >
  1694. static void thunk( S32 argc, ConsoleValueRef *argv, void ( Frame::*fn )( A, B, C ) const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, A, B, C ) >& defaultArgs )
  1695. {
  1696. A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.b ) );
  1697. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) );
  1698. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) );
  1699. ( frame->*fn )( a, b, c );
  1700. }
  1701. };
  1702. template< S32 startArgc, typename R, typename A, typename B, typename C, typename D >
  1703. struct _EngineConsoleThunk< startArgc, R( A, B, C, D ) >
  1704. {
  1705. typedef typename _EngineConsoleThunkType< R >::ReturnType ReturnType;
  1706. static const S32 NUM_ARGS = 4 + startArgc;
  1707. static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( *fn )( A, B, C, D ), const _EngineFunctionDefaultArguments< void( A, B, C, D ) >& defaultArgs )
  1708. {
  1709. A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.a ) );
  1710. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) );
  1711. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) );
  1712. D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.d ) );
  1713. return _EngineConsoleThunkReturnValue( fn( a, b, c, d ) );
  1714. }
  1715. template< typename Frame >
  1716. static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( Frame::*fn )( A, B, C, D ) const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, A, B, C, D ) >& defaultArgs )
  1717. {
  1718. A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.b ) );
  1719. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) );
  1720. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) );
  1721. D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.e ) );
  1722. return _EngineConsoleThunkReturnValue( ( frame->*fn )( a, b, c, d ) );
  1723. }
  1724. };
  1725. template< S32 startArgc, typename A, typename B, typename C, typename D >
  1726. struct _EngineConsoleThunk< startArgc, void( A, B, C, D ) >
  1727. {
  1728. typedef void ReturnType;
  1729. static const S32 NUM_ARGS = 4 + startArgc;
  1730. static void thunk( S32 argc, ConsoleValueRef *argv, void ( *fn )( A, B, C, D ), const _EngineFunctionDefaultArguments< void( A, B, C, D ) >& defaultArgs )
  1731. {
  1732. A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.a ) );
  1733. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) );
  1734. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) );
  1735. D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.d ) );
  1736. fn( a, b, c, d );
  1737. }
  1738. template< typename Frame >
  1739. static void thunk( S32 argc, ConsoleValueRef *argv, void ( Frame::*fn )( A, B, C, D ) const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, A, B, C, D ) >& defaultArgs )
  1740. {
  1741. A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.b ) );
  1742. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) );
  1743. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) );
  1744. D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.e ) );
  1745. ( frame->*fn )( a, b, c, d );
  1746. }
  1747. };
  1748. template< S32 startArgc, typename R, typename A, typename B, typename C, typename D, typename E >
  1749. struct _EngineConsoleThunk< startArgc, R( A, B, C, D, E ) >
  1750. {
  1751. typedef typename _EngineConsoleThunkType< R >::ReturnType ReturnType;
  1752. static const S32 NUM_ARGS = 5 + startArgc;
  1753. static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( *fn )( A, B, C, D, E ), const _EngineFunctionDefaultArguments< void( A, B, C, D, E ) >& defaultArgs )
  1754. {
  1755. A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.a ) );
  1756. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) );
  1757. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) );
  1758. D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.d ) );
  1759. E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.e ) );
  1760. return _EngineConsoleThunkReturnValue( fn( a, b, c, d, e ) );
  1761. }
  1762. template< typename Frame >
  1763. static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( Frame::*fn )( A, B, C, D, E ) const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, A, B, C, D, E ) >& defaultArgs )
  1764. {
  1765. A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.b ) );
  1766. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) );
  1767. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) );
  1768. D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.e ) );
  1769. E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.f ) );
  1770. return _EngineConsoleThunkReturnValue( ( frame->*fn )( a, b, c, d, e ) );
  1771. }
  1772. };
  1773. template< S32 startArgc, typename A, typename B, typename C, typename D, typename E >
  1774. struct _EngineConsoleThunk< startArgc, void( A, B, C, D, E ) >
  1775. {
  1776. typedef void ReturnType;
  1777. static const S32 NUM_ARGS = 5 + startArgc;
  1778. static void thunk( S32 argc, ConsoleValueRef *argv, void ( *fn )( A, B, C, D, E ), const _EngineFunctionDefaultArguments< void( A, B, C, D, E ) >& defaultArgs )
  1779. {
  1780. A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : 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. fn( a, b, c, d, e );
  1786. }
  1787. template< typename Frame >
  1788. static void thunk( S32 argc, ConsoleValueRef *argv, void ( Frame::*fn )( A, B, C, D, E ) const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, A, B, C, D, E ) >& defaultArgs )
  1789. {
  1790. A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.b ) );
  1791. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) );
  1792. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) );
  1793. D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.e ) );
  1794. E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.f ) );
  1795. ( frame->*fn )( a, b, c, d, e );
  1796. }
  1797. };
  1798. template< S32 startArgc, typename R, typename A, typename B, typename C, typename D, typename E, typename F >
  1799. struct _EngineConsoleThunk< startArgc, R( A, B, C, D, E, F ) >
  1800. {
  1801. typedef typename _EngineConsoleThunkType< R >::ReturnType ReturnType;
  1802. static const S32 NUM_ARGS = 6 + startArgc;
  1803. static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( *fn )( A, B, C, D, E, F ), const _EngineFunctionDefaultArguments< void( A, B, C, D, E, F ) >& defaultArgs )
  1804. {
  1805. A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.a ) );
  1806. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) );
  1807. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) );
  1808. D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.d ) );
  1809. E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.e ) );
  1810. F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.f ) );
  1811. return _EngineConsoleThunkReturnValue( fn( a, b, c, d, e, f ) );
  1812. }
  1813. template< typename Frame >
  1814. static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( Frame::*fn )( A, B, C, D, E, F ) const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, A, B, C, D, E, F ) >& defaultArgs )
  1815. {
  1816. A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.b ) );
  1817. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) );
  1818. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) );
  1819. D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.e ) );
  1820. E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.f ) );
  1821. F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.g ) );
  1822. return _EngineConsoleThunkReturnValue( ( frame->*fn )( a, b, c, d, e, f ) );
  1823. }
  1824. };
  1825. template< S32 startArgc, typename A, typename B, typename C, typename D, typename E, typename F >
  1826. struct _EngineConsoleThunk< startArgc, void( A, B, C, D, E, F ) >
  1827. {
  1828. typedef void ReturnType;
  1829. static const S32 NUM_ARGS = 6 + startArgc;
  1830. static void thunk( S32 argc, ConsoleValueRef *argv, void ( *fn )( A, B, C, D, E, F ), const _EngineFunctionDefaultArguments< void( A, B, C, D, E, F ) >& defaultArgs )
  1831. {
  1832. A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.a ) );
  1833. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) );
  1834. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) );
  1835. D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.d ) );
  1836. E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.e ) );
  1837. F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.f ) );
  1838. fn( a, b, c, d, e, f );
  1839. }
  1840. template< typename Frame >
  1841. static void thunk( S32 argc, ConsoleValueRef *argv, void ( Frame::*fn )( A, B, C, D, E, F ) const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, A, B, C, D, E, F ) >& defaultArgs )
  1842. {
  1843. A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.b ) );
  1844. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) );
  1845. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) );
  1846. D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.e ) );
  1847. E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.f ) );
  1848. F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.g ) );
  1849. ( frame->*fn )( a, b, c, d, e, f );
  1850. }
  1851. };
  1852. template< S32 startArgc, typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G >
  1853. struct _EngineConsoleThunk< startArgc, R( A, B, C, D, E, F, G ) >
  1854. {
  1855. typedef typename _EngineConsoleThunkType< R >::ReturnType ReturnType;
  1856. static const S32 NUM_ARGS = 7 + startArgc;
  1857. static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( *fn )( A, B, C, D, E, F, G ), const _EngineFunctionDefaultArguments< void( A, B, C, D, E, F, G ) >& defaultArgs )
  1858. {
  1859. A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.a ) );
  1860. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) );
  1861. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) );
  1862. D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.d ) );
  1863. E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.e ) );
  1864. F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.f ) );
  1865. G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.g ) );
  1866. return _EngineConsoleThunkReturnValue( fn( a, b, c, d, e, f, g ) );
  1867. }
  1868. template< typename Frame >
  1869. static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( Frame::*fn )( A, B, C, D, E, F, G ) const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, A, B, C, D, E, F, G ) >& defaultArgs )
  1870. {
  1871. A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.b ) );
  1872. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) );
  1873. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) );
  1874. D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.e ) );
  1875. E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.f ) );
  1876. F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.g ) );
  1877. G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.h ) );
  1878. return _EngineConsoleThunkReturnValue( ( frame->*fn )( a, b, c, d, e, f, g ) );
  1879. }
  1880. };
  1881. template< S32 startArgc, typename A, typename B, typename C, typename D, typename E, typename F, typename G >
  1882. struct _EngineConsoleThunk< startArgc, void( A, B, C, D, E, F, G ) >
  1883. {
  1884. typedef void ReturnType;
  1885. static const S32 NUM_ARGS = 7 + startArgc;
  1886. static void thunk( S32 argc, ConsoleValueRef *argv, void ( *fn )( A, B, C, D, E, F, G ), const _EngineFunctionDefaultArguments< void( A, B, C, D, E, F, G ) >& defaultArgs )
  1887. {
  1888. A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.a ) );
  1889. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) );
  1890. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) );
  1891. D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.d ) );
  1892. E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.e ) );
  1893. F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.f ) );
  1894. G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.g ) );
  1895. fn( a, b, c, d, e, f, g );
  1896. }
  1897. template< typename Frame >
  1898. static void thunk( S32 argc, ConsoleValueRef *argv, void ( Frame::*fn )( A, B, C, D, E, F, G ) const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, A, B, C, D, E, F, G ) >& defaultArgs )
  1899. {
  1900. A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.b ) );
  1901. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) );
  1902. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) );
  1903. D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.e ) );
  1904. E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.f ) );
  1905. F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.g ) );
  1906. G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.h ) );
  1907. ( frame->*fn )( a, b, c, d, e, f, g );
  1908. }
  1909. };
  1910. template< S32 startArgc, typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H >
  1911. struct _EngineConsoleThunk< startArgc, R( A, B, C, D, E, F, G, H ) >
  1912. {
  1913. typedef typename _EngineConsoleThunkType< R >::ReturnType ReturnType;
  1914. static const S32 NUM_ARGS = 8 + startArgc;
  1915. static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( *fn )( A, B, C, D, E, F, G, H ), const _EngineFunctionDefaultArguments< void( A, B, C, D, E, F, G, H ) >& defaultArgs )
  1916. {
  1917. A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.a ) );
  1918. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) );
  1919. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) );
  1920. D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.d ) );
  1921. E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.e ) );
  1922. F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.f ) );
  1923. G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.g ) );
  1924. H h = ( startArgc + 7 < argc ? EngineUnmarshallData< H >()( argv[ startArgc + 7 ] ) : H( defaultArgs.h ) );
  1925. return _EngineConsoleThunkReturnValue( fn( a, b, c, d, e, f, g, h ) );
  1926. }
  1927. template< typename Frame >
  1928. static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( Frame::*fn )( A, B, C, D, E, F, G, H ) const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, A, B, C, D, E, F, G, H ) >& defaultArgs )
  1929. {
  1930. A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.b ) );
  1931. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) );
  1932. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) );
  1933. D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.e ) );
  1934. E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.f ) );
  1935. F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.g ) );
  1936. G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.h ) );
  1937. H h = ( startArgc + 7 < argc ? EngineUnmarshallData< H >()( argv[ startArgc + 7 ] ) : H( defaultArgs.i ) );
  1938. return _EngineConsoleThunkReturnValue( ( frame->*fn )( a, b, c, d, e, f, g, h ) );
  1939. }
  1940. };
  1941. template< S32 startArgc, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H >
  1942. struct _EngineConsoleThunk< startArgc, void( A, B, C, D, E, F, G, H ) >
  1943. {
  1944. typedef void ReturnType;
  1945. static const S32 NUM_ARGS = 8 + startArgc;
  1946. static void thunk( S32 argc, ConsoleValueRef *argv, void ( *fn )( A, B, C, D, E, F, G, H ), const _EngineFunctionDefaultArguments< void( A, B, C, D, E, F, G, H ) >& defaultArgs )
  1947. {
  1948. A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.a ) );
  1949. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) );
  1950. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) );
  1951. D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.d ) );
  1952. E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.e ) );
  1953. F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.f ) );
  1954. G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.g ) );
  1955. H h = ( startArgc + 7 < argc ? EngineUnmarshallData< H >()( argv[ startArgc + 7 ] ) : H( defaultArgs.h ) );
  1956. fn( a, b, c, d, e, f, g, h );
  1957. }
  1958. template< typename Frame >
  1959. static void thunk( S32 argc, ConsoleValueRef *argv, void ( Frame::*fn )( A, B, C, D, E, F, G, H ) const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, A, B, C, D, E, F, G, H ) >& defaultArgs )
  1960. {
  1961. A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.b ) );
  1962. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) );
  1963. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) );
  1964. D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.e ) );
  1965. E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.f ) );
  1966. F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.g ) );
  1967. G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.h ) );
  1968. H h = ( startArgc + 7 < argc ? EngineUnmarshallData< H >()( argv[ startArgc + 7 ] ) : H( defaultArgs.i ) );
  1969. ( frame->*fn )( a, b, c, d, e, f, g, h );
  1970. }
  1971. };
  1972. template< S32 startArgc, typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I >
  1973. struct _EngineConsoleThunk< startArgc, R( A, B, C, D, E, F, G, H, I ) >
  1974. {
  1975. typedef typename _EngineConsoleThunkType< R >::ReturnType ReturnType;
  1976. static const S32 NUM_ARGS = 9 + startArgc;
  1977. static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( *fn )( A, B, C, D, E, F, G, H, I ), const _EngineFunctionDefaultArguments< void( A, B, C, D, E, F, G, H, I ) >& defaultArgs )
  1978. {
  1979. A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.a ) );
  1980. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) );
  1981. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) );
  1982. D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.d ) );
  1983. E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.e ) );
  1984. F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.f ) );
  1985. G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.g ) );
  1986. H h = ( startArgc + 7 < argc ? EngineUnmarshallData< H >()( argv[ startArgc + 7 ] ) : H( defaultArgs.h ) );
  1987. I i = ( startArgc + 8 < argc ? EngineUnmarshallData< I >()( argv[ startArgc + 8 ] ) : I( defaultArgs.i ) );
  1988. return _EngineConsoleThunkReturnValue( fn( a, b, c, d, e, f, g, h, i ) );
  1989. }
  1990. template< typename Frame >
  1991. static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( Frame::*fn )( A, B, C, D, E, F, G, H, I ) const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, A, B, C, D, E, F, G, H, I ) >& defaultArgs )
  1992. {
  1993. A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.b ) );
  1994. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) );
  1995. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) );
  1996. D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.e ) );
  1997. E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.f ) );
  1998. F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.g ) );
  1999. G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.h ) );
  2000. H h = ( startArgc + 7 < argc ? EngineUnmarshallData< H >()( argv[ startArgc + 7 ] ) : H( defaultArgs.i ) );
  2001. I i = ( startArgc + 8 < argc ? EngineUnmarshallData< I >()( argv[ startArgc + 8 ] ) : I( defaultArgs.j ) );
  2002. return _EngineConsoleThunkReturnValue( ( frame->*fn )( a, b, c, d, e, f, g, h, i ) );
  2003. }
  2004. };
  2005. template< S32 startArgc, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I >
  2006. struct _EngineConsoleThunk< startArgc, void( A, B, C, D, E, F, G, H, I ) >
  2007. {
  2008. typedef void ReturnType;
  2009. static const S32 NUM_ARGS = 9 + startArgc;
  2010. static void thunk( S32 argc, ConsoleValueRef *argv, void ( *fn )( A, B, C, D, E, F, G, H, I ), const _EngineFunctionDefaultArguments< void( A, B, C, D, E, F, G, H, I ) >& defaultArgs )
  2011. {
  2012. A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.a ) );
  2013. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) );
  2014. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) );
  2015. D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.d ) );
  2016. E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.e ) );
  2017. F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.f ) );
  2018. G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.g ) );
  2019. H h = ( startArgc + 7 < argc ? EngineUnmarshallData< H >()( argv[ startArgc + 7 ] ) : H( defaultArgs.h ) );
  2020. I i = ( startArgc + 8 < argc ? EngineUnmarshallData< I >()( argv[ startArgc + 8 ] ) : I( defaultArgs.i ) );
  2021. fn( a, b, c, d, e, f, g, h, i );
  2022. }
  2023. template< typename Frame >
  2024. static void thunk( S32 argc, ConsoleValueRef *argv, void ( Frame::*fn )( A, B, C, D, E, F, G, H, I ) const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, A, B, C, D, E, F, G, H, I ) >& defaultArgs )
  2025. {
  2026. A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.b ) );
  2027. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) );
  2028. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) );
  2029. D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.e ) );
  2030. E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.f ) );
  2031. F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.g ) );
  2032. G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.h ) );
  2033. H h = ( startArgc + 7 < argc ? EngineUnmarshallData< H >()( argv[ startArgc + 7 ] ) : H( defaultArgs.i ) );
  2034. I i = ( startArgc + 8 < argc ? EngineUnmarshallData< I >()( argv[ startArgc + 8 ] ) : I( defaultArgs.j ) );
  2035. ( frame->*fn )( a, b, c, d, e, f, g, h, i );
  2036. }
  2037. };
  2038. 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 >
  2039. struct _EngineConsoleThunk< startArgc, R( A, B, C, D, E, F, G, H, I, J ) >
  2040. {
  2041. typedef typename _EngineConsoleThunkType< R >::ReturnType ReturnType;
  2042. static const S32 NUM_ARGS = 10 + startArgc;
  2043. static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( *fn )( A, B, C, D, E, F, G, H, I, J ), const _EngineFunctionDefaultArguments< void( A, B, C, D, E, F, G, H, I, J ) >& defaultArgs )
  2044. {
  2045. A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.a ) );
  2046. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) );
  2047. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) );
  2048. D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.d ) );
  2049. E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.e ) );
  2050. F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.f ) );
  2051. G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.g ) );
  2052. H h = ( startArgc + 7 < argc ? EngineUnmarshallData< H >()( argv[ startArgc + 7 ] ) : H( defaultArgs.h ) );
  2053. I i = ( startArgc + 8 < argc ? EngineUnmarshallData< I >()( argv[ startArgc + 8 ] ) : I( defaultArgs.i ) );
  2054. J j = ( startArgc + 9 < argc ? EngineUnmarshallData< J >()( argv[ startArgc + 9 ] ) : J( defaultArgs.j ) );
  2055. return _EngineConsoleThunkReturnValue( fn( a, b, c, d, e, f, g, h, i, j ) );
  2056. }
  2057. template< typename Frame >
  2058. static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( Frame::*fn )( A, B, C, D, E, F, G, H, I, J ) const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, A, B, C, D, E, F, G, H, I, J ) >& defaultArgs )
  2059. {
  2060. A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.b ) );
  2061. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) );
  2062. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) );
  2063. D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.e ) );
  2064. E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.f ) );
  2065. F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.g ) );
  2066. G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.h ) );
  2067. H h = ( startArgc + 7 < argc ? EngineUnmarshallData< H >()( argv[ startArgc + 7 ] ) : H( defaultArgs.i ) );
  2068. I i = ( startArgc + 8 < argc ? EngineUnmarshallData< I >()( argv[ startArgc + 8 ] ) : I( defaultArgs.j ) );
  2069. J j = ( startArgc + 9 < argc ? EngineUnmarshallData< J >()( argv[ startArgc + 9 ] ) : J( defaultArgs.k ) );
  2070. return _EngineConsoleThunkReturnValue( ( frame->*fn )( a, b, c, d, e, f, g, h, i, j ) );
  2071. }
  2072. };
  2073. template< S32 startArgc, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I, typename J >
  2074. struct _EngineConsoleThunk< startArgc, void( A, B, C, D, E, F, G, H, I, J ) >
  2075. {
  2076. typedef void ReturnType;
  2077. static const S32 NUM_ARGS = 10 + startArgc;
  2078. static void thunk( S32 argc, ConsoleValueRef *argv, void ( *fn )( A, B, C, D, E, F, G, H, I, J ), const _EngineFunctionDefaultArguments< void( A, B, C, D, E, F, G, H, I, J ) >& defaultArgs )
  2079. {
  2080. A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.a ) );
  2081. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) );
  2082. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) );
  2083. D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.d ) );
  2084. E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.e ) );
  2085. F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.f ) );
  2086. G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.g ) );
  2087. H h = ( startArgc + 7 < argc ? EngineUnmarshallData< H >()( argv[ startArgc + 7 ] ) : H( defaultArgs.h ) );
  2088. I i = ( startArgc + 8 < argc ? EngineUnmarshallData< I >()( argv[ startArgc + 8 ] ) : I( defaultArgs.i ) );
  2089. J j = ( startArgc + 9 < argc ? EngineUnmarshallData< J >()( argv[ startArgc + 9 ] ) : J( defaultArgs.j ) );
  2090. fn( a, b, c, d, e, f, g, h, i, j );
  2091. }
  2092. template< typename Frame >
  2093. static void thunk( S32 argc, ConsoleValueRef *argv, void ( Frame::*fn )( A, B, C, D, E, F, G, H, I, J ) const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, A, B, C, D, E, F, G, H, I, J ) >& defaultArgs )
  2094. {
  2095. A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.b ) );
  2096. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) );
  2097. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) );
  2098. D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.e ) );
  2099. E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.f ) );
  2100. F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.g ) );
  2101. G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.h ) );
  2102. H h = ( startArgc + 7 < argc ? EngineUnmarshallData< H >()( argv[ startArgc + 7 ] ) : H( defaultArgs.i ) );
  2103. I i = ( startArgc + 8 < argc ? EngineUnmarshallData< I >()( argv[ startArgc + 8 ] ) : I( defaultArgs.j ) );
  2104. J j = ( startArgc + 9 < argc ? EngineUnmarshallData< J >()( argv[ startArgc + 9 ] ) : J( defaultArgs.k ) );
  2105. ( frame->*fn )( a, b, c, d, e, f, g, h, i, j );
  2106. }
  2107. };
  2108. 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 >
  2109. struct _EngineConsoleThunk< startArgc, R( A, B, C, D, E, F, G, H, I, J, K ) >
  2110. {
  2111. typedef typename _EngineConsoleThunkType< R >::ReturnType ReturnType;
  2112. static const S32 NUM_ARGS = 11 + startArgc;
  2113. static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( *fn )( A, B, C, D, E, F, G, H, I, J, K ), const _EngineFunctionDefaultArguments< void( A, B, C, D, E, F, G, H, I, J, K ) >& defaultArgs )
  2114. {
  2115. A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.a ) );
  2116. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) );
  2117. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) );
  2118. D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.d ) );
  2119. E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.e ) );
  2120. F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.f ) );
  2121. G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.g ) );
  2122. H h = ( startArgc + 7 < argc ? EngineUnmarshallData< H >()( argv[ startArgc + 7 ] ) : H( defaultArgs.h ) );
  2123. I i = ( startArgc + 8 < argc ? EngineUnmarshallData< I >()( argv[ startArgc + 8 ] ) : I( defaultArgs.i ) );
  2124. J j = ( startArgc + 9 < argc ? EngineUnmarshallData< J >()( argv[ startArgc + 9 ] ) : J( defaultArgs.j ) );
  2125. K k = ( startArgc + 10 < argc ? EngineUnmarshallData< K >()( argv[ startArgc + 10 ] ) : K( defaultArgs.k ) );
  2126. return _EngineConsoleThunkReturnValue( fn( a, b, c, d, e, f, g, h, i, j, k ) );
  2127. }
  2128. template< typename Frame >
  2129. static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( Frame::*fn )( A, B, C, D, E, F, G, H, I, J, K ) const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, A, B, C, D, E, F, G, H, I, J, K ) >& defaultArgs )
  2130. {
  2131. A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.b ) );
  2132. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) );
  2133. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) );
  2134. D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.e ) );
  2135. E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.f ) );
  2136. F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.g ) );
  2137. G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.h ) );
  2138. H h = ( startArgc + 7 < argc ? EngineUnmarshallData< H >()( argv[ startArgc + 7 ] ) : H( defaultArgs.i ) );
  2139. I i = ( startArgc + 8 < argc ? EngineUnmarshallData< I >()( argv[ startArgc + 8 ] ) : I( defaultArgs.j ) );
  2140. J j = ( startArgc + 9 < argc ? EngineUnmarshallData< J >()( argv[ startArgc + 9 ] ) : J( defaultArgs.k ) );
  2141. K k = ( startArgc + 10 < argc ? EngineUnmarshallData< K >()( argv[ startArgc + 10 ] ) : K( defaultArgs.l ) );
  2142. return _EngineConsoleThunkReturnValue( ( frame->*fn )( a, b, c, d, e, f, g, h, i, j, k ) );
  2143. }
  2144. };
  2145. 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 >
  2146. struct _EngineConsoleThunk< startArgc, void( A, B, C, D, E, F, G, H, I, J, K ) >
  2147. {
  2148. typedef void ReturnType;
  2149. static const S32 NUM_ARGS = 11 + startArgc;
  2150. static void thunk( S32 argc, ConsoleValueRef *argv, void ( *fn )( A, B, C, D, E, F, G, H, I, J, K ), const _EngineFunctionDefaultArguments< void( A, B, C, D, E, F, G, H, I, J, K ) >& defaultArgs )
  2151. {
  2152. A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.a ) );
  2153. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) );
  2154. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) );
  2155. D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.d ) );
  2156. E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.e ) );
  2157. F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.f ) );
  2158. G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.g ) );
  2159. H h = ( startArgc + 7 < argc ? EngineUnmarshallData< H >()( argv[ startArgc + 7 ] ) : H( defaultArgs.h ) );
  2160. I i = ( startArgc + 8 < argc ? EngineUnmarshallData< I >()( argv[ startArgc + 8 ] ) : I( defaultArgs.i ) );
  2161. J j = ( startArgc + 9 < argc ? EngineUnmarshallData< J >()( argv[ startArgc + 9 ] ) : J( defaultArgs.j ) );
  2162. K k = ( startArgc + 10 < argc ? EngineUnmarshallData< K >()( argv[ startArgc + 10 ] ) : K( defaultArgs.k ) );
  2163. fn( a, b, c, d, e, f, g, h, i, j, k );
  2164. }
  2165. template< typename Frame >
  2166. static void thunk( S32 argc, ConsoleValueRef *argv, void ( Frame::*fn )( A, B, C, D, E, F, G, H, I, J, K ) const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, A, B, C, D, E, F, G, H, I, J, K ) >& defaultArgs )
  2167. {
  2168. A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.b ) );
  2169. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) );
  2170. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) );
  2171. D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.e ) );
  2172. E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.f ) );
  2173. F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.g ) );
  2174. G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.h ) );
  2175. H h = ( startArgc + 7 < argc ? EngineUnmarshallData< H >()( argv[ startArgc + 7 ] ) : H( defaultArgs.i ) );
  2176. I i = ( startArgc + 8 < argc ? EngineUnmarshallData< I >()( argv[ startArgc + 8 ] ) : I( defaultArgs.j ) );
  2177. J j = ( startArgc + 9 < argc ? EngineUnmarshallData< J >()( argv[ startArgc + 9 ] ) : J( defaultArgs.k ) );
  2178. K k = ( startArgc + 10 < argc ? EngineUnmarshallData< K >()( argv[ startArgc + 10 ] ) : K( defaultArgs.l ) );
  2179. ( frame->*fn )( a, b, c, d, e, f, g, h, i, j, k );
  2180. }
  2181. };
  2182. 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, typename L >
  2183. struct _EngineConsoleThunk< startArgc, R( A, B, C, D, E, F, G, H, I, J, K, L ) >
  2184. {
  2185. typedef typename _EngineConsoleThunkType< R >::ReturnType ReturnType;
  2186. static const S32 NUM_ARGS = 12 + startArgc;
  2187. static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( *fn )( A, B, C, D, E, F, G, H, I, J, K, L ), const _EngineFunctionDefaultArguments< void( A, B, C, D, E, F, G, H, I, J, K, L ) >& defaultArgs )
  2188. {
  2189. A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.a ) );
  2190. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) );
  2191. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) );
  2192. D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.d ) );
  2193. E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.e ) );
  2194. F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.f ) );
  2195. G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.g ) );
  2196. H h = ( startArgc + 7 < argc ? EngineUnmarshallData< H >()( argv[ startArgc + 7 ] ) : H( defaultArgs.h ) );
  2197. I i = ( startArgc + 8 < argc ? EngineUnmarshallData< I >()( argv[ startArgc + 8 ] ) : I( defaultArgs.i ) );
  2198. J j = ( startArgc + 9 < argc ? EngineUnmarshallData< J >()( argv[ startArgc + 9 ] ) : J( defaultArgs.j ) );
  2199. K k = ( startArgc + 10 < argc ? EngineUnmarshallData< K >()( argv[ startArgc + 10 ] ) : K( defaultArgs.k ) );
  2200. L l = ( startArgc + 11 < argc ? EngineUnmarshallData< L >()( argv[ startArgc + 11 ] ) : L( defaultArgs.l ) );
  2201. return _EngineConsoleThunkReturnValue( fn( a, b, c, d, e, f, g, h, i, j, k, l ) );
  2202. }
  2203. template< typename Frame >
  2204. static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( Frame::*fn )( A, B, C, D, E, F, G, H, I, J, K, L ) const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, A, B, C, D, E, F, G, H, I, J, K, L ) >& defaultArgs )
  2205. {
  2206. A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.b ) );
  2207. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) );
  2208. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) );
  2209. D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.e ) );
  2210. E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.f ) );
  2211. F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.g ) );
  2212. G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.h ) );
  2213. H h = ( startArgc + 7 < argc ? EngineUnmarshallData< H >()( argv[ startArgc + 7 ] ) : H( defaultArgs.i ) );
  2214. I i = ( startArgc + 8 < argc ? EngineUnmarshallData< I >()( argv[ startArgc + 8 ] ) : I( defaultArgs.j ) );
  2215. J j = ( startArgc + 9 < argc ? EngineUnmarshallData< J >()( argv[ startArgc + 9 ] ) : J( defaultArgs.k ) );
  2216. K k = ( startArgc + 10 < argc ? EngineUnmarshallData< K >()( argv[ startArgc + 10 ] ) : K( defaultArgs.l ) );
  2217. L l = ( startArgc + 11 < argc ? EngineUnmarshallData< L >()( argv[ startArgc + 11 ] ) : L( defaultArgs.l ) );
  2218. return _EngineConsoleThunkReturnValue( ( frame->*fn )( a, b, c, d, e, f, g, h, i, j, k, l ) );
  2219. }
  2220. };
  2221. 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, typename L >
  2222. struct _EngineConsoleThunk< startArgc, void( A, B, C, D, E, F, G, H, I, J, K, L ) >
  2223. {
  2224. typedef void ReturnType;
  2225. static const S32 NUM_ARGS = 12 + startArgc;
  2226. static void thunk( S32 argc, ConsoleValueRef *argv, void ( *fn )( A, B, C, D, E, F, G, H, I, J, K, L ), const _EngineFunctionDefaultArguments< void( A, B, C, D, E, F, G, H, I, J, K, L ) >& defaultArgs )
  2227. {
  2228. A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.a ) );
  2229. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) );
  2230. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) );
  2231. D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.d ) );
  2232. E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.e ) );
  2233. F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.f ) );
  2234. G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.g ) );
  2235. H h = ( startArgc + 7 < argc ? EngineUnmarshallData< H >()( argv[ startArgc + 7 ] ) : H( defaultArgs.h ) );
  2236. I i = ( startArgc + 8 < argc ? EngineUnmarshallData< I >()( argv[ startArgc + 8 ] ) : I( defaultArgs.i ) );
  2237. J j = ( startArgc + 9 < argc ? EngineUnmarshallData< J >()( argv[ startArgc + 9 ] ) : J( defaultArgs.j ) );
  2238. K k = ( startArgc + 10 < argc ? EngineUnmarshallData< K >()( argv[ startArgc + 10 ] ) : K( defaultArgs.k ) );
  2239. L l = ( startArgc + 11 < argc ? EngineUnmarshallData< L >()( argv[ startArgc + 11 ] ) : L( defaultArgs.l ) );
  2240. fn( a, b, c, d, e, f, g, h, i, j, k, l );
  2241. }
  2242. template< typename Frame >
  2243. static void thunk( S32 argc, ConsoleValueRef *argv, void ( Frame::*fn )( A, B, C, D, E, F, G, H, I, J, K, L ) const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, A, B, C, D, E, F, G, H, I, J, K, L ) >& defaultArgs )
  2244. {
  2245. A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.b ) );
  2246. B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) );
  2247. C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) );
  2248. D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.e ) );
  2249. E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.f ) );
  2250. F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.g ) );
  2251. G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.h ) );
  2252. H h = ( startArgc + 7 < argc ? EngineUnmarshallData< H >()( argv[ startArgc + 7 ] ) : H( defaultArgs.i ) );
  2253. I i = ( startArgc + 8 < argc ? EngineUnmarshallData< I >()( argv[ startArgc + 8 ] ) : I( defaultArgs.j ) );
  2254. J j = ( startArgc + 9 < argc ? EngineUnmarshallData< J >()( argv[ startArgc + 9 ] ) : J( defaultArgs.k ) );
  2255. K k = ( startArgc + 10 < argc ? EngineUnmarshallData< K >()( argv[ startArgc + 10 ] ) : K( defaultArgs.l ) );
  2256. L l = ( startArgc + 11 < argc ? EngineUnmarshallData< L >()( argv[ startArgc + 11 ] ) : L( defaultArgs.l ) );
  2257. ( frame->*fn )( a, b, c, d, e, f, g, h, i, j, k, l );
  2258. }
  2259. };
  2260. /// @}
  2261. /// @name API Definition Macros
  2262. ///
  2263. /// The macros in this group allow to create engine API functions that work both with the
  2264. /// legacy console system as well as with the new engine export system. As such, they only
  2265. /// support those function features that are available in both systems. This means that for
  2266. /// console-style variadic functions, the ConsoleXXX must be used and that for overloaded
  2267. /// and/or C-style variadic functions as well as for placing functions in export scopes,
  2268. /// DEFINE_CALLIN must be used directly.
  2269. ///
  2270. /// When the console system is removed, the console thunking functionality will be removed
  2271. /// from these macros but otherwise they will remain unchanged and in place.
  2272. ///
  2273. /// @{
  2274. // Helpers to implement initialization checks. Pulled out into separate macros so this can be deactivated easily.
  2275. // Especially important for the initialize() function itself.
  2276. #define _CHECK_ENGINE_INITIALIZED_IMPL( fnName, returnType ) \
  2277. if( !engineAPI::gIsInitialized ) \
  2278. { \
  2279. Con::errorf( "EngineAPI: Engine not initialized when calling " #fnName ); \
  2280. return EngineTypeTraits< returnType >::ReturnValue( EngineTypeTraits< returnType >::ReturnValueType() ); \
  2281. }
  2282. #define _CHECK_ENGINE_INITIALIZED( fnName, returnType ) _CHECK_ENGINE_INITIALIZED_IMPL( fnName, returnType )
  2283. /// Define a call-in point for calling into the engine.
  2284. ///
  2285. /// @param name The name of the function as it should be seen by the control layer.
  2286. /// @param returnType The value type returned to the control layer.
  2287. /// @param args The argument list as it would appear on the function definition
  2288. /// @param defaultArgs The list of default argument values.
  2289. /// @param usage The usage doc string for the engine API reference.
  2290. ///
  2291. /// @code
  2292. /// DefineEngineFunction( myFunction, int, ( float f, const String& s ), ( "value for s" ), "This is my function." )
  2293. /// {
  2294. /// return int( f ) + dAtoi( s );
  2295. /// }
  2296. /// @endcode
  2297. #define DefineEngineFunction( name, returnType, args, defaultArgs, usage ) \
  2298. static inline returnType _fn ## name ## impl args; \
  2299. TORQUE_API EngineTypeTraits< returnType >::ReturnValueType fn ## name \
  2300. ( _EngineFunctionTrampoline< returnType args >::Args a ) \
  2301. { \
  2302. _CHECK_ENGINE_INITIALIZED( name, returnType ); \
  2303. return EngineTypeTraits< returnType >::ReturnValue( \
  2304. _EngineFunctionTrampoline< returnType args >::jmp( _fn ## name ## impl, a ) \
  2305. ); \
  2306. } \
  2307. static _EngineFunctionDefaultArguments< void args > _fn ## name ## DefaultArgs defaultArgs; \
  2308. static EngineFunctionInfo _fn ## name ## FunctionInfo( \
  2309. #name, \
  2310. &_SCOPE<>()(), \
  2311. usage, \
  2312. #returnType " " #name #args, \
  2313. "fn" #name, \
  2314. TYPE< returnType args >(), \
  2315. &_fn ## name ## DefaultArgs, \
  2316. ( void* ) &fn ## name, \
  2317. 0 \
  2318. ); \
  2319. static _EngineConsoleThunkType< returnType >::ReturnType _ ## name ## caster( SimObject*, S32 argc, ConsoleValueRef *argv ) \
  2320. { \
  2321. return _EngineConsoleThunkType< returnType >::ReturnType( _EngineConsoleThunk< 1, returnType args >::thunk( \
  2322. argc, argv, &_fn ## name ## impl, _fn ## name ## DefaultArgs \
  2323. ) ); \
  2324. } \
  2325. static ConsoleFunctionHeader _ ## name ## header \
  2326. ( #returnType, #args, #defaultArgs ); \
  2327. static ConsoleConstructor \
  2328. _ ## name ## obj( NULL, #name, _EngineConsoleThunkType< returnType >::CallbackType( _ ## name ## caster ), usage, \
  2329. _EngineConsoleThunk< 1, returnType args >::NUM_ARGS - _EngineConsoleThunkCountArgs() defaultArgs, \
  2330. _EngineConsoleThunk< 1, returnType args >::NUM_ARGS, \
  2331. false, &_ ## name ## header \
  2332. ); \
  2333. static inline returnType _fn ## name ## impl args
  2334. // The next thing is a bit tricky. DefineEngineMethod allows to make the 'object' (=this) argument to the function
  2335. // implicit which presents quite an obstacle for the macro internals as the engine export system requires the
  2336. // name of a DLL symbol that represents an extern "C" function with an explicit first object pointer argument.
  2337. //
  2338. // Even if we ignored the fact that we don't have a guarantee how the various C++ compilers implement implicit 'this' arguments,
  2339. // 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
  2340. // get to the function symbol name (let alone the fact that typing this method correctly would be tricky).
  2341. //
  2342. // So, the trick employed here is to package all but the implicit 'this' argument in a structure and then define an
  2343. // extern "C" function that takes the object pointer as a first argument and the struct type as the second argument.
  2344. // This will result in a function with an identical stack call frame layout to the function we want.
  2345. //
  2346. // Unfortunately, that still requires that function to chain on to the real user-defined function. To do this
  2347. // cleanly and portably, _EngineMethodTrampoline is used to unpack and jump the call from extern "C" into C++ space.
  2348. // In optimized builds, the compiler should be smart enough to pretty much optimize all our trickery here away.
  2349. #define _DefineMethodTrampoline( className, name, returnType, args ) \
  2350. TORQUE_API EngineTypeTraits< returnType >::ReturnValueType \
  2351. fn ## className ## _ ## name ( className* object, _EngineMethodTrampoline< _ ## className ## name ## frame, returnType args >::Args a ) \
  2352. { \
  2353. _CHECK_ENGINE_INITIALIZED( className::name, returnType ); \
  2354. return EngineTypeTraits< returnType >::ReturnValue( \
  2355. _EngineMethodTrampoline< _ ## className ## name ## frame, returnType args >::jmp( object, a ) \
  2356. ); \
  2357. }
  2358. /// Define a call-in point for calling a method on an engine object.
  2359. ///
  2360. /// @param name The name of the C++ class.
  2361. /// @param name The name of the method as it should be seen by the control layer.
  2362. /// @param returnType The value type returned to the control layer.
  2363. /// @param args The argument list as it would appear on the function definition
  2364. /// @param defaultArgs The list of default argument values.
  2365. /// @param usage The usage doc string for the engine API reference.
  2366. ///
  2367. /// @code
  2368. /// DefineEngineMethod( MyClass, myMethod, int, ( float f, const String& s ), ( "value for s" ), "This is my method." )
  2369. /// {
  2370. /// return object->someMethod( f, s );
  2371. /// }
  2372. /// @endcode
  2373. #define DefineEngineMethod( className, name, returnType, args, defaultArgs, usage ) \
  2374. struct _ ## className ## name ## frame \
  2375. { \
  2376. typedef className ObjectType; \
  2377. className* object; \
  2378. inline returnType _exec args const; \
  2379. }; \
  2380. _DefineMethodTrampoline( className, name, returnType, args ); \
  2381. static _EngineFunctionDefaultArguments< _EngineMethodTrampoline< _ ## className ## name ## frame, void args >::FunctionType > \
  2382. _fn ## className ## name ## DefaultArgs defaultArgs; \
  2383. static EngineFunctionInfo _fn ## className ## name ## FunctionInfo( \
  2384. #name, \
  2385. &_SCOPE< className >()(), \
  2386. usage, \
  2387. "virtual " #returnType " " #name #args, \
  2388. "fn" #className "_" #name, \
  2389. TYPE< _EngineMethodTrampoline< _ ## className ## name ## frame, returnType args >::FunctionType >(), \
  2390. &_fn ## className ## name ## DefaultArgs, \
  2391. ( void* ) &fn ## className ## _ ## name, \
  2392. 0 \
  2393. ); \
  2394. static _EngineConsoleThunkType< returnType >::ReturnType _ ## className ## name ## caster( SimObject* object, S32 argc, ConsoleValueRef *argv ) \
  2395. { \
  2396. _ ## className ## name ## frame frame; \
  2397. frame.object = static_cast< className* >( object ); \
  2398. return _EngineConsoleThunkType< returnType >::ReturnType( _EngineConsoleThunk< 2, returnType args >::thunk( \
  2399. argc, argv, &_ ## className ## name ## frame::_exec, &frame, _fn ## className ## name ## DefaultArgs \
  2400. ) ); \
  2401. } \
  2402. static ConsoleFunctionHeader _ ## className ## name ## header \
  2403. ( #returnType, #args, #defaultArgs ); \
  2404. static ConsoleConstructor \
  2405. className ## name ## obj( #className, #name, \
  2406. _EngineConsoleThunkType< returnType >::CallbackType( _ ## className ## name ## caster ), usage, \
  2407. _EngineConsoleThunk< 2, returnType args >::NUM_ARGS - _EngineConsoleThunkCountArgs() defaultArgs, \
  2408. _EngineConsoleThunk< 2, returnType args >::NUM_ARGS, \
  2409. false, &_ ## className ## name ## header \
  2410. ); \
  2411. returnType _ ## className ## name ## frame::_exec args const
  2412. /// Define a call-in point for calling into the engine. Unlike with DefineEngineFunction, the statically
  2413. /// callable function will be confined to the namespace of the given class.
  2414. ///
  2415. /// @param name The name of the C++ class (or a registered export scope).
  2416. /// @param name The name of the method as it should be seen by the control layer.
  2417. /// @param returnType The value type returned to the control layer.
  2418. /// @param args The argument list as it would appear on the function definition
  2419. /// @param defaultArgs The list of default argument values.
  2420. /// @param usage The usage doc string for the engine API reference.
  2421. ///
  2422. /// @code
  2423. /// DefineEngineStaticMethod( MyClass, myMethod, int, ( float f, string s ), ( "value for s" ), "This is my method." )
  2424. /// {
  2425. /// }
  2426. /// @endcode
  2427. #define DefineEngineStaticMethod( className, name, returnType, args, defaultArgs, usage ) \
  2428. static inline returnType _fn ## className ## name ## impl args; \
  2429. TORQUE_API EngineTypeTraits< returnType >::ReturnValueType fn ## className ## _ ## name \
  2430. ( _EngineFunctionTrampoline< returnType args >::Args a ) \
  2431. { \
  2432. _CHECK_ENGINE_INITIALIZED( className::name, returnType ); \
  2433. return EngineTypeTraits< returnType >::ReturnValue( \
  2434. _EngineFunctionTrampoline< returnType args >::jmp( _fn ## className ## name ## impl, a ) \
  2435. ); \
  2436. } \
  2437. static _EngineFunctionDefaultArguments< void args > _fn ## className ## name ## DefaultArgs defaultArgs; \
  2438. static EngineFunctionInfo _fn ## name ## FunctionInfo( \
  2439. #name, \
  2440. &_SCOPE< className >()(), \
  2441. usage, \
  2442. #returnType " " #name #args, \
  2443. "fn" #className "_" #name, \
  2444. TYPE< returnType args >(), \
  2445. &_fn ## className ## name ## DefaultArgs, \
  2446. ( void* ) &fn ## className ## _ ## name, \
  2447. 0 \
  2448. ); \
  2449. static _EngineConsoleThunkType< returnType >::ReturnType _ ## className ## name ## caster( SimObject*, S32 argc, ConsoleValueRef *argv )\
  2450. { \
  2451. return _EngineConsoleThunkType< returnType >::ReturnType( _EngineConsoleThunk< 1, returnType args >::thunk( \
  2452. argc, argv, &_fn ## className ## name ## impl, _fn ## className ## name ## DefaultArgs \
  2453. ) ); \
  2454. } \
  2455. static ConsoleFunctionHeader _ ## className ## name ## header \
  2456. ( #returnType, #args, #defaultArgs, true ); \
  2457. static ConsoleConstructor \
  2458. _ ## className ## name ## obj( #className, #name, _EngineConsoleThunkType< returnType >::CallbackType( _ ## className ## name ## caster ), usage, \
  2459. _EngineConsoleThunk< 1, returnType args >::NUM_ARGS - _EngineConsoleThunkCountArgs() defaultArgs, \
  2460. _EngineConsoleThunk< 1, returnType args >::NUM_ARGS, \
  2461. false, &_ ## className ## name ## header \
  2462. ); \
  2463. static inline returnType _fn ## className ## name ## impl args
  2464. // Convenience macros to allow defining functions that use the new marshalling features
  2465. // while being only visible in the console interop. When we drop the console system,
  2466. // these macros can be removed and all definitions that make use of them can be removed
  2467. // as well.
  2468. #define DefineConsoleFunction( name, returnType, args, defaultArgs, usage ) \
  2469. static inline returnType _fn ## name ## impl args; \
  2470. static _EngineFunctionDefaultArguments< void args > _fn ## name ## DefaultArgs defaultArgs; \
  2471. static _EngineConsoleThunkType< returnType >::ReturnType _ ## name ## caster( SimObject*, S32 argc, ConsoleValueRef *argv ) \
  2472. { \
  2473. return _EngineConsoleThunkType< returnType >::ReturnType( _EngineConsoleThunk< 1, returnType args >::thunk( \
  2474. argc, argv, &_fn ## name ## impl, _fn ## name ## DefaultArgs \
  2475. ) ); \
  2476. } \
  2477. static ConsoleFunctionHeader _ ## name ## header \
  2478. ( #returnType, #args, #defaultArgs ); \
  2479. static ConsoleConstructor \
  2480. _ ## name ## obj( NULL, #name, _EngineConsoleThunkType< returnType >::CallbackType( _ ## name ## caster ), usage, \
  2481. _EngineConsoleThunk< 1, returnType args >::NUM_ARGS - _EngineConsoleThunkCountArgs() defaultArgs, \
  2482. _EngineConsoleThunk< 1, returnType args >::NUM_ARGS, \
  2483. false, &_ ## name ## header \
  2484. ); \
  2485. static inline returnType _fn ## name ## impl args
  2486. #define DefineConsoleMethod( className, name, returnType, args, defaultArgs, usage ) \
  2487. struct _ ## className ## name ## frame \
  2488. { \
  2489. typedef className ObjectType; \
  2490. className* object; \
  2491. inline returnType _exec args const; \
  2492. }; \
  2493. static _EngineFunctionDefaultArguments< _EngineMethodTrampoline< _ ## className ## name ## frame, void args >::FunctionType > \
  2494. _fn ## className ## name ## DefaultArgs defaultArgs; \
  2495. static _EngineConsoleThunkType< returnType >::ReturnType _ ## className ## name ## caster( SimObject* object, S32 argc, ConsoleValueRef *argv ) \
  2496. { \
  2497. _ ## className ## name ## frame frame; \
  2498. frame.object = static_cast< className* >( object ); \
  2499. return _EngineConsoleThunkType< returnType >::ReturnType( _EngineConsoleThunk< 2, returnType args >::thunk( \
  2500. argc, argv, &_ ## className ## name ## frame::_exec, &frame, _fn ## className ## name ## DefaultArgs \
  2501. ) ); \
  2502. } \
  2503. static ConsoleFunctionHeader _ ## className ## name ## header \
  2504. ( #returnType, #args, #defaultArgs ); \
  2505. static ConsoleConstructor \
  2506. className ## name ## obj( #className, #name, \
  2507. _EngineConsoleThunkType< returnType >::CallbackType( _ ## className ## name ## caster ), usage, \
  2508. _EngineConsoleThunk< 2, returnType args >::NUM_ARGS - _EngineConsoleThunkCountArgs() defaultArgs, \
  2509. _EngineConsoleThunk< 2, returnType args >::NUM_ARGS, \
  2510. false, &_ ## className ## name ## header \
  2511. ); \
  2512. returnType _ ## className ## name ## frame::_exec args const
  2513. #define DefineConsoleStaticMethod( className, name, returnType, args, defaultArgs, usage ) \
  2514. static inline returnType _fn ## className ## name ## impl args; \
  2515. static _EngineFunctionDefaultArguments< void args > _fn ## className ## name ## DefaultArgs defaultArgs; \
  2516. static _EngineConsoleThunkType< returnType >::ReturnType _ ## className ## name ## caster( SimObject*, S32 argc, ConsoleValueRef *argv )\
  2517. { \
  2518. return _EngineConsoleThunkType< returnType >::ReturnType( _EngineConsoleThunk< 1, returnType args >::thunk( \
  2519. argc, argv, &_fn ## className ## name ## impl, _fn ## className ## name ## DefaultArgs \
  2520. ) ); \
  2521. } \
  2522. static ConsoleFunctionHeader _ ## className ## name ## header \
  2523. ( #returnType, #args, #defaultArgs, true ); \
  2524. static ConsoleConstructor \
  2525. _ ## className ## name ## obj( #className, #name, _EngineConsoleThunkType< returnType >::CallbackType( _ ## className ## name ## caster ), usage, \
  2526. _EngineConsoleThunk< 1, returnType args >::NUM_ARGS - _EngineConsoleThunkCountArgs() defaultArgs, \
  2527. _EngineConsoleThunk< 1, returnType args >::NUM_ARGS, \
  2528. false, &_ ## className ## name ## header \
  2529. ); \
  2530. static inline returnType _fn ## className ## name ## impl args
  2531. // The following three macros are only temporary. They allow to define engineAPI functions using the framework
  2532. // here in this file while being visible only in the new API. When the console interop is removed, these macros
  2533. // can be removed and all their uses be replaced with their corresponding versions that now still include support
  2534. // for the console (e.g. DefineNewEngineFunction should become DefineEngineFunction).
  2535. #define DefineNewEngineFunction( name, returnType, args, defaultArgs, usage ) \
  2536. static inline returnType _fn ## name ## impl args; \
  2537. TORQUE_API EngineTypeTraits< returnType >::ReturnValueType fn ## name \
  2538. ( _EngineFunctionTrampoline< returnType args >::Args a ) \
  2539. { \
  2540. _CHECK_ENGINE_INITIALIZED( name, returnType ); \
  2541. return EngineTypeTraits< returnType >::ReturnValue( \
  2542. _EngineFunctionTrampoline< returnType args >::jmp( _fn ## name ## impl, a ) \
  2543. ); \
  2544. } \
  2545. static _EngineFunctionDefaultArguments< void args > _fn ## name ## DefaultArgs defaultArgs; \
  2546. static EngineFunctionInfo _fn ## name ## FunctionInfo( \
  2547. #name, \
  2548. &_SCOPE<>()(), \
  2549. usage, \
  2550. #returnType " " #name #args, \
  2551. "fn" #name, \
  2552. TYPE< returnType args >(), \
  2553. &_fn ## name ## DefaultArgs, \
  2554. ( void* ) &fn ## name, \
  2555. 0 \
  2556. ); \
  2557. static inline returnType _fn ## name ## impl args
  2558. #define DefineNewEngineMethod( className, name, returnType, args, defaultArgs, usage ) \
  2559. struct _ ## className ## name ## frame \
  2560. { \
  2561. typedef className ObjectType; \
  2562. className* object; \
  2563. inline returnType _exec args const; \
  2564. }; \
  2565. _DefineMethodTrampoline( className, name, returnType, args ); \
  2566. static _EngineFunctionDefaultArguments< _EngineMethodTrampoline< _ ## className ## name ## frame, void args >::FunctionType > \
  2567. _fn ## className ## name ## DefaultArgs defaultArgs; \
  2568. static EngineFunctionInfo _fn ## className ## name ## FunctionInfo( \
  2569. #name, \
  2570. &_SCOPE< className >()(), \
  2571. usage, \
  2572. "virtual " #returnType " " #name #args, \
  2573. "fn" #className "_" #name, \
  2574. TYPE< _EngineMethodTrampoline< _ ## className ## name ## frame, returnType args >::FunctionType >(), \
  2575. &_fn ## className ## name ## DefaultArgs, \
  2576. ( void* ) &fn ## className ## _ ## name, \
  2577. 0 \
  2578. ); \
  2579. returnType _ ## className ## name ## frame::_exec args const
  2580. #define DefineNewEngineStaticMethod( className, name, returnType, args, defaultArgs, usage ) \
  2581. static inline returnType _fn ## className ## name ## impl args; \
  2582. TORQUE_API EngineTypeTraits< returnType >::ReturnValueType fn ## className ## _ ## name \
  2583. ( _EngineFunctionTrampoline< returnType args >::Args a ) \
  2584. { \
  2585. _CHECK_ENGINE_INITIALIZED( className::name, returnType ); \
  2586. return EngineTypeTraits< returnType >::ReturnValue( \
  2587. _EngineFunctionTrampoline< returnType args >::jmp( _fn ## className ## name ## impl, a ) \
  2588. ); \
  2589. } \
  2590. static _EngineFunctionDefaultArguments< void args > _fn ## className ## name ## DefaultArgs defaultArgs; \
  2591. static EngineFunctionInfo _fn ## name ## FunctionInfo( \
  2592. #name, \
  2593. &_SCOPE< className >()(), \
  2594. usage, \
  2595. #returnType " " #name #args, \
  2596. "fn" #className "_" #name, \
  2597. TYPE< returnType args >(), \
  2598. &_fn ## className ## name ## DefaultArgs, \
  2599. ( void* ) &fn ## className ## _ ## name, \
  2600. 0 \
  2601. ); \
  2602. static inline returnType _fn ## className ## name ## impl args
  2603. /// @}
  2604. //=============================================================================
  2605. // Callbacks.
  2606. //=============================================================================
  2607. /// Matching implement for DECLARE_CALLBACK.
  2608. ///
  2609. ///
  2610. /// @warn With the new interop system, method-style callbacks <em>must not</em> be triggered on object
  2611. /// that are being created! This is because the control layer will likely not yet have a fully valid wrapper
  2612. /// object in place for the EngineObject under construction.
  2613. #define IMPLEMENT_CALLBACK( class, name, returnType, args, argNames, usageString ) \
  2614. struct _ ## class ## name ## frame { typedef class ObjectType; }; \
  2615. TORQUE_API _EngineMethodTrampoline< _ ## class ## name ## frame, returnType args >::FunctionType* cb ## class ## _ ## name; \
  2616. TORQUE_API void set_cb ## class ## _ ## name( \
  2617. _EngineMethodTrampoline< _ ## class ## name ## frame, returnType args >::FunctionType fn ) \
  2618. { cb ## class ## _ ## name = fn; } \
  2619. _EngineMethodTrampoline< _ ## class ## name ## frame, returnType args >::FunctionType* cb ## class ## _ ## name; \
  2620. namespace { \
  2621. ::EngineFunctionInfo _cb ## class ## name( \
  2622. #name, \
  2623. &::_SCOPE< class >()(), \
  2624. usageString, \
  2625. "virtual " #returnType " " #name #args, \
  2626. "cb" #class "_" #name, \
  2627. ::TYPE< _EngineMethodTrampoline< _ ## class ## name ## frame, returnType args >::FunctionType >(), \
  2628. NULL, \
  2629. ( void* ) &cb ## class ## _ ## name, \
  2630. EngineFunctionCallout \
  2631. ); \
  2632. } \
  2633. returnType class::name ## _callback args \
  2634. { \
  2635. if( cb ## class ## _ ## name ) { \
  2636. _EngineCallbackHelper cbh( this, reinterpret_cast< const void* >( cb ## class ## _ ## name ) ); \
  2637. return returnType( cbh.call< returnType > argNames ); \
  2638. } \
  2639. if( engineAPI::gUseConsoleInterop ) \
  2640. { \
  2641. static StringTableEntry sName = StringTable->insert( #name ); \
  2642. _EngineConsoleCallbackHelper cbh( sName, this ); \
  2643. return returnType( cbh.call< returnType > argNames ); \
  2644. } \
  2645. return returnType(); \
  2646. } \
  2647. namespace { \
  2648. ConsoleFunctionHeader _ ## class ## name ## header( \
  2649. #returnType, #args, "" ); \
  2650. ConsoleConstructor _ ## class ## name ## obj( #class, #name, usageString, &_ ## class ## name ## header ); \
  2651. }
  2652. /// Used to define global callbacks not associated with
  2653. /// any particular class or namespace.
  2654. #define IMPLEMENT_GLOBAL_CALLBACK( name, returnType, args, argNames, usageString ) \
  2655. DEFINE_CALLOUT( cb ## name, name,, returnType, args, 0, usageString ); \
  2656. returnType name ## _callback args \
  2657. { \
  2658. if( cb ## name ) \
  2659. return returnType( cb ## name argNames ); \
  2660. if( engineAPI::gUseConsoleInterop ) \
  2661. { \
  2662. static StringTableEntry sName = StringTable->insert( #name ); \
  2663. _EngineConsoleCallbackHelper cbh( sName, NULL ); \
  2664. return returnType( cbh.call< returnType > argNames ); \
  2665. } \
  2666. return returnType(); \
  2667. } \
  2668. namespace { \
  2669. ConsoleFunctionHeader _ ## name ## header( \
  2670. #returnType, #args, "" ); \
  2671. ConsoleConstructor _ ## name ## obj( NULL, #name, usageString, &_ ## name ## header ); \
  2672. }
  2673. // Again, temporary macros to allow splicing the API while we still have the console interop around.
  2674. #define IMPLEMENT_CONSOLE_CALLBACK( class, name, returnType, args, argNames, usageString ) \
  2675. returnType class::name ## _callback args \
  2676. { \
  2677. if( engineAPI::gUseConsoleInterop ) \
  2678. { \
  2679. static StringTableEntry sName = StringTable->insert( #name ); \
  2680. _EngineConsoleCallbackHelper cbh( sName, this ); \
  2681. return returnType( cbh.call< returnType > argNames ); \
  2682. } \
  2683. return returnType(); \
  2684. } \
  2685. namespace { \
  2686. ConsoleFunctionHeader _ ## class ## name ## header( \
  2687. #returnType, #args, "" ); \
  2688. ConsoleConstructor _ ## class ## name ## obj( #class, #name, usageString, &_ ## class ## name ## header ); \
  2689. }
  2690. #define IMPLEMENT_NEW_CALLBACK( class, name, returnType, args, argNames, usageString ) \
  2691. struct _ ## class ## name ## frame { typedef class ObjectType; }; \
  2692. TORQUE_API _EngineMethodTrampoline< _ ## class ## name ## frame, returnType args >::FunctionType* cb ## class ## _ ## name; \
  2693. TORQUE_API void set_cb ## class ## _ ## name( \
  2694. _EngineMethodTrampoline< _ ## class ## name ## frame, returnType args >::FunctionType fn ) \
  2695. { cb ## class ## _ ## name = fn; } \
  2696. _EngineMethodTrampoline< _ ## class ## name ## frame, returnType args >::FunctionType* cb ## class ## _ ## name; \
  2697. namespace { \
  2698. ::EngineFunctionInfo _cb ## class ## name( \
  2699. #name, \
  2700. &::_SCOPE< class >()(), \
  2701. usageString, \
  2702. "virtual " #returnType " " #name #args, \
  2703. "cb" #class "_" #name, \
  2704. ::TYPE< _EngineMethodTrampoline< _ ## class ## name ## frame, returnType args >::FunctionType >(), \
  2705. NULL, \
  2706. &cb ## class ## _ ## name, \
  2707. EngineFunctionCallout \
  2708. ); \
  2709. } \
  2710. returnType class::name ## _callback args \
  2711. { \
  2712. if( cb ## class ## _ ## name ) { \
  2713. _EngineCallbackHelper cbh( this, reinterpret_cast< const void* >( cb ## class ## _ ## name ) ); \
  2714. return returnType( cbh.call< returnType > argNames ); \
  2715. } \
  2716. return returnType(); \
  2717. }
  2718. // Internal helper class for doing call-outs in the new interop.
  2719. struct _EngineCallbackHelper
  2720. {
  2721. protected:
  2722. EngineObject* mThis;
  2723. const void* mFn;
  2724. public:
  2725. _EngineCallbackHelper( EngineObject* pThis, const void* fn )
  2726. : mThis( pThis ),
  2727. mFn( fn ) {}
  2728. template< typename R >
  2729. R call() const
  2730. {
  2731. typedef R( FunctionType )( EngineObject* );
  2732. return R( reinterpret_cast< FunctionType* >( const_cast<void*>(mFn) )( mThis ) );
  2733. }
  2734. template< typename R, typename A >
  2735. R call( A a ) const
  2736. {
  2737. typedef R( FunctionType )( EngineObject*, A );
  2738. return R( reinterpret_cast< FunctionType* >( const_cast<void*>(mFn) )( mThis, a ) );
  2739. }
  2740. template< typename R, typename A, typename B >
  2741. R call( A a, B b ) const
  2742. {
  2743. typedef R( FunctionType )( EngineObject*, A, B );
  2744. return R( reinterpret_cast< FunctionType* >( const_cast<void*>(mFn) )( mThis, a, b ) );
  2745. }
  2746. template< typename R, typename A, typename B, typename C >
  2747. R call( A a, B b, C c ) const
  2748. {
  2749. typedef R( FunctionType )( EngineObject*, A, B, C );
  2750. return R( reinterpret_cast< FunctionType* >( const_cast<void*>(mFn) )( mThis, a, b, c ) );
  2751. }
  2752. template< typename R, typename A, typename B, typename C, typename D >
  2753. R call( A a, B b, C c, D d ) const
  2754. {
  2755. typedef R( FunctionType )( EngineObject*, A, B, C, D );
  2756. return R( reinterpret_cast< FunctionType* >( const_cast<void*>(mFn) )( mThis, a, b, c, d ) );
  2757. }
  2758. template< typename R, typename A, typename B, typename C, typename D, typename E >
  2759. R call( A a, B b, C c, D d, E e ) const
  2760. {
  2761. typedef R( FunctionType )( EngineObject*, A, B, C, D, E );
  2762. return R( reinterpret_cast< FunctionType* >( const_cast<void*>(mFn) )( mThis, a, b, c, d, e ) );
  2763. }
  2764. template< typename R, typename A, typename B, typename C, typename D, typename E, typename F >
  2765. R call( A a, B b, C c, D d, E e, F f ) const
  2766. {
  2767. typedef R( FunctionType )( EngineObject*, A, B, C, D, E, F );
  2768. return R( reinterpret_cast< FunctionType* >( const_cast<void*>(mFn) )( mThis, a, b, c, d, e, f ) );
  2769. }
  2770. template< typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G >
  2771. R call( A a, B b, C c, D d, E e, F f, G g ) const
  2772. {
  2773. typedef R( FunctionType )( EngineObject*, A, B, C, D, E, F, G );
  2774. return R( reinterpret_cast< FunctionType* >( const_cast<void*>(mFn) )( mThis, a, b, c, d, e, f, g ) );
  2775. }
  2776. template< typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H >
  2777. R call( A a, B b, C c, D d, E e, F f, G g, H h ) const
  2778. {
  2779. typedef R( FunctionType )( EngineObject*, A, B, C, D, E, F, G, H );
  2780. return R( reinterpret_cast< FunctionType* >( const_cast<void*>(mFn) )( mThis, a, b, c, d, e, f, g, h ) );
  2781. }
  2782. template< typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I >
  2783. R call( A a, B b, C c, D d, E e, F f, G g, H h, I i ) const
  2784. {
  2785. typedef R( FunctionType )( EngineObject*, A, B, C, D, E, F, G, H, I );
  2786. return R( reinterpret_cast< FunctionType* >( const_cast<void*>(mFn) )( mThis, a, b, c, d, e, f, g, h, i ) );
  2787. }
  2788. template< typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I, typename J >
  2789. R call( A a, B b, C c, D d, E e, F f, G g, H h, I i, J j ) const
  2790. {
  2791. typedef R( FunctionType )( EngineObject*, A, B, C, D, E, F, G, H, I, J );
  2792. return R( reinterpret_cast< FunctionType* >( const_cast<void*>(mFn) )( mThis, a, b, c, d, e, f, g, h, i, j ) );
  2793. }
  2794. 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 >
  2795. 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
  2796. {
  2797. typedef R( FunctionType )( EngineObject*, A, B, C, D, E, F, G, H, I, J, K );
  2798. return R( reinterpret_cast< FunctionType* >( const_cast<void*>(mFn) )( mThis, a, b, c, d, e, f, g, h, i, j, k ) );
  2799. }
  2800. 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 >
  2801. 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
  2802. {
  2803. typedef R( FunctionType )( EngineObject*, A, B, C, D, E, F, G, H, I, J, K, L );
  2804. return R( reinterpret_cast< FunctionType* >( const_cast<void*>(mFn) )( mThis, a, b, c, d, e, f, g, h, i, j, k, l ) );
  2805. }
  2806. };
  2807. #include "console/stringStack.h"
  2808. // Internal helper for callback support in legacy console system.
  2809. struct _BaseEngineConsoleCallbackHelper
  2810. {
  2811. public:
  2812. /// Matches up to storeArgs.
  2813. static const U32 MAX_ARGUMENTS = 11;
  2814. SimObject* mThis;
  2815. S32 mInitialArgc;
  2816. S32 mArgc;
  2817. StringTableEntry mCallbackName;
  2818. ConsoleValueRef mArgv[ MAX_ARGUMENTS + 2 ];
  2819. ConsoleValueRef _exec();
  2820. ConsoleValueRef _execLater(SimConsoleThreadExecEvent *evt);
  2821. _BaseEngineConsoleCallbackHelper() {;}
  2822. };
  2823. // Base helper for console callbacks
  2824. struct _EngineConsoleCallbackHelper : public _BaseEngineConsoleCallbackHelper
  2825. {
  2826. public:
  2827. _EngineConsoleCallbackHelper( StringTableEntry callbackName, SimObject* pThis )
  2828. {
  2829. mThis = pThis;
  2830. mArgc = mInitialArgc = pThis ? 2 : 1 ;
  2831. mCallbackName = callbackName;
  2832. }
  2833. template< typename R >
  2834. R call()
  2835. {
  2836. if (Con::isMainThread())
  2837. {
  2838. ConsoleStackFrameSaver sav; sav.save();
  2839. CSTK.reserveValues(mArgc, mArgv);
  2840. mArgv[ 0 ].value->setStackStringValue(mCallbackName);
  2841. return R( EngineUnmarshallData< R >()( _exec() ) );
  2842. }
  2843. else
  2844. {
  2845. SimConsoleThreadExecCallback cb;
  2846. SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc, NULL, false, &cb);
  2847. evt->populateArgs(mArgv);
  2848. mArgv[ 0 ].value->setStackStringValue(mCallbackName);
  2849. Sim::postEvent((SimObject*)Sim::getRootGroup(), evt, Sim::getCurrentTime());
  2850. return R( EngineUnmarshallData< R >()( cb.waitForResult() ) );
  2851. }
  2852. }
  2853. template< typename R, typename A >
  2854. R call( A a )
  2855. {
  2856. if (Con::isMainThread())
  2857. {
  2858. ConsoleStackFrameSaver sav; sav.save();
  2859. CSTK.reserveValues(mArgc+1, mArgv);
  2860. mArgv[ 0 ].value->setStackStringValue(mCallbackName);
  2861. EngineMarshallData( a, mArgc, mArgv );
  2862. return R( EngineUnmarshallData< R >()( _exec() ) );
  2863. }
  2864. else
  2865. {
  2866. SimConsoleThreadExecCallback cb;
  2867. SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc+1, NULL, false, &cb);
  2868. evt->populateArgs(mArgv);
  2869. mArgv[ 0 ].value->setStackStringValue(mCallbackName);
  2870. EngineMarshallData( a, mArgc, mArgv );
  2871. Sim::postEvent((SimObject*)Sim::getRootGroup(), evt, Sim::getCurrentTime());
  2872. return R( EngineUnmarshallData< R >()( cb.waitForResult() ) );
  2873. }
  2874. }
  2875. template< typename R, typename A, typename B >
  2876. R call( A a, B b )
  2877. {
  2878. if (Con::isMainThread())
  2879. {
  2880. ConsoleStackFrameSaver sav; sav.save();
  2881. CSTK.reserveValues(mArgc+2, mArgv);
  2882. mArgv[ 0 ].value->setStackStringValue(mCallbackName);
  2883. EngineMarshallData( a, mArgc, mArgv );
  2884. EngineMarshallData( b, mArgc, mArgv );
  2885. return R( EngineUnmarshallData< R >()( _exec() ) );
  2886. }
  2887. else
  2888. {
  2889. SimConsoleThreadExecCallback cb;
  2890. SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc+2, NULL, false, &cb);
  2891. evt->populateArgs(mArgv);
  2892. mArgv[ 0 ].value->setStackStringValue(mCallbackName);
  2893. EngineMarshallData( a, mArgc, mArgv );
  2894. EngineMarshallData( b, mArgc, mArgv );
  2895. Sim::postEvent((SimObject*)Sim::getRootGroup(), evt, Sim::getCurrentTime());
  2896. return R( EngineUnmarshallData< R >()( cb.waitForResult() ) );
  2897. }
  2898. }
  2899. template< typename R, typename A, typename B, typename C >
  2900. R call( A a, B b, C c )
  2901. {
  2902. if (Con::isMainThread())
  2903. {
  2904. ConsoleStackFrameSaver sav; sav.save();
  2905. CSTK.reserveValues(mArgc+3, mArgv);
  2906. mArgv[ 0 ].value->setStackStringValue(mCallbackName);
  2907. EngineMarshallData( a, mArgc, mArgv );
  2908. EngineMarshallData( b, mArgc, mArgv );
  2909. EngineMarshallData( c, mArgc, mArgv );
  2910. return R( EngineUnmarshallData< R >()( _exec() ) );
  2911. }
  2912. else
  2913. {
  2914. SimConsoleThreadExecCallback cb;
  2915. SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc+3, NULL, false, &cb);
  2916. evt->populateArgs(mArgv);
  2917. mArgv[ 0 ].value->setStackStringValue(mCallbackName);
  2918. EngineMarshallData( a, mArgc, mArgv );
  2919. EngineMarshallData( b, mArgc, mArgv );
  2920. EngineMarshallData( c, mArgc, mArgv );
  2921. Sim::postEvent((SimObject*)Sim::getRootGroup(), evt, Sim::getCurrentTime());
  2922. return R( EngineUnmarshallData< R >()( cb.waitForResult() ) );
  2923. }
  2924. }
  2925. template< typename R, typename A, typename B, typename C, typename D >
  2926. R call( A a, B b, C c, D d )
  2927. {
  2928. if (Con::isMainThread())
  2929. {
  2930. ConsoleStackFrameSaver sav; sav.save();
  2931. CSTK.reserveValues(mArgc+4, mArgv);
  2932. mArgv[ 0 ].value->setStackStringValue(mCallbackName);
  2933. EngineMarshallData( a, mArgc, mArgv );
  2934. EngineMarshallData( b, mArgc, mArgv );
  2935. EngineMarshallData( c, mArgc, mArgv );
  2936. EngineMarshallData( d, mArgc, mArgv );
  2937. return R( EngineUnmarshallData< R >()( _exec() ) );
  2938. }
  2939. else
  2940. {
  2941. SimConsoleThreadExecCallback cb;
  2942. SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc+4, NULL, false, &cb);
  2943. evt->populateArgs(mArgv);
  2944. mArgv[ 0 ].value->setStackStringValue(mCallbackName);
  2945. EngineMarshallData( a, mArgc, mArgv );
  2946. EngineMarshallData( b, mArgc, mArgv );
  2947. EngineMarshallData( c, mArgc, mArgv );
  2948. EngineMarshallData( d, mArgc, mArgv );
  2949. Sim::postEvent((SimObject*)Sim::getRootGroup(), evt, Sim::getCurrentTime());
  2950. return R( EngineUnmarshallData< R >()( cb.waitForResult() ) );
  2951. }
  2952. }
  2953. template< typename R, typename A, typename B, typename C, typename D, typename E >
  2954. R call( A a, B b, C c, D d, E e )
  2955. {
  2956. if (Con::isMainThread())
  2957. {
  2958. ConsoleStackFrameSaver sav; sav.save();
  2959. CSTK.reserveValues(mArgc+5, mArgv);
  2960. mArgv[ 0 ].value->setStackStringValue(mCallbackName);
  2961. EngineMarshallData( a, mArgc, mArgv );
  2962. EngineMarshallData( b, mArgc, mArgv );
  2963. EngineMarshallData( c, mArgc, mArgv );
  2964. EngineMarshallData( d, mArgc, mArgv );
  2965. EngineMarshallData( e, mArgc, mArgv );
  2966. return R( EngineUnmarshallData< R >()( _exec() ) );
  2967. }
  2968. else
  2969. {
  2970. SimConsoleThreadExecCallback cb;
  2971. SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc+5, NULL, false, &cb);
  2972. evt->populateArgs(mArgv);
  2973. mArgv[ 0 ].value->setStackStringValue(mCallbackName);
  2974. EngineMarshallData( a, mArgc, mArgv );
  2975. EngineMarshallData( b, mArgc, mArgv );
  2976. EngineMarshallData( c, mArgc, mArgv );
  2977. EngineMarshallData( d, mArgc, mArgv );
  2978. EngineMarshallData( e, mArgc, mArgv );
  2979. Sim::postEvent((SimObject*)Sim::getRootGroup(), evt, Sim::getCurrentTime());
  2980. return R( EngineUnmarshallData< R >()( cb.waitForResult() ) );
  2981. }
  2982. }
  2983. template< typename R, typename A, typename B, typename C, typename D, typename E, typename F >
  2984. R call( A a, B b, C c, D d, E e, F f )
  2985. {
  2986. if (Con::isMainThread())
  2987. {
  2988. ConsoleStackFrameSaver sav; sav.save();
  2989. CSTK.reserveValues(mArgc+6, mArgv);
  2990. mArgv[ 0 ].value->setStackStringValue(mCallbackName);
  2991. EngineMarshallData( a, mArgc, mArgv );
  2992. EngineMarshallData( b, mArgc, mArgv );
  2993. EngineMarshallData( c, mArgc, mArgv );
  2994. EngineMarshallData( d, mArgc, mArgv );
  2995. EngineMarshallData( e, mArgc, mArgv );
  2996. EngineMarshallData( f, mArgc, mArgv );
  2997. return R( EngineUnmarshallData< R >()( _exec() ) );
  2998. }
  2999. else
  3000. {
  3001. SimConsoleThreadExecCallback cb;
  3002. SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc+6, NULL, false, &cb);
  3003. evt->populateArgs(mArgv);
  3004. mArgv[ 0 ].value->setStackStringValue(mCallbackName);
  3005. EngineMarshallData( a, mArgc, mArgv );
  3006. EngineMarshallData( b, mArgc, mArgv );
  3007. EngineMarshallData( c, mArgc, mArgv );
  3008. EngineMarshallData( d, mArgc, mArgv );
  3009. EngineMarshallData( e, mArgc, mArgv );
  3010. EngineMarshallData( f, mArgc, mArgv );
  3011. Sim::postEvent((SimObject*)Sim::getRootGroup(), evt, Sim::getCurrentTime());
  3012. return R( EngineUnmarshallData< R >()( cb.waitForResult() ) );
  3013. }
  3014. }
  3015. template< typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G >
  3016. R call( A a, B b, C c, D d, E e, F f, G g )
  3017. {
  3018. if (Con::isMainThread())
  3019. {
  3020. ConsoleStackFrameSaver sav; sav.save();
  3021. CSTK.reserveValues(mArgc+7, mArgv);
  3022. mArgv[ 0 ].value->setStackStringValue(mCallbackName);
  3023. EngineMarshallData( a, mArgc, mArgv );
  3024. EngineMarshallData( b, mArgc, mArgv );
  3025. EngineMarshallData( c, mArgc, mArgv );
  3026. EngineMarshallData( d, mArgc, mArgv );
  3027. EngineMarshallData( e, mArgc, mArgv );
  3028. EngineMarshallData( f, mArgc, mArgv );
  3029. EngineMarshallData( g, mArgc, mArgv );
  3030. return R( EngineUnmarshallData< R >()( _exec() ) );
  3031. }
  3032. else
  3033. {
  3034. SimConsoleThreadExecCallback cb;
  3035. SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc+7, NULL, false, &cb);
  3036. evt->populateArgs(mArgv);
  3037. mArgv[ 0 ].value->setStackStringValue(mCallbackName);
  3038. EngineMarshallData( a, mArgc, mArgv );
  3039. EngineMarshallData( b, mArgc, mArgv );
  3040. EngineMarshallData( c, mArgc, mArgv );
  3041. EngineMarshallData( d, mArgc, mArgv );
  3042. EngineMarshallData( e, mArgc, mArgv );
  3043. EngineMarshallData( f, mArgc, mArgv );
  3044. EngineMarshallData( g, mArgc, mArgv );
  3045. Sim::postEvent((SimObject*)Sim::getRootGroup(), evt, Sim::getCurrentTime());
  3046. return R( EngineUnmarshallData< R >()( cb.waitForResult() ) );
  3047. }
  3048. }
  3049. template< typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H >
  3050. R call( A a, B b, C c, D d, E e, F f, G g, H h )
  3051. {
  3052. if (Con::isMainThread())
  3053. {
  3054. ConsoleStackFrameSaver sav; sav.save();
  3055. CSTK.reserveValues(mArgc+8, mArgv);
  3056. mArgv[ 0 ].value->setStackStringValue(mCallbackName);
  3057. EngineMarshallData( a, mArgc, mArgv );
  3058. EngineMarshallData( b, mArgc, mArgv );
  3059. EngineMarshallData( c, mArgc, mArgv );
  3060. EngineMarshallData( d, mArgc, mArgv );
  3061. EngineMarshallData( e, mArgc, mArgv );
  3062. EngineMarshallData( f, mArgc, mArgv );
  3063. EngineMarshallData( g, mArgc, mArgv );
  3064. EngineMarshallData( h, mArgc, mArgv );
  3065. return R( EngineUnmarshallData< R >()( _exec() ) );
  3066. }
  3067. else
  3068. {
  3069. SimConsoleThreadExecCallback cb;
  3070. SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc+8, NULL, false, &cb);
  3071. evt->populateArgs(mArgv);
  3072. mArgv[ 0 ].value->setStackStringValue(mCallbackName);
  3073. EngineMarshallData( a, mArgc, mArgv );
  3074. EngineMarshallData( b, mArgc, mArgv );
  3075. EngineMarshallData( c, mArgc, mArgv );
  3076. EngineMarshallData( d, mArgc, mArgv );
  3077. EngineMarshallData( e, mArgc, mArgv );
  3078. EngineMarshallData( f, mArgc, mArgv );
  3079. EngineMarshallData( g, mArgc, mArgv );
  3080. EngineMarshallData( h, mArgc, mArgv );
  3081. Sim::postEvent((SimObject*)Sim::getRootGroup(), evt, Sim::getCurrentTime());
  3082. return R( EngineUnmarshallData< R >()( cb.waitForResult() ) );
  3083. }
  3084. }
  3085. template< typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I >
  3086. R call( A a, B b, C c, D d, E e, F f, G g, H h, I i )
  3087. {
  3088. if (Con::isMainThread())
  3089. {
  3090. ConsoleStackFrameSaver sav; sav.save();
  3091. CSTK.reserveValues(mArgc+9, mArgv);
  3092. mArgv[ 0 ].value->setStackStringValue(mCallbackName);
  3093. EngineMarshallData( a, mArgc, mArgv );
  3094. EngineMarshallData( b, mArgc, mArgv );
  3095. EngineMarshallData( c, mArgc, mArgv );
  3096. EngineMarshallData( d, mArgc, mArgv );
  3097. EngineMarshallData( e, mArgc, mArgv );
  3098. EngineMarshallData( f, mArgc, mArgv );
  3099. EngineMarshallData( g, mArgc, mArgv );
  3100. EngineMarshallData( h, mArgc, mArgv );
  3101. EngineMarshallData( i, mArgc, mArgv );
  3102. return R( EngineUnmarshallData< R >()( _exec() ) );
  3103. }
  3104. else
  3105. {
  3106. SimConsoleThreadExecCallback cb;
  3107. SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc+9, NULL, false, &cb);
  3108. evt->populateArgs(mArgv);
  3109. mArgv[ 0 ].value->setStackStringValue(mCallbackName);
  3110. EngineMarshallData( a, mArgc, mArgv );
  3111. EngineMarshallData( b, mArgc, mArgv );
  3112. EngineMarshallData( c, mArgc, mArgv );
  3113. EngineMarshallData( d, mArgc, mArgv );
  3114. EngineMarshallData( e, mArgc, mArgv );
  3115. EngineMarshallData( f, mArgc, mArgv );
  3116. EngineMarshallData( g, mArgc, mArgv );
  3117. EngineMarshallData( h, mArgc, mArgv );
  3118. EngineMarshallData( i, mArgc, mArgv );
  3119. Sim::postEvent((SimObject*)Sim::getRootGroup(), evt, Sim::getCurrentTime());
  3120. return R( EngineUnmarshallData< R >()( cb.waitForResult() ) );
  3121. }
  3122. }
  3123. template< typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I, typename J >
  3124. R call( A a, B b, C c, D d, E e, F f, G g, H h, I i, J j )
  3125. {
  3126. if (Con::isMainThread())
  3127. {
  3128. ConsoleStackFrameSaver sav; sav.save();
  3129. CSTK.reserveValues(mArgc+10, mArgv);
  3130. mArgv[ 0 ].value->setStackStringValue(mCallbackName);
  3131. EngineMarshallData( a, mArgc, mArgv );
  3132. EngineMarshallData( b, mArgc, mArgv );
  3133. EngineMarshallData( c, mArgc, mArgv );
  3134. EngineMarshallData( d, mArgc, mArgv );
  3135. EngineMarshallData( e, mArgc, mArgv );
  3136. EngineMarshallData( f, mArgc, mArgv );
  3137. EngineMarshallData( g, mArgc, mArgv );
  3138. EngineMarshallData( h, mArgc, mArgv );
  3139. EngineMarshallData( i, mArgc, mArgv );
  3140. EngineMarshallData( j, mArgc, mArgv );
  3141. return R( EngineUnmarshallData< R >()( _exec() ) );
  3142. }
  3143. else
  3144. {
  3145. SimConsoleThreadExecCallback cb;
  3146. SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc+10, NULL, false, &cb);
  3147. evt->populateArgs(mArgv);
  3148. mArgv[ 0 ].value->setStackStringValue(mCallbackName);
  3149. EngineMarshallData( a, mArgc, mArgv );
  3150. EngineMarshallData( b, mArgc, mArgv );
  3151. EngineMarshallData( c, mArgc, mArgv );
  3152. EngineMarshallData( d, mArgc, mArgv );
  3153. EngineMarshallData( e, mArgc, mArgv );
  3154. EngineMarshallData( f, mArgc, mArgv );
  3155. EngineMarshallData( g, mArgc, mArgv );
  3156. EngineMarshallData( h, mArgc, mArgv );
  3157. EngineMarshallData( i, mArgc, mArgv );
  3158. EngineMarshallData( j, mArgc, mArgv );
  3159. Sim::postEvent((SimObject*)Sim::getRootGroup(), evt, Sim::getCurrentTime());
  3160. return R( EngineUnmarshallData< R >()( cb.waitForResult() ) );
  3161. }
  3162. }
  3163. 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 >
  3164. R call( A a, B b, C c, D d, E e, F f, G g, H h, I i, J j, K k )
  3165. {
  3166. if (Con::isMainThread())
  3167. {
  3168. ConsoleStackFrameSaver sav; sav.save();
  3169. CSTK.reserveValues(mArgc+11, mArgv);
  3170. mArgv[ 0 ].value->setStackStringValue(mCallbackName);
  3171. EngineMarshallData( a, mArgc, mArgv );
  3172. EngineMarshallData( b, mArgc, mArgv );
  3173. EngineMarshallData( c, mArgc, mArgv );
  3174. EngineMarshallData( d, mArgc, mArgv );
  3175. EngineMarshallData( e, mArgc, mArgv );
  3176. EngineMarshallData( f, mArgc, mArgv );
  3177. EngineMarshallData( g, mArgc, mArgv );
  3178. EngineMarshallData( h, mArgc, mArgv );
  3179. EngineMarshallData( i, mArgc, mArgv );
  3180. EngineMarshallData( j, mArgc, mArgv );
  3181. EngineMarshallData( k, mArgc, mArgv );
  3182. return R( EngineUnmarshallData< R >()( _exec() ) );
  3183. }
  3184. else
  3185. {
  3186. SimConsoleThreadExecCallback cb;
  3187. SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc+11, NULL, false, &cb);
  3188. evt->populateArgs(mArgv);
  3189. mArgv[ 0 ].value->setStackStringValue(mCallbackName);
  3190. EngineMarshallData( a, mArgc, mArgv );
  3191. EngineMarshallData( b, mArgc, mArgv );
  3192. EngineMarshallData( c, mArgc, mArgv );
  3193. EngineMarshallData( d, mArgc, mArgv );
  3194. EngineMarshallData( e, mArgc, mArgv );
  3195. EngineMarshallData( f, mArgc, mArgv );
  3196. EngineMarshallData( g, mArgc, mArgv );
  3197. EngineMarshallData( h, mArgc, mArgv );
  3198. EngineMarshallData( i, mArgc, mArgv );
  3199. EngineMarshallData( j, mArgc, mArgv );
  3200. EngineMarshallData( k, mArgc, mArgv );
  3201. Sim::postEvent((SimObject*)Sim::getRootGroup(), evt, Sim::getCurrentTime());
  3202. return R( EngineUnmarshallData< R >()( cb.waitForResult() ) );
  3203. }
  3204. }
  3205. 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 >
  3206. 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 )
  3207. {
  3208. if (Con::isMainThread())
  3209. {
  3210. ConsoleStackFrameSaver sav; sav.save();
  3211. CSTK.reserveValues(mArgc+12, mArgv);
  3212. mArgv[ 0 ].value->setStackStringValue(mCallbackName);
  3213. EngineMarshallData( a, mArgc, mArgv );
  3214. EngineMarshallData( b, mArgc, mArgv );
  3215. EngineMarshallData( c, mArgc, mArgv );
  3216. EngineMarshallData( d, mArgc, mArgv );
  3217. EngineMarshallData( e, mArgc, mArgv );
  3218. EngineMarshallData( f, mArgc, mArgv );
  3219. EngineMarshallData( g, mArgc, mArgv );
  3220. EngineMarshallData( h, mArgc, mArgv );
  3221. EngineMarshallData( i, mArgc, mArgv );
  3222. EngineMarshallData( j, mArgc, mArgv );
  3223. EngineMarshallData( k, mArgc, mArgv );
  3224. EngineMarshallData( l, mArgc, mArgv );
  3225. return R( EngineUnmarshallData< R >()( _exec() ) );
  3226. }
  3227. else
  3228. {
  3229. SimConsoleThreadExecCallback cb;
  3230. SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc+12, NULL, false, &cb);
  3231. evt->populateArgs(mArgv);
  3232. mArgv[ 0 ].value->setStackStringValue(mCallbackName);
  3233. EngineMarshallData( a, mArgc, mArgv );
  3234. EngineMarshallData( b, mArgc, mArgv );
  3235. EngineMarshallData( c, mArgc, mArgv );
  3236. EngineMarshallData( d, mArgc, mArgv );
  3237. EngineMarshallData( e, mArgc, mArgv );
  3238. EngineMarshallData( f, mArgc, mArgv );
  3239. EngineMarshallData( g, mArgc, mArgv );
  3240. EngineMarshallData( h, mArgc, mArgv );
  3241. EngineMarshallData( i, mArgc, mArgv );
  3242. EngineMarshallData( j, mArgc, mArgv );
  3243. EngineMarshallData( k, mArgc, mArgv );
  3244. EngineMarshallData( l, mArgc, mArgv );
  3245. Sim::postEvent((SimObject*)Sim::getRootGroup(), evt, Sim::getCurrentTime());
  3246. return R( EngineUnmarshallData< R >()( cb.waitForResult() ) );
  3247. }
  3248. }
  3249. };
  3250. // Override for when first parameter is presumably a SimObject*, in which case A will be absorbed as the callback
  3251. template<typename P1> struct _EngineConsoleExecCallbackHelper : public _BaseEngineConsoleCallbackHelper
  3252. {
  3253. public:
  3254. _EngineConsoleExecCallbackHelper( SimObject* pThis )
  3255. {
  3256. mThis = pThis;
  3257. mArgc = mInitialArgc = 2;
  3258. mCallbackName = NULL;
  3259. }
  3260. template< typename R, typename A >
  3261. R call( A a )
  3262. {
  3263. if (Con::isMainThread())
  3264. {
  3265. ConsoleStackFrameSaver sav; sav.save();
  3266. CSTK.reserveValues(mArgc+0, mArgv);
  3267. mArgv[ 0 ].value->setStackStringValue(a);
  3268. return R( EngineUnmarshallData< R >()( _exec() ) );
  3269. }
  3270. else
  3271. {
  3272. SimConsoleThreadExecCallback cb;
  3273. SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc+0, NULL, true, &cb);
  3274. evt->populateArgs(mArgv);
  3275. mArgv[ 0 ].value->setStackStringValue(a);
  3276. Sim::postEvent(mThis, evt, Sim::getCurrentTime());
  3277. return R( EngineUnmarshallData< R >()( cb.waitForResult() ) );
  3278. }
  3279. }
  3280. template< typename R, typename A, typename B >
  3281. R call( A a, B b )
  3282. {
  3283. if (Con::isMainThread())
  3284. {
  3285. ConsoleStackFrameSaver sav; sav.save();
  3286. CSTK.reserveValues(mArgc+1, mArgv);
  3287. mArgv[ 0 ].value->setStackStringValue(a);
  3288. EngineMarshallData( b, mArgc, mArgv );
  3289. return R( EngineUnmarshallData< R >()( _exec() ) );
  3290. }
  3291. else
  3292. {
  3293. SimConsoleThreadExecCallback cb;
  3294. SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc+1, NULL, true, &cb);
  3295. evt->populateArgs(mArgv);
  3296. mArgv[ 0 ].value->setStackStringValue(a);
  3297. EngineMarshallData( b, mArgc, mArgv );
  3298. Sim::postEvent(mThis, evt, Sim::getCurrentTime());
  3299. return R( EngineUnmarshallData< R >()( cb.waitForResult() ) );
  3300. }
  3301. }
  3302. template< typename R, typename A, typename B, typename C >
  3303. R call( A a, B b, C c )
  3304. {
  3305. if (Con::isMainThread())
  3306. {
  3307. ConsoleStackFrameSaver sav; sav.save();
  3308. CSTK.reserveValues(mArgc+2, mArgv);
  3309. mArgv[ 0 ].value->setStackStringValue(a);
  3310. EngineMarshallData( b, mArgc, mArgv );
  3311. EngineMarshallData( c, mArgc, mArgv );
  3312. return R( EngineUnmarshallData< R >()( _exec() ) );
  3313. }
  3314. else
  3315. {
  3316. SimConsoleThreadExecCallback cb;
  3317. SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc+2, NULL, true, &cb);
  3318. evt->populateArgs(mArgv);
  3319. mArgv[ 0 ].value->setStackStringValue(a);
  3320. EngineMarshallData( b, mArgc, mArgv );
  3321. EngineMarshallData( c, mArgc, mArgv );
  3322. Sim::postEvent(mThis, evt, Sim::getCurrentTime());
  3323. return R( EngineUnmarshallData< R >()( cb.waitForResult() ) );
  3324. }
  3325. }
  3326. template< typename R, typename A, typename B, typename C, typename D >
  3327. R call( A a, B b, C c, D d )
  3328. {
  3329. if (Con::isMainThread())
  3330. {
  3331. ConsoleStackFrameSaver sav; sav.save();
  3332. CSTK.reserveValues(mArgc+3, mArgv);
  3333. mArgv[ 0 ].value->setStackStringValue(a);
  3334. EngineMarshallData( b, mArgc, mArgv );
  3335. EngineMarshallData( c, mArgc, mArgv );
  3336. EngineMarshallData( d, mArgc, mArgv );
  3337. return R( EngineUnmarshallData< R >()( _exec() ) );
  3338. }
  3339. else
  3340. {
  3341. SimConsoleThreadExecCallback cb;
  3342. SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc+3, NULL, true, &cb);
  3343. evt->populateArgs(mArgv);
  3344. mArgv[ 0 ].value->setStackStringValue(a);
  3345. EngineMarshallData( b, mArgc, mArgv );
  3346. EngineMarshallData( c, mArgc, mArgv );
  3347. EngineMarshallData( d, mArgc, mArgv );
  3348. Sim::postEvent(mThis, evt, Sim::getCurrentTime());
  3349. return R( EngineUnmarshallData< R >()( cb.waitForResult() ) );
  3350. }
  3351. }
  3352. template< typename R, typename A, typename B, typename C, typename D, typename E >
  3353. R call( A a, B b, C c, D d, E e )
  3354. {
  3355. if (Con::isMainThread())
  3356. {
  3357. ConsoleStackFrameSaver sav; sav.save();
  3358. CSTK.reserveValues(mArgc+4, mArgv);
  3359. mArgv[ 0 ].value->setStackStringValue(a);
  3360. EngineMarshallData( b, mArgc, mArgv );
  3361. EngineMarshallData( c, mArgc, mArgv );
  3362. EngineMarshallData( d, mArgc, mArgv );
  3363. EngineMarshallData( e, mArgc, mArgv );
  3364. return R( EngineUnmarshallData< R >()( _exec() ) );
  3365. }
  3366. else
  3367. {
  3368. SimConsoleThreadExecCallback cb;
  3369. SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc+4, NULL, true, &cb);
  3370. evt->populateArgs(mArgv);
  3371. mArgv[ 0 ].value->setStackStringValue(a);
  3372. EngineMarshallData( b, mArgc, mArgv );
  3373. EngineMarshallData( c, mArgc, mArgv );
  3374. EngineMarshallData( d, mArgc, mArgv );
  3375. EngineMarshallData( e, mArgc, mArgv );
  3376. Sim::postEvent(mThis, evt, Sim::getCurrentTime());
  3377. return R( EngineUnmarshallData< R >()( cb.waitForResult() ) );
  3378. }
  3379. }
  3380. template< typename R, typename A, typename B, typename C, typename D, typename E, typename F >
  3381. R call( A a, B b, C c, D d, E e, F f )
  3382. {
  3383. if (Con::isMainThread())
  3384. {
  3385. ConsoleStackFrameSaver sav; sav.save();
  3386. CSTK.reserveValues(mArgc+5, mArgv);
  3387. mArgv[ 0 ].value->setStackStringValue(a);
  3388. EngineMarshallData( b, mArgc, mArgv );
  3389. EngineMarshallData( c, mArgc, mArgv );
  3390. EngineMarshallData( d, mArgc, mArgv );
  3391. EngineMarshallData( e, mArgc, mArgv );
  3392. EngineMarshallData( f, mArgc, mArgv );
  3393. return R( EngineUnmarshallData< R >()( _exec() ) );
  3394. }
  3395. else
  3396. {
  3397. SimConsoleThreadExecCallback cb;
  3398. SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc+5, NULL, true, &cb);
  3399. evt->populateArgs(mArgv);
  3400. mArgv[ 0 ].value->setStackStringValue(a);
  3401. EngineMarshallData( b, mArgc, mArgv );
  3402. EngineMarshallData( c, mArgc, mArgv );
  3403. EngineMarshallData( d, mArgc, mArgv );
  3404. EngineMarshallData( e, mArgc, mArgv );
  3405. EngineMarshallData( f, mArgc, mArgv );
  3406. Sim::postEvent(mThis, evt, Sim::getCurrentTime());
  3407. return R( EngineUnmarshallData< R >()( cb.waitForResult() ) );
  3408. }
  3409. }
  3410. template< typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G >
  3411. R call( A a, B b, C c, D d, E e, F f, G g )
  3412. {
  3413. if (Con::isMainThread())
  3414. {
  3415. ConsoleStackFrameSaver sav; sav.save();
  3416. CSTK.reserveValues(mArgc+6, mArgv);
  3417. mArgv[ 0 ].value->setStackStringValue(a);
  3418. EngineMarshallData( b, mArgc, mArgv );
  3419. EngineMarshallData( c, mArgc, mArgv );
  3420. EngineMarshallData( d, mArgc, mArgv );
  3421. EngineMarshallData( e, mArgc, mArgv );
  3422. EngineMarshallData( f, mArgc, mArgv );
  3423. EngineMarshallData( g, mArgc, mArgv );
  3424. return R( EngineUnmarshallData< R >()( _exec() ) );
  3425. }
  3426. else
  3427. {
  3428. SimConsoleThreadExecCallback cb;
  3429. SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc+6, NULL, true, &cb);
  3430. evt->populateArgs(mArgv);
  3431. mArgv[ 0 ].value->setStackStringValue(a);
  3432. EngineMarshallData( b, mArgc, mArgv );
  3433. EngineMarshallData( c, mArgc, mArgv );
  3434. EngineMarshallData( d, mArgc, mArgv );
  3435. EngineMarshallData( e, mArgc, mArgv );
  3436. EngineMarshallData( f, mArgc, mArgv );
  3437. EngineMarshallData( g, mArgc, mArgv );
  3438. Sim::postEvent(mThis, evt, Sim::getCurrentTime());
  3439. return R( EngineUnmarshallData< R >()( cb.waitForResult() ) );
  3440. }
  3441. }
  3442. template< typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H >
  3443. R call( A a, B b, C c, D d, E e, F f, G g, H h )
  3444. {
  3445. if (Con::isMainThread())
  3446. {
  3447. ConsoleStackFrameSaver sav; sav.save();
  3448. CSTK.reserveValues(mArgc+7, mArgv);
  3449. mArgv[ 0 ].value->setStackStringValue(a);
  3450. EngineMarshallData( b, mArgc, mArgv );
  3451. EngineMarshallData( c, mArgc, mArgv );
  3452. EngineMarshallData( d, mArgc, mArgv );
  3453. EngineMarshallData( e, mArgc, mArgv );
  3454. EngineMarshallData( f, mArgc, mArgv );
  3455. EngineMarshallData( g, mArgc, mArgv );
  3456. EngineMarshallData( h, mArgc, mArgv );
  3457. return R( EngineUnmarshallData< R >()( _exec() ) );
  3458. }
  3459. else
  3460. {
  3461. SimConsoleThreadExecCallback cb;
  3462. SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc+7, NULL, true, &cb);
  3463. evt->populateArgs(mArgv);
  3464. mArgv[ 0 ].value->setStackStringValue(a);
  3465. EngineMarshallData( b, mArgc, mArgv );
  3466. EngineMarshallData( c, mArgc, mArgv );
  3467. EngineMarshallData( d, mArgc, mArgv );
  3468. EngineMarshallData( e, mArgc, mArgv );
  3469. EngineMarshallData( f, mArgc, mArgv );
  3470. EngineMarshallData( g, mArgc, mArgv );
  3471. EngineMarshallData( h, mArgc, mArgv );
  3472. Sim::postEvent(mThis, evt, Sim::getCurrentTime());
  3473. return R( EngineUnmarshallData< R >()( cb.waitForResult() ) );
  3474. }
  3475. }
  3476. template< typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I >
  3477. R call( A a, B b, C c, D d, E e, F f, G g, H h, I i )
  3478. {
  3479. if (Con::isMainThread())
  3480. {
  3481. ConsoleStackFrameSaver sav; sav.save();
  3482. CSTK.reserveValues(mArgc+8, mArgv);
  3483. mArgv[ 0 ].value->setStackStringValue(a);
  3484. EngineMarshallData( b, mArgc, mArgv );
  3485. EngineMarshallData( c, mArgc, mArgv );
  3486. EngineMarshallData( d, mArgc, mArgv );
  3487. EngineMarshallData( e, mArgc, mArgv );
  3488. EngineMarshallData( f, mArgc, mArgv );
  3489. EngineMarshallData( g, mArgc, mArgv );
  3490. EngineMarshallData( h, mArgc, mArgv );
  3491. EngineMarshallData( i, mArgc, mArgv );
  3492. return R( EngineUnmarshallData< R >()( _exec() ) );
  3493. }
  3494. else
  3495. {
  3496. SimConsoleThreadExecCallback cb;
  3497. SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc+8, NULL, true, &cb);
  3498. evt->populateArgs(mArgv);
  3499. mArgv[ 0 ].value->setStackStringValue(a);
  3500. EngineMarshallData( b, mArgc, mArgv );
  3501. EngineMarshallData( c, mArgc, mArgv );
  3502. EngineMarshallData( d, mArgc, mArgv );
  3503. EngineMarshallData( e, mArgc, mArgv );
  3504. EngineMarshallData( f, mArgc, mArgv );
  3505. EngineMarshallData( g, mArgc, mArgv );
  3506. EngineMarshallData( h, mArgc, mArgv );
  3507. EngineMarshallData( i, mArgc, mArgv );
  3508. Sim::postEvent(mThis, evt, Sim::getCurrentTime());
  3509. return R( EngineUnmarshallData< R >()( cb.waitForResult() ) );
  3510. }
  3511. }
  3512. template< typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I, typename J >
  3513. R call( A a, B b, C c, D d, E e, F f, G g, H h, I i, J j )
  3514. {
  3515. if (Con::isMainThread())
  3516. {
  3517. ConsoleStackFrameSaver sav; sav.save();
  3518. CSTK.reserveValues(mArgc+9, mArgv);
  3519. mArgv[ 0 ].value->setStackStringValue(a);
  3520. EngineMarshallData( b, mArgc, mArgv );
  3521. EngineMarshallData( c, mArgc, mArgv );
  3522. EngineMarshallData( d, mArgc, mArgv );
  3523. EngineMarshallData( e, mArgc, mArgv );
  3524. EngineMarshallData( f, mArgc, mArgv );
  3525. EngineMarshallData( g, mArgc, mArgv );
  3526. EngineMarshallData( h, mArgc, mArgv );
  3527. EngineMarshallData( i, mArgc, mArgv );
  3528. EngineMarshallData( j, mArgc, mArgv );
  3529. return R( EngineUnmarshallData< R >()( _exec() ) );
  3530. }
  3531. else
  3532. {
  3533. SimConsoleThreadExecCallback cb;
  3534. SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc+9, NULL, true, &cb);
  3535. evt->populateArgs(mArgv);
  3536. mArgv[ 0 ].value->setStackStringValue(a);
  3537. EngineMarshallData( b, mArgc, mArgv );
  3538. EngineMarshallData( c, mArgc, mArgv );
  3539. EngineMarshallData( d, mArgc, mArgv );
  3540. EngineMarshallData( e, mArgc, mArgv );
  3541. EngineMarshallData( f, mArgc, mArgv );
  3542. EngineMarshallData( g, mArgc, mArgv );
  3543. EngineMarshallData( h, mArgc, mArgv );
  3544. EngineMarshallData( i, mArgc, mArgv );
  3545. EngineMarshallData( j, mArgc, mArgv );
  3546. Sim::postEvent(mThis, evt, Sim::getCurrentTime());
  3547. return R( EngineUnmarshallData< R >()( cb.waitForResult() ) );
  3548. }
  3549. }
  3550. 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 >
  3551. R call( A a, B b, C c, D d, E e, F f, G g, H h, I i, J j, K k )
  3552. {
  3553. if (Con::isMainThread())
  3554. {
  3555. ConsoleStackFrameSaver sav; sav.save();
  3556. CSTK.reserveValues(mArgc+10, mArgv);
  3557. mArgv[ 0 ].value->setStackStringValue(a);
  3558. EngineMarshallData( b, mArgc, mArgv );
  3559. EngineMarshallData( c, mArgc, mArgv );
  3560. EngineMarshallData( d, mArgc, mArgv );
  3561. EngineMarshallData( e, mArgc, mArgv );
  3562. EngineMarshallData( f, mArgc, mArgv );
  3563. EngineMarshallData( g, mArgc, mArgv );
  3564. EngineMarshallData( h, mArgc, mArgv );
  3565. EngineMarshallData( i, mArgc, mArgv );
  3566. EngineMarshallData( j, mArgc, mArgv );
  3567. EngineMarshallData( k, mArgc, mArgv );
  3568. return R( EngineUnmarshallData< R >()( _exec() ) );
  3569. }
  3570. else
  3571. {
  3572. SimConsoleThreadExecCallback cb;
  3573. SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc+10, NULL, true, &cb);
  3574. evt->populateArgs(mArgv);
  3575. mArgv[ 0 ].value->setStackStringValue(a);
  3576. EngineMarshallData( b, mArgc, mArgv );
  3577. EngineMarshallData( c, mArgc, mArgv );
  3578. EngineMarshallData( d, mArgc, mArgv );
  3579. EngineMarshallData( e, mArgc, mArgv );
  3580. EngineMarshallData( f, mArgc, mArgv );
  3581. EngineMarshallData( g, mArgc, mArgv );
  3582. EngineMarshallData( h, mArgc, mArgv );
  3583. EngineMarshallData( i, mArgc, mArgv );
  3584. EngineMarshallData( j, mArgc, mArgv );
  3585. EngineMarshallData( k, mArgc, mArgv );
  3586. Sim::postEvent(mThis, evt, Sim::getCurrentTime());
  3587. return R( EngineUnmarshallData< R >()( cb.waitForResult() ) );
  3588. }
  3589. }
  3590. 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 >
  3591. 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 )
  3592. {
  3593. if (Con::isMainThread())
  3594. {
  3595. ConsoleStackFrameSaver sav; sav.save();
  3596. CSTK.reserveValues(mArgc+11, mArgv);
  3597. mArgv[ 0 ].value->setStackStringValue(a);
  3598. EngineMarshallData( b, mArgc, mArgv );
  3599. EngineMarshallData( c, mArgc, mArgv );
  3600. EngineMarshallData( d, mArgc, mArgv );
  3601. EngineMarshallData( e, mArgc, mArgv );
  3602. EngineMarshallData( f, mArgc, mArgv );
  3603. EngineMarshallData( g, mArgc, mArgv );
  3604. EngineMarshallData( h, mArgc, mArgv );
  3605. EngineMarshallData( i, mArgc, mArgv );
  3606. EngineMarshallData( j, mArgc, mArgv );
  3607. EngineMarshallData( k, mArgc, mArgv );
  3608. EngineMarshallData( l, mArgc, mArgv );
  3609. return R( EngineUnmarshallData< R >()( _exec() ) );
  3610. }
  3611. else
  3612. {
  3613. SimConsoleThreadExecCallback cb;
  3614. SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc+11, NULL, true, &cb);
  3615. evt->populateArgs(mArgv);
  3616. mArgv[ 0 ].value->setStackStringValue(a);
  3617. EngineMarshallData( b, mArgc, mArgv );
  3618. EngineMarshallData( c, mArgc, mArgv );
  3619. EngineMarshallData( d, mArgc, mArgv );
  3620. EngineMarshallData( e, mArgc, mArgv );
  3621. EngineMarshallData( f, mArgc, mArgv );
  3622. EngineMarshallData( g, mArgc, mArgv );
  3623. EngineMarshallData( h, mArgc, mArgv );
  3624. EngineMarshallData( i, mArgc, mArgv );
  3625. EngineMarshallData( j, mArgc, mArgv );
  3626. EngineMarshallData( k, mArgc, mArgv );
  3627. EngineMarshallData( l, mArgc, mArgv );
  3628. Sim::postEvent(mThis, evt, Sim::getCurrentTime());
  3629. return R( EngineUnmarshallData< R >()( cb.waitForResult() ) );
  3630. }
  3631. }
  3632. };
  3633. // Override for when first parameter is const char*
  3634. template<> struct _EngineConsoleExecCallbackHelper<const char*> : public _BaseEngineConsoleCallbackHelper
  3635. {
  3636. _EngineConsoleExecCallbackHelper( const char *callbackName )
  3637. {
  3638. mThis = NULL;
  3639. mArgc = mInitialArgc = 1;
  3640. mCallbackName = StringTable->insert(callbackName);
  3641. }
  3642. template< typename R >
  3643. R call()
  3644. {
  3645. if (Con::isMainThread())
  3646. {
  3647. ConsoleStackFrameSaver sav; sav.save();
  3648. CSTK.reserveValues(mArgc, mArgv);
  3649. mArgv[ 0 ].value->setStackStringValue(mCallbackName);
  3650. return R( EngineUnmarshallData< R >()( _exec() ) );
  3651. }
  3652. else
  3653. {
  3654. SimConsoleThreadExecCallback cb;
  3655. SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc, NULL, false, &cb);
  3656. evt->populateArgs(mArgv);
  3657. mArgv[ 0 ].value->setStackStringValue(mCallbackName);
  3658. Sim::postEvent((SimObject*)Sim::getRootGroup(), evt, Sim::getCurrentTime());
  3659. return R( EngineUnmarshallData< R >()( cb.waitForResult() ) );
  3660. }
  3661. }
  3662. template< typename R, typename A >
  3663. R call( A a )
  3664. {
  3665. if (Con::isMainThread())
  3666. {
  3667. ConsoleStackFrameSaver sav; sav.save();
  3668. CSTK.reserveValues(mArgc+1, mArgv);
  3669. mArgv[ 0 ].value->setStackStringValue(mCallbackName);
  3670. EngineMarshallData( a, mArgc, mArgv );
  3671. return R( EngineUnmarshallData< R >()( _exec() ) );
  3672. }
  3673. else
  3674. {
  3675. SimConsoleThreadExecCallback cb;
  3676. SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc+1, NULL, false, &cb);
  3677. evt->populateArgs(mArgv);
  3678. mArgv[ 0 ].value->setStackStringValue(mCallbackName);
  3679. EngineMarshallData( a, mArgc, mArgv );
  3680. Sim::postEvent((SimObject*)Sim::getRootGroup(), evt, Sim::getCurrentTime());
  3681. return R( EngineUnmarshallData< R >()( cb.waitForResult() ) );
  3682. }
  3683. }
  3684. template< typename R, typename A, typename B >
  3685. R call( A a, B b )
  3686. {
  3687. if (Con::isMainThread())
  3688. {
  3689. ConsoleStackFrameSaver sav; sav.save();
  3690. CSTK.reserveValues(mArgc+2, mArgv);
  3691. mArgv[ 0 ].value->setStackStringValue(mCallbackName);
  3692. EngineMarshallData( a, mArgc, mArgv );
  3693. EngineMarshallData( b, mArgc, mArgv );
  3694. return R( EngineUnmarshallData< R >()( _exec() ) );
  3695. }
  3696. else
  3697. {
  3698. SimConsoleThreadExecCallback cb;
  3699. SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc+2, NULL, false, &cb);
  3700. evt->populateArgs(mArgv);
  3701. mArgv[ 0 ].value->setStackStringValue(mCallbackName);
  3702. EngineMarshallData( a, mArgc, mArgv );
  3703. EngineMarshallData( b, mArgc, mArgv );
  3704. Sim::postEvent((SimObject*)Sim::getRootGroup(), evt, Sim::getCurrentTime());
  3705. return R( EngineUnmarshallData< R >()( cb.waitForResult() ) );
  3706. }
  3707. }
  3708. template< typename R, typename A, typename B, typename C >
  3709. R call( A a, B b, C c )
  3710. {
  3711. if (Con::isMainThread())
  3712. {
  3713. ConsoleStackFrameSaver sav; sav.save();
  3714. CSTK.reserveValues(mArgc+3, mArgv);
  3715. mArgv[ 0 ].value->setStackStringValue(mCallbackName);
  3716. EngineMarshallData( a, mArgc, mArgv );
  3717. EngineMarshallData( b, mArgc, mArgv );
  3718. EngineMarshallData( c, mArgc, mArgv );
  3719. return R( EngineUnmarshallData< R >()( _exec() ) );
  3720. }
  3721. else
  3722. {
  3723. SimConsoleThreadExecCallback cb;
  3724. SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc+3, NULL, false, &cb);
  3725. evt->populateArgs(mArgv);
  3726. mArgv[ 0 ].value->setStackStringValue(mCallbackName);
  3727. EngineMarshallData( a, mArgc, mArgv );
  3728. EngineMarshallData( b, mArgc, mArgv );
  3729. EngineMarshallData( c, mArgc, mArgv );
  3730. Sim::postEvent((SimObject*)Sim::getRootGroup(), evt, Sim::getCurrentTime());
  3731. return R( EngineUnmarshallData< R >()( cb.waitForResult() ) );
  3732. }
  3733. }
  3734. template< typename R, typename A, typename B, typename C, typename D >
  3735. R call( A a, B b, C c, D d )
  3736. {
  3737. if (Con::isMainThread())
  3738. {
  3739. ConsoleStackFrameSaver sav; sav.save();
  3740. CSTK.reserveValues(mArgc+4, mArgv);
  3741. mArgv[ 0 ].value->setStackStringValue(mCallbackName);
  3742. EngineMarshallData( a, mArgc, mArgv );
  3743. EngineMarshallData( b, mArgc, mArgv );
  3744. EngineMarshallData( c, mArgc, mArgv );
  3745. EngineMarshallData( d, mArgc, mArgv );
  3746. return R( EngineUnmarshallData< R >()( _exec() ) );
  3747. }
  3748. else
  3749. {
  3750. SimConsoleThreadExecCallback cb;
  3751. SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc+4, NULL, false, &cb);
  3752. evt->populateArgs(mArgv);
  3753. mArgv[ 0 ].value->setStackStringValue(mCallbackName);
  3754. EngineMarshallData( a, mArgc, mArgv );
  3755. EngineMarshallData( b, mArgc, mArgv );
  3756. EngineMarshallData( c, mArgc, mArgv );
  3757. EngineMarshallData( d, mArgc, mArgv );
  3758. Sim::postEvent((SimObject*)Sim::getRootGroup(), evt, Sim::getCurrentTime());
  3759. return R( EngineUnmarshallData< R >()( cb.waitForResult() ) );
  3760. }
  3761. }
  3762. template< typename R, typename A, typename B, typename C, typename D, typename E >
  3763. R call( A a, B b, C c, D d, E e )
  3764. {
  3765. if (Con::isMainThread())
  3766. {
  3767. ConsoleStackFrameSaver sav; sav.save();
  3768. CSTK.reserveValues(mArgc+5, mArgv);
  3769. mArgv[ 0 ].value->setStackStringValue(mCallbackName);
  3770. EngineMarshallData( a, mArgc, mArgv );
  3771. EngineMarshallData( b, mArgc, mArgv );
  3772. EngineMarshallData( c, mArgc, mArgv );
  3773. EngineMarshallData( d, mArgc, mArgv );
  3774. EngineMarshallData( e, mArgc, mArgv );
  3775. return R( EngineUnmarshallData< R >()( _exec() ) );
  3776. }
  3777. else
  3778. {
  3779. SimConsoleThreadExecCallback cb;
  3780. SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc+5, NULL, false, &cb);
  3781. evt->populateArgs(mArgv);
  3782. mArgv[ 0 ].value->setStackStringValue(mCallbackName);
  3783. EngineMarshallData( a, mArgc, mArgv );
  3784. EngineMarshallData( b, mArgc, mArgv );
  3785. EngineMarshallData( c, mArgc, mArgv );
  3786. EngineMarshallData( d, mArgc, mArgv );
  3787. EngineMarshallData( e, mArgc, mArgv );
  3788. Sim::postEvent((SimObject*)Sim::getRootGroup(), evt, Sim::getCurrentTime());
  3789. return R( EngineUnmarshallData< R >()( cb.waitForResult() ) );
  3790. }
  3791. }
  3792. template< typename R, typename A, typename B, typename C, typename D, typename E, typename F >
  3793. R call( A a, B b, C c, D d, E e, F f )
  3794. {
  3795. if (Con::isMainThread())
  3796. {
  3797. ConsoleStackFrameSaver sav; sav.save();
  3798. CSTK.reserveValues(mArgc+6, mArgv);
  3799. mArgv[ 0 ].value->setStackStringValue(mCallbackName);
  3800. EngineMarshallData( a, mArgc, mArgv );
  3801. EngineMarshallData( b, mArgc, mArgv );
  3802. EngineMarshallData( c, mArgc, mArgv );
  3803. EngineMarshallData( d, mArgc, mArgv );
  3804. EngineMarshallData( e, mArgc, mArgv );
  3805. EngineMarshallData( f, mArgc, mArgv );
  3806. return R( EngineUnmarshallData< R >()( _exec() ) );
  3807. }
  3808. else
  3809. {
  3810. SimConsoleThreadExecCallback cb;
  3811. SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc+6, NULL, false, &cb);
  3812. evt->populateArgs(mArgv);
  3813. mArgv[ 0 ].value->setStackStringValue(mCallbackName);
  3814. EngineMarshallData( a, mArgc, mArgv );
  3815. EngineMarshallData( b, mArgc, mArgv );
  3816. EngineMarshallData( c, mArgc, mArgv );
  3817. EngineMarshallData( d, mArgc, mArgv );
  3818. EngineMarshallData( e, mArgc, mArgv );
  3819. EngineMarshallData( f, mArgc, mArgv );
  3820. Sim::postEvent((SimObject*)Sim::getRootGroup(), evt, Sim::getCurrentTime());
  3821. return R( EngineUnmarshallData< R >()( cb.waitForResult() ) );
  3822. }
  3823. }
  3824. template< typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G >
  3825. R call( A a, B b, C c, D d, E e, F f, G g )
  3826. {
  3827. if (Con::isMainThread())
  3828. {
  3829. ConsoleStackFrameSaver sav; sav.save();
  3830. CSTK.reserveValues(mArgc+7, mArgv);
  3831. mArgv[ 0 ].value->setStackStringValue(mCallbackName);
  3832. EngineMarshallData( a, mArgc, mArgv );
  3833. EngineMarshallData( b, mArgc, mArgv );
  3834. EngineMarshallData( c, mArgc, mArgv );
  3835. EngineMarshallData( d, mArgc, mArgv );
  3836. EngineMarshallData( e, mArgc, mArgv );
  3837. EngineMarshallData( f, mArgc, mArgv );
  3838. EngineMarshallData( g, mArgc, mArgv );
  3839. return R( EngineUnmarshallData< R >()( _exec() ) );
  3840. }
  3841. else
  3842. {
  3843. SimConsoleThreadExecCallback cb;
  3844. SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc+7, NULL, false, &cb);
  3845. evt->populateArgs(mArgv);
  3846. mArgv[ 0 ].value->setStackStringValue(mCallbackName);
  3847. EngineMarshallData( a, mArgc, mArgv );
  3848. EngineMarshallData( b, mArgc, mArgv );
  3849. EngineMarshallData( c, mArgc, mArgv );
  3850. EngineMarshallData( d, mArgc, mArgv );
  3851. EngineMarshallData( e, mArgc, mArgv );
  3852. EngineMarshallData( f, mArgc, mArgv );
  3853. EngineMarshallData( g, mArgc, mArgv );
  3854. Sim::postEvent((SimObject*)Sim::getRootGroup(), evt, Sim::getCurrentTime());
  3855. return R( EngineUnmarshallData< R >()( cb.waitForResult() ) );
  3856. }
  3857. }
  3858. template< typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H >
  3859. R call( A a, B b, C c, D d, E e, F f, G g, H h )
  3860. {
  3861. if (Con::isMainThread())
  3862. {
  3863. ConsoleStackFrameSaver sav; sav.save();
  3864. CSTK.reserveValues(mArgc+8, mArgv);
  3865. mArgv[ 0 ].value->setStackStringValue(mCallbackName);
  3866. EngineMarshallData( a, mArgc, mArgv );
  3867. EngineMarshallData( b, mArgc, mArgv );
  3868. EngineMarshallData( c, mArgc, mArgv );
  3869. EngineMarshallData( d, mArgc, mArgv );
  3870. EngineMarshallData( e, mArgc, mArgv );
  3871. EngineMarshallData( f, mArgc, mArgv );
  3872. EngineMarshallData( g, mArgc, mArgv );
  3873. EngineMarshallData( h, mArgc, mArgv );
  3874. return R( EngineUnmarshallData< R >()( _exec() ) );
  3875. }
  3876. else
  3877. {
  3878. SimConsoleThreadExecCallback cb;
  3879. SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc+8, NULL, false, &cb);
  3880. evt->populateArgs(mArgv);
  3881. mArgv[ 0 ].value->setStackStringValue(mCallbackName);
  3882. EngineMarshallData( a, mArgc, mArgv );
  3883. EngineMarshallData( b, mArgc, mArgv );
  3884. EngineMarshallData( c, mArgc, mArgv );
  3885. EngineMarshallData( d, mArgc, mArgv );
  3886. EngineMarshallData( e, mArgc, mArgv );
  3887. EngineMarshallData( f, mArgc, mArgv );
  3888. EngineMarshallData( g, mArgc, mArgv );
  3889. EngineMarshallData( h, mArgc, mArgv );
  3890. Sim::postEvent((SimObject*)Sim::getRootGroup(), evt, Sim::getCurrentTime());
  3891. return R( EngineUnmarshallData< R >()( cb.waitForResult() ) );
  3892. }
  3893. }
  3894. template< typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I >
  3895. R call( A a, B b, C c, D d, E e, F f, G g, H h, I i )
  3896. {
  3897. if (Con::isMainThread())
  3898. {
  3899. ConsoleStackFrameSaver sav; sav.save();
  3900. CSTK.reserveValues(mArgc+9, mArgv);
  3901. mArgv[ 0 ].value->setStackStringValue(mCallbackName);
  3902. EngineMarshallData( a, mArgc, mArgv );
  3903. EngineMarshallData( b, mArgc, mArgv );
  3904. EngineMarshallData( c, mArgc, mArgv );
  3905. EngineMarshallData( d, mArgc, mArgv );
  3906. EngineMarshallData( e, mArgc, mArgv );
  3907. EngineMarshallData( f, mArgc, mArgv );
  3908. EngineMarshallData( g, mArgc, mArgv );
  3909. EngineMarshallData( h, mArgc, mArgv );
  3910. EngineMarshallData( i, mArgc, mArgv );
  3911. return R( EngineUnmarshallData< R >()( _exec() ) );
  3912. }
  3913. else
  3914. {
  3915. SimConsoleThreadExecCallback cb;
  3916. SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc+9, NULL, false, &cb);
  3917. evt->populateArgs(mArgv);
  3918. mArgv[ 0 ].value->setStackStringValue(mCallbackName);
  3919. EngineMarshallData( a, mArgc, mArgv );
  3920. EngineMarshallData( b, mArgc, mArgv );
  3921. EngineMarshallData( c, mArgc, mArgv );
  3922. EngineMarshallData( d, mArgc, mArgv );
  3923. EngineMarshallData( e, mArgc, mArgv );
  3924. EngineMarshallData( f, mArgc, mArgv );
  3925. EngineMarshallData( g, mArgc, mArgv );
  3926. EngineMarshallData( h, mArgc, mArgv );
  3927. EngineMarshallData( i, mArgc, mArgv );
  3928. Sim::postEvent((SimObject*)Sim::getRootGroup(), evt, Sim::getCurrentTime());
  3929. return R( EngineUnmarshallData< R >()( cb.waitForResult() ) );
  3930. }
  3931. }
  3932. template< typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I, typename J >
  3933. R call( A a, B b, C c, D d, E e, F f, G g, H h, I i, J j )
  3934. {
  3935. if (Con::isMainThread())
  3936. {
  3937. ConsoleStackFrameSaver sav; sav.save();
  3938. CSTK.reserveValues(mArgc+10, mArgv);
  3939. mArgv[ 0 ].value->setStackStringValue(mCallbackName);
  3940. EngineMarshallData( a, mArgc, mArgv );
  3941. EngineMarshallData( b, mArgc, mArgv );
  3942. EngineMarshallData( c, mArgc, mArgv );
  3943. EngineMarshallData( d, mArgc, mArgv );
  3944. EngineMarshallData( e, mArgc, mArgv );
  3945. EngineMarshallData( f, mArgc, mArgv );
  3946. EngineMarshallData( g, mArgc, mArgv );
  3947. EngineMarshallData( h, mArgc, mArgv );
  3948. EngineMarshallData( i, mArgc, mArgv );
  3949. EngineMarshallData( j, mArgc, mArgv );
  3950. return R( EngineUnmarshallData< R >()( _exec() ) );
  3951. }
  3952. else
  3953. {
  3954. SimConsoleThreadExecCallback cb;
  3955. SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc+10, NULL, false, &cb);
  3956. evt->populateArgs(mArgv);
  3957. mArgv[ 0 ].value->setStackStringValue(mCallbackName);
  3958. EngineMarshallData( a, mArgc, mArgv );
  3959. EngineMarshallData( b, mArgc, mArgv );
  3960. EngineMarshallData( c, mArgc, mArgv );
  3961. EngineMarshallData( d, mArgc, mArgv );
  3962. EngineMarshallData( e, mArgc, mArgv );
  3963. EngineMarshallData( f, mArgc, mArgv );
  3964. EngineMarshallData( g, mArgc, mArgv );
  3965. EngineMarshallData( h, mArgc, mArgv );
  3966. EngineMarshallData( i, mArgc, mArgv );
  3967. EngineMarshallData( j, mArgc, mArgv );
  3968. Sim::postEvent((SimObject*)Sim::getRootGroup(), evt, Sim::getCurrentTime());
  3969. return R( EngineUnmarshallData< R >()( cb.waitForResult() ) );
  3970. }
  3971. }
  3972. 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 >
  3973. R call( A a, B b, C c, D d, E e, F f, G g, H h, I i, J j, K k )
  3974. {
  3975. if (Con::isMainThread())
  3976. {
  3977. ConsoleStackFrameSaver sav; sav.save();
  3978. CSTK.reserveValues(mArgc+11, mArgv);
  3979. mArgv[ 0 ].value->setStackStringValue(mCallbackName);
  3980. EngineMarshallData( a, mArgc, mArgv );
  3981. EngineMarshallData( b, mArgc, mArgv );
  3982. EngineMarshallData( c, mArgc, mArgv );
  3983. EngineMarshallData( d, mArgc, mArgv );
  3984. EngineMarshallData( e, mArgc, mArgv );
  3985. EngineMarshallData( f, mArgc, mArgv );
  3986. EngineMarshallData( g, mArgc, mArgv );
  3987. EngineMarshallData( h, mArgc, mArgv );
  3988. EngineMarshallData( i, mArgc, mArgv );
  3989. EngineMarshallData( j, mArgc, mArgv );
  3990. EngineMarshallData( k, mArgc, mArgv );
  3991. return R( EngineUnmarshallData< R >()( _exec() ) );
  3992. }
  3993. else
  3994. {
  3995. SimConsoleThreadExecCallback cb;
  3996. SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc+11, NULL, false, &cb);
  3997. evt->populateArgs(mArgv);
  3998. mArgv[ 0 ].value->setStackStringValue(mCallbackName);
  3999. EngineMarshallData( a, mArgc, mArgv );
  4000. EngineMarshallData( b, mArgc, mArgv );
  4001. EngineMarshallData( c, mArgc, mArgv );
  4002. EngineMarshallData( d, mArgc, mArgv );
  4003. EngineMarshallData( e, mArgc, mArgv );
  4004. EngineMarshallData( f, mArgc, mArgv );
  4005. EngineMarshallData( g, mArgc, mArgv );
  4006. EngineMarshallData( h, mArgc, mArgv );
  4007. EngineMarshallData( i, mArgc, mArgv );
  4008. EngineMarshallData( j, mArgc, mArgv );
  4009. EngineMarshallData( k, mArgc, mArgv );
  4010. Sim::postEvent((SimObject*)Sim::getRootGroup(), evt, Sim::getCurrentTime());
  4011. return R( EngineUnmarshallData< R >()( cb.waitForResult() ) );
  4012. }
  4013. }
  4014. 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 >
  4015. 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 )
  4016. {
  4017. if (Con::isMainThread())
  4018. {
  4019. ConsoleStackFrameSaver sav; sav.save();
  4020. CSTK.reserveValues(mArgc+12, mArgv);
  4021. mArgv[ 0 ].value->setStackStringValue(mCallbackName);
  4022. EngineMarshallData( a, mArgc, mArgv );
  4023. EngineMarshallData( b, mArgc, mArgv );
  4024. EngineMarshallData( c, mArgc, mArgv );
  4025. EngineMarshallData( d, mArgc, mArgv );
  4026. EngineMarshallData( e, mArgc, mArgv );
  4027. EngineMarshallData( f, mArgc, mArgv );
  4028. EngineMarshallData( g, mArgc, mArgv );
  4029. EngineMarshallData( h, mArgc, mArgv );
  4030. EngineMarshallData( i, mArgc, mArgv );
  4031. EngineMarshallData( j, mArgc, mArgv );
  4032. EngineMarshallData( k, mArgc, mArgv );
  4033. EngineMarshallData( l, mArgc, mArgv );
  4034. return R( EngineUnmarshallData< R >()( _exec() ) );
  4035. }
  4036. else
  4037. {
  4038. SimConsoleThreadExecCallback cb;
  4039. SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc+12, NULL, false, &cb);
  4040. evt->populateArgs(mArgv);
  4041. mArgv[ 0 ].value->setStackStringValue(mCallbackName);
  4042. EngineMarshallData( a, mArgc, mArgv );
  4043. EngineMarshallData( b, mArgc, mArgv );
  4044. EngineMarshallData( c, mArgc, mArgv );
  4045. EngineMarshallData( d, mArgc, mArgv );
  4046. EngineMarshallData( e, mArgc, mArgv );
  4047. EngineMarshallData( f, mArgc, mArgv );
  4048. EngineMarshallData( g, mArgc, mArgv );
  4049. EngineMarshallData( h, mArgc, mArgv );
  4050. EngineMarshallData( i, mArgc, mArgv );
  4051. EngineMarshallData( j, mArgc, mArgv );
  4052. EngineMarshallData( k, mArgc, mArgv );
  4053. EngineMarshallData( l, mArgc, mArgv );
  4054. Sim::postEvent((SimObject*)Sim::getRootGroup(), evt, Sim::getCurrentTime());
  4055. return R( EngineUnmarshallData< R >()( cb.waitForResult() ) );
  4056. }
  4057. }
  4058. };
  4059. // Re-enable some VC warnings we disabled for this file.
  4060. #pragma warning( pop ) // 4510 and 4610
  4061. #endif // !_ENGINEAPI_H_