diff --git a/Engine/source/T3D/gameBase/gameConnection.cpp b/Engine/source/T3D/gameBase/gameConnection.cpp index 4357ced06..bda2c1fda 100644 --- a/Engine/source/T3D/gameBase/gameConnection.cpp +++ b/Engine/source/T3D/gameBase/gameConnection.cpp @@ -459,6 +459,14 @@ bool GameConnection::readConnectRequest(BitStream *stream, const char **errorStr return false; } ConsoleValueRef connectArgv[MaxConnectArgs + 3]; + ConsoleValue connectArgvValue[MaxConnectArgs + 3]; + + for(U32 i = 0; i < mConnectArgc+3; i++) + { + connectArgv[i].value = &connectArgvValue[i]; + connectArgvValue[i].init(); + } + for(U32 i = 0; i < mConnectArgc; i++) { char argString[256]; @@ -466,11 +474,11 @@ bool GameConnection::readConnectRequest(BitStream *stream, const char **errorStr mConnectArgv[i] = dStrdup(argString); connectArgv[i + 3] = mConnectArgv[i]; } - connectArgv[0] = "onConnectRequest"; - connectArgv[1] = 0; + connectArgvValue[0].setStackStringValue("onConnectRequest"); + connectArgvValue[1].setIntValue(0); char buffer[256]; Net::addressToString(getNetAddress(), buffer); - connectArgv[2] = buffer; + connectArgvValue[2].setStackStringValue(buffer); // NOTE: Cannot convert over to IMPLEMENT_CALLBACK as it has variable args. const char *ret = Con::execute(this, mConnectArgc + 3, connectArgv); diff --git a/Engine/source/T3D/gameBase/gameConnectionEvents.cpp b/Engine/source/T3D/gameBase/gameConnectionEvents.cpp index 927814a52..ddc7b1674 100644 --- a/Engine/source/T3D/gameBase/gameConnectionEvents.cpp +++ b/Engine/source/T3D/gameBase/gameConnectionEvents.cpp @@ -32,6 +32,7 @@ #include "app/game.h" #include "T3D/gameBase/gameConnection.h" #include "T3D/gameBase/gameConnectionEvents.h" +#include "console/engineAPI.h" #define DebugChecksum 0xF00DBAAD @@ -234,7 +235,7 @@ void SimDataBlockEvent::process(NetConnection *cptr) if(mProcess) { //call the console function to set the number of blocks to be sent - Con::executef("onDataBlockObjectReceived", Con::getIntArg(mIndex), Con::getIntArg(mTotal)); + Con::executef("onDataBlockObjectReceived", mIndex, mTotal); String &errorBuffer = NetConnection::getErrorBuffer(); diff --git a/Engine/source/T3D/item.cpp b/Engine/source/T3D/item.cpp index 10ce867a9..c946ffa00 100644 --- a/Engine/source/T3D/item.cpp +++ b/Engine/source/T3D/item.cpp @@ -292,7 +292,7 @@ IMPLEMENT_CALLBACK( Item, onStickyCollision, void, ( const char* objID ),( objID "@see Item, ItemData\n" ); -IMPLEMENT_CALLBACK( Item, onEnterLiquid, void, ( const char* objID, const char* waterCoverage, const char* liquidType ),( objID, waterCoverage, liquidType ), +IMPLEMENT_CALLBACK( Item, onEnterLiquid, void, ( const char* objID, F32 waterCoverage, const char* liquidType ),( objID, waterCoverage, liquidType ), "Informs an Item object that it has entered liquid, along with information about the liquid type.\n" "@param objID Object ID for this Item object.\n" "@param waterCoverage How much coverage of water this Item object has.\n" @@ -1005,7 +1005,7 @@ void Item::updatePos(const U32 /*mask*/, const F32 dt) { if(!mInLiquid && mWaterCoverage != 0.0f) { - onEnterLiquid_callback( getIdString(), Con::getFloatArg(mWaterCoverage), mLiquidType.c_str() ); + onEnterLiquid_callback( getIdString(), mWaterCoverage, mLiquidType.c_str() ); mInLiquid = true; } else if(mInLiquid && mWaterCoverage == 0.0f) diff --git a/Engine/source/T3D/item.h b/Engine/source/T3D/item.h index 27e46fb70..5da9e0f56 100644 --- a/Engine/source/T3D/item.h +++ b/Engine/source/T3D/item.h @@ -114,7 +114,7 @@ class Item: public ShapeBase protected: DECLARE_CALLBACK( void, onStickyCollision, ( const char* objID )); - DECLARE_CALLBACK( void, onEnterLiquid, ( const char* objID, const char* waterCoverage, const char* liquidType )); + DECLARE_CALLBACK( void, onEnterLiquid, ( const char* objID, F32 waterCoverage, const char* liquidType )); DECLARE_CALLBACK( void, onLeaveLiquid, ( const char* objID, const char* liquidType )); public: diff --git a/Engine/source/T3D/pathCamera.cpp b/Engine/source/T3D/pathCamera.cpp index d6d9d1733..6b7aeddae 100644 --- a/Engine/source/T3D/pathCamera.cpp +++ b/Engine/source/T3D/pathCamera.cpp @@ -104,7 +104,7 @@ ConsoleDocClass( PathCamera, "@ingroup PathCameras\n" ); -IMPLEMENT_CALLBACK( PathCamera, onNode, void, (const char* node), (node), +IMPLEMENT_CALLBACK( PathCamera, onNode, void, (S32 node), (node), "A script callback that indicates the path camera has arrived at a specific node in its path. Server side only.\n" "@param Node Unique ID assigned to this node.\n"); @@ -408,7 +408,7 @@ void PathCamera::popFront() void PathCamera::onNode(S32 node) { if (!isGhost()) - onNode_callback(Con::getIntArg(node)); + onNode_callback(node); } diff --git a/Engine/source/T3D/pathCamera.h b/Engine/source/T3D/pathCamera.h index 685118e6e..b511917cb 100644 --- a/Engine/source/T3D/pathCamera.h +++ b/Engine/source/T3D/pathCamera.h @@ -93,7 +93,7 @@ private: public: DECLARE_CONOBJECT(PathCamera); - DECLARE_CALLBACK( void, onNode, (const char* node)); + DECLARE_CALLBACK( void, onNode, (S32 node)); PathCamera(); ~PathCamera(); diff --git a/Engine/source/T3D/rigidShape.cpp b/Engine/source/T3D/rigidShape.cpp index c69396fde..666048648 100644 --- a/Engine/source/T3D/rigidShape.cpp +++ b/Engine/source/T3D/rigidShape.cpp @@ -153,7 +153,7 @@ ConsoleDocClass( RigidShape, ); -IMPLEMENT_CALLBACK( RigidShape, onEnterLiquid, void, ( const char* objId, const char* waterCoverage, const char* liquidType ), +IMPLEMENT_CALLBACK( RigidShape, onEnterLiquid, void, ( const char* objId, F32 waterCoverage, const char* liquidType ), ( objId, waterCoverage, liquidType ), "@brief Called whenever this RigidShape object enters liquid.\n\n" "@param objId The ID of the rigidShape object.\n" @@ -1088,7 +1088,7 @@ void RigidShape::updatePos(F32 dt) // Water script callbacks if (!inLiquid && mWaterCoverage != 0.0f) { - onEnterLiquid_callback(getIdString(), Con::getFloatArg(mWaterCoverage), mLiquidType.c_str() ); + onEnterLiquid_callback(getIdString(), mWaterCoverage, mLiquidType.c_str() ); inLiquid = true; } else if (inLiquid && mWaterCoverage == 0.0f) diff --git a/Engine/source/T3D/rigidShape.h b/Engine/source/T3D/rigidShape.h index ca846dd40..d82145a67 100644 --- a/Engine/source/T3D/rigidShape.h +++ b/Engine/source/T3D/rigidShape.h @@ -296,7 +296,7 @@ public: void unpackUpdate(NetConnection *conn, BitStream *stream); DECLARE_CONOBJECT(RigidShape); - DECLARE_CALLBACK( void, onEnterLiquid, ( const char* objId, const char* waterCoverage, const char* liquidType )); + DECLARE_CALLBACK( void, onEnterLiquid, ( const char* objId, F32 waterCoverage, const char* liquidType )); DECLARE_CALLBACK( void, onLeaveLiquid, ( const char* objId, const char* liquidType )); }; diff --git a/Engine/source/app/badWordFilter.cpp b/Engine/source/app/badWordFilter.cpp index 74675370b..7f1dd51a6 100644 --- a/Engine/source/app/badWordFilter.cpp +++ b/Engine/source/app/badWordFilter.cpp @@ -23,9 +23,10 @@ #include "core/strings/stringFunctions.h" #include "console/consoleTypes.h" +#include "console/simBase.h" +#include "console/engineAPI.h" #include "app/badWordFilter.h" #include "core/module.h" -#include "console/engineAPI.h" MODULE_BEGIN( BadWordFilter ) diff --git a/Engine/source/app/net/serverQuery.cpp b/Engine/source/app/net/serverQuery.cpp index 27453ff18..072f26fde 100644 --- a/Engine/source/app/net/serverQuery.cpp +++ b/Engine/source/app/net/serverQuery.cpp @@ -1337,7 +1337,7 @@ static void processPingsAndQueries( U32 session, bool schedule ) else dSprintf( msg, sizeof( msg ), "%d servers found.", foundCount ); - Con::executef( "onServerQueryStatus", "done", msg, "1"); + Con::executef( "onServerQueryStatus", "done", (const char*)msg, "1"); } } diff --git a/Engine/source/console/arrayObject.cpp b/Engine/source/console/arrayObject.cpp index d92eae6bf..673d9af5e 100644 --- a/Engine/source/console/arrayObject.cpp +++ b/Engine/source/console/arrayObject.cpp @@ -103,9 +103,7 @@ S32 QSORT_CALLBACK ArrayObject::_keyFunctionCompare( const void* a, const void* ArrayObject::Element* ea = ( ArrayObject::Element* )( a ); ArrayObject::Element* eb = ( ArrayObject::Element* )( b ); - ConsoleValueRef argv[] = { smCompareFunction, ea->key, eb->key }; - - S32 result = dAtoi( Con::execute( 3, argv ) ); + S32 result = dAtoi( Con::executef( (const char*)smCompareFunction, ea->value, eb->key ) ); S32 res = result < 0 ? -1 : ( result > 0 ? 1 : 0 ); return ( smDecreasing ? -res : res ); } @@ -115,9 +113,7 @@ S32 QSORT_CALLBACK ArrayObject::_valueFunctionCompare( const void* a, const void ArrayObject::Element* ea = ( ArrayObject::Element* )( a ); ArrayObject::Element* eb = ( ArrayObject::Element* )( b ); - ConsoleValueRef argv[] = { smCompareFunction, ea->value, eb->value }; - - S32 result = dAtoi( Con::execute( 3, argv ) ); + S32 result = dAtoi( Con::executef( (const char*)smCompareFunction, ea->value, eb->value ) ); S32 res = result < 0 ? -1 : ( result > 0 ? 1 : 0 ); return ( smDecreasing ? -res : res ); } diff --git a/Engine/source/console/codeBlock.cpp b/Engine/source/console/codeBlock.cpp index 05a2ab798..87958c1af 100644 --- a/Engine/source/console/codeBlock.cpp +++ b/Engine/source/console/codeBlock.cpp @@ -570,7 +570,7 @@ bool CodeBlock::compile(const char *codeFileName, StringTableEntry fileName, con } -const char *CodeBlock::compileExec(StringTableEntry fileName, const char *inString, bool noCalls, S32 setFrame) +ConsoleValueRef CodeBlock::compileExec(StringTableEntry fileName, const char *inString, bool noCalls, S32 setFrame) { AssertFatal(Con::isMainThread(), "Compiling code on a secondary thread"); @@ -635,7 +635,7 @@ const char *CodeBlock::compileExec(StringTableEntry fileName, const char *inStri if(!gStatementList) { delete this; - return ""; + return ConsoleValueRef(); } resetTables(); diff --git a/Engine/source/console/codeBlock.h b/Engine/source/console/codeBlock.h index b5807b765..71f15c95e 100644 --- a/Engine/source/console/codeBlock.h +++ b/Engine/source/console/codeBlock.h @@ -129,7 +129,7 @@ public: /// with, zero being the top of the stack. If the the index is /// -1 a new frame is created. If the index is out of range the /// top stack frame is used. - const char *compileExec(StringTableEntry fileName, const char *script, + ConsoleValueRef compileExec(StringTableEntry fileName, const char *script, bool noCalls, S32 setFrame = -1 ); /// Executes the existing code in the CodeBlock. The return string is any diff --git a/Engine/source/console/compiledEval.cpp b/Engine/source/console/compiledEval.cpp index f74ada2ae..8d9f5dfcd 100644 --- a/Engine/source/console/compiledEval.cpp +++ b/Engine/source/console/compiledEval.cpp @@ -87,7 +87,7 @@ struct IterStackRecord struct StringPos { /// The raw string data on the string stack. - const char* mString; + StringStackPtr mString; /// Current parsing position. U32 mIndex; @@ -195,18 +195,20 @@ namespace Con return STR.getArgBuffer(bufferSize); } - ConsoleValueRef getFloatArg(F64 arg) + char *getFloatArg(F64 arg) { - ConsoleValueRef ref = arg; - return ref; + char *ret = STR.getArgBuffer(32); + dSprintf(ret, 32, "%g", arg); + return ret; } - ConsoleValueRef getIntArg(S32 arg) + char *getIntArg(S32 arg) { - ConsoleValueRef ref = arg; - return ref; + char *ret = STR.getArgBuffer(32); + dSprintf(ret, 32, "%d", arg); + return ret; } - + char *getStringArg( const char *arg ) { U32 len = dStrlen( arg ) + 1; @@ -286,6 +288,12 @@ inline void ExprEvalState::setStringVariable(const char *val) currentVariable->setStringValue(val); } +inline void ExprEvalState::setStringStackPtrVariable(StringStackPtr str) +{ + AssertFatal(currentVariable != NULL, "Invalid evaluator state - trying to set null variable!"); + currentVariable->setStringStackPtrValue(str); +} + inline void ExprEvalState::setCopyVariable() { if (copyVariable) @@ -432,6 +440,8 @@ ConsoleValueRef CodeBlock::exec(U32 ip, const char *functionName, Namespace *thi U32 consoleStackStart = CSTK.mStackPos; #endif + //Con::printf("CodeBlock::exec(%s,%u)", functionName ? functionName : "??", ip); + static char traceBuffer[1024]; S32 i; @@ -441,7 +451,7 @@ ConsoleValueRef CodeBlock::exec(U32 ip, const char *functionName, Namespace *thi F64 *curFloatTable; char *curStringTable; S32 curStringTableLen = 0; //clint to ensure we dont overwrite it - STR.clearFunctionOffset(); + STR.clearFunctionOffset(); // ensures arg buffer offset is back to 0 StringTableEntry thisFunctionName = NULL; bool popFrame = false; if(argv) @@ -489,15 +499,25 @@ ConsoleValueRef CodeBlock::exec(U32 ip, const char *functionName, Namespace *thi ConsoleValueRef ref = argv[i+1]; - if (argv[i+1].isString()) - gEvalState.setStringVariable(argv[i+1]); - else if (argv[i+1].isInt()) + switch(argv[i+1].getType()) + { + case ConsoleValue::TypeInternalInt: gEvalState.setIntVariable(argv[i+1]); - else if (argv[i+1].isFloat()) + break; + case ConsoleValue::TypeInternalFloat: gEvalState.setFloatVariable(argv[i+1]); - else + break; + case ConsoleValue::TypeInternalStringStackPtr: + gEvalState.setStringStackPtrVariable(argv[i+1].getStringStackPtrValue()); + break; + case ConsoleValue::TypeInternalStackString: + case ConsoleValue::TypeInternalString: + default: gEvalState.setStringVariable(argv[i+1]); + break; + } } + ip = ip + (fnArgc * 2) + (2 + 6 + 1); curFloatTable = functionFloats; curStringTable = functionStrings; @@ -533,17 +553,6 @@ ConsoleValueRef CodeBlock::exec(U32 ip, const char *functionName, Namespace *thi } } - bool doResetValueStack = !gEvalState.mResetLocked; - gEvalState.mResetLocked = true; - - if (gEvalState.mShouldReset) - { - // Ensure all stacks are clean in case anything became unbalanced during the previous execution - STR.clearFrames(); - CSTK.clearFrames(); - gEvalState.mShouldReset = false; - } - // Grab the state of the telenet debugger here once // so that the push and pop frames are always balanced. const bool telDebuggerOn = TelDebugger && TelDebugger->isConnected(); @@ -590,7 +599,7 @@ ConsoleValueRef CodeBlock::exec(U32 ip, const char *functionName, Namespace *thi Con::gCurrentRoot = this->modPath; } const char * val; - const char *retValue; + StringStackPtr retValue; // note: anything returned is pushed to CSTK and will be invalidated on the next exec() ConsoleValueRef returnValue; @@ -1144,7 +1153,7 @@ breakContinue: // We're falling thru here on purpose. case OP_RETURN: - retValue = STR.getStringValue(); + retValue = STR.getStringValuePtr(); if( iterDepth > 0 ) { @@ -1156,13 +1165,13 @@ breakContinue: } STR.rewind(); - STR.setStringValue( retValue ); // Not nice but works. - retValue = STR.getStringValue(); + STR.setStringValue( StringStackPtrRef(retValue).getPtr(&STR) ); // Not nice but works. + retValue = STR.getStringValuePtr(); } // Previously the return value was on the stack and would be returned using STR.getStringValue(). // Now though we need to wrap it in a ConsoleValueRef - returnValue.value = CSTK.pushStackString(retValue); + returnValue.value = CSTK.pushStringStackPtr(retValue); goto execFinished; @@ -1847,7 +1856,7 @@ breakContinue: // This will clear everything including returnValue CSTK.popFrame(); - STR.clearFunctionOffset(); + //STR.clearFunctionOffset(); } else { @@ -1999,7 +2008,7 @@ breakContinue: break; case OP_PUSH: STR.push(); - CSTK.pushString(STR.getPreviousStringValue()); + CSTK.pushStringStackPtr(STR.getPreviousStringValuePtr()); break; case OP_PUSH_UINT: CSTK.pushUINT(intStack[_UINT]); @@ -2080,7 +2089,7 @@ breakContinue: if( iter.mIsStringIter ) { - iter.mData.mStr.mString = STR.getStringValue(); + iter.mData.mStr.mString = STR.getStringValuePtr(); iter.mData.mStr.mIndex = 0; } else @@ -2118,7 +2127,7 @@ breakContinue: if( iter.mIsStringIter ) { - const char* str = iter.mData.mStr.mString; + const char* str = StringStackPtrRef(iter.mData.mStr.mString).getPtr(&STR); U32 startIndex = iter.mData.mStr.mIndex; U32 endIndex = startIndex; @@ -2234,18 +2243,11 @@ execFinished: Con::gCurrentRoot = saveCodeBlock->modPath; } - // Mark the reset flag for the next run if we've finished execution - if (doResetValueStack) - { - gEvalState.mShouldReset = true; - gEvalState.mResetLocked = false; - } - decRefCount(); #ifdef TORQUE_DEBUG - AssertFatal(!(STR.mStartStackSize > stackStart), "String stack not popped enough in script exec"); - AssertFatal(!(STR.mStartStackSize < stackStart), "String stack popped too much in script exec"); + //AssertFatal(!(STR.mStartStackSize > stackStart), "String stack not popped enough in script exec"); + //AssertFatal(!(STR.mStartStackSize < stackStart), "String stack popped too much in script exec"); #endif return returnValue; diff --git a/Engine/source/console/console.cpp b/Engine/source/console/console.cpp index e9f7cdf8a..f07fc65ee 100644 --- a/Engine/source/console/console.cpp +++ b/Engine/source/console/console.cpp @@ -1138,8 +1138,11 @@ void addCommand( const char *name,BoolCallback cb,const char *usage, S32 minArgs Namespace::global()->addCommand( StringTable->insert(name), cb, usage, minArgs, maxArgs, isToolOnly, header ); } -const char *evaluate(const char* string, bool echo, const char *fileName) +ConsoleValueRef evaluate(const char* string, bool echo, const char *fileName) { + ConsoleStackFrameSaver stackSaver; + stackSaver.save(); + if (echo) { if (string[0] == '%') @@ -1156,8 +1159,11 @@ const char *evaluate(const char* string, bool echo, const char *fileName) } //------------------------------------------------------------------------------ -const char *evaluatef(const char* string, ...) +ConsoleValueRef evaluatef(const char* string, ...) { + ConsoleStackFrameSaver stackSaver; + stackSaver.save(); + char buffer[4096]; va_list args; va_start(args, string); @@ -1167,26 +1173,34 @@ const char *evaluatef(const char* string, ...) return newCodeBlock->compileExec(NULL, buffer, false, 0); } -const char *execute(S32 argc, ConsoleValueRef argv[]) +//------------------------------------------------------------------------------ + +// Internal execute for global function which does not save the stack +ConsoleValueRef _internalExecute(S32 argc, ConsoleValueRef argv[]) +{ + Namespace::Entry *ent; + StringTableEntry funcName = StringTable->insert(argv[0]); + ent = Namespace::global()->lookup(funcName); + + if(!ent) + { + warnf(ConsoleLogEntry::Script, "%s: Unknown command.", (const char*)argv[0]); + + STR.clearFunctionOffset(); + return ConsoleValueRef(); + } + return ent->execute(argc, argv, &gEvalState); +} + +ConsoleValueRef execute(S32 argc, ConsoleValueRef argv[]) { #ifdef TORQUE_MULTITHREAD if(isMainThread()) { #endif - Namespace::Entry *ent; - StringTableEntry funcName = StringTable->insert(argv[0]); - ent = Namespace::global()->lookup(funcName); - - if(!ent) - { - warnf(ConsoleLogEntry::Script, "%s: Unknown command.", (const char*)argv[0]); - - // Clean up arg buffers, if any. - STR.clearFunctionOffset(); - CSTK.resetFrame(); - return ""; - } - return ent->execute(argc, argv, &gEvalState); + ConsoleStackFrameSaver stackSaver; + stackSaver.save(); + return _internalExecute(argc, argv); #ifdef TORQUE_MULTITHREAD } else @@ -1200,17 +1214,24 @@ const char *execute(S32 argc, ConsoleValueRef argv[]) #endif } -const char *execute(S32 argc, const char *argv[]) +ConsoleValueRef execute(S32 argc, const char *argv[]) { + ConsoleStackFrameSaver stackSaver; + stackSaver.save(); StringStackConsoleWrapper args(argc, argv); return execute(args.count(), args); } //------------------------------------------------------------------------------ -const char *execute(SimObject *object, S32 argc, ConsoleValueRef argv[], bool thisCallOnly) + +// Internal execute for object method which does not save the stack +ConsoleValueRef _internalExecute(SimObject *object, S32 argc, ConsoleValueRef argv[], bool thisCallOnly) { if(argc < 2) - return ""; + { + STR.clearFunctionOffset(); + return ConsoleValueRef(); + } // [neo, 10/05/2007 - #3010] // Make sure we don't get recursive calls, respect the flag! @@ -1230,10 +1251,8 @@ const char *execute(SimObject *object, S32 argc, ConsoleValueRef argv[], bool th if(object->getNamespace()) { - ConsoleValueRef internalArgv[StringStack::MaxArgs]; - - U32 ident = object->getId(); - ConsoleValueRef oldIdent = argv[1]; + U32 ident = object->getId(); + ConsoleValueRef oldIdent = argv[1]; StringTableEntry funcName = StringTable->insert(argv[0]); Namespace::Entry *ent = object->getNamespace()->lookup(funcName); @@ -1242,10 +1261,8 @@ const char *execute(SimObject *object, S32 argc, ConsoleValueRef argv[], bool th { //warnf(ConsoleLogEntry::Script, "%s: undefined for object '%s' - id %d", funcName, object->getName(), object->getId()); - // Clean up arg buffers, if any. STR.clearFunctionOffset(); - CSTK.resetFrame(); - return ""; + return ConsoleValueRef(); } // Twiddle %this argument @@ -1253,7 +1270,7 @@ const char *execute(SimObject *object, S32 argc, ConsoleValueRef argv[], bool th SimObject *save = gEvalState.thisObject; gEvalState.thisObject = object; - const char *ret = ent->execute(argc, argv, &gEvalState); + ConsoleValueRef ret = ent->execute(argc, argv, &gEvalState); gEvalState.thisObject = save; // Twiddle it back @@ -1261,17 +1278,52 @@ const char *execute(SimObject *object, S32 argc, ConsoleValueRef argv[], bool th return ret; } + warnf(ConsoleLogEntry::Script, "Con::execute - %d has no namespace: %s", object->getId(), (const char*)argv[0]); - return ""; + STR.clearFunctionOffset(); + return ConsoleValueRef(); } -const char *execute(SimObject *object, S32 argc, const char *argv[], bool thisCallOnly) + +ConsoleValueRef execute(SimObject *object, S32 argc, ConsoleValueRef argv[], bool thisCallOnly) { + if(argc < 2) + { + STR.clearFunctionOffset(); + return ConsoleValueRef(); + } + + ConsoleStackFrameSaver stackSaver; + stackSaver.save(); + + if (object->getNamespace() || !thisCallOnly) + { + if (isMainThread()) + { + return _internalExecute(object, argc, argv, thisCallOnly); + } + else + { + SimConsoleThreadExecCallback cb; + SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(argc, argv, true, &cb); + Sim::postEvent(object, evt, Sim::getCurrentTime()); + } + } + + warnf(ConsoleLogEntry::Script, "Con::execute - %d has no namespace: %s", object->getId(), (const char*)argv[0]); + STR.clearFunctionOffset(); + return ConsoleValueRef(); +} + +ConsoleValueRef execute(SimObject *object, S32 argc, const char *argv[], bool thisCallOnly) +{ + ConsoleStackFrameSaver stackSaver; + stackSaver.save(); StringStackConsoleWrapper args(argc, argv); return execute(object, args.count(), args, thisCallOnly); } -inline const char*_executef(SimObject *obj, S32 checkArgc, S32 argc, ConsoleValueRef *argv) +inline ConsoleValueRef _executef(SimObject *obj, S32 checkArgc, S32 argc, ConsoleValueRef *argv) { const U32 maxArg = 12; AssertWarn(checkArgc == argc, "Incorrect arg count passed to Con::executef(SimObject*)"); @@ -1279,42 +1331,14 @@ inline const char*_executef(SimObject *obj, S32 checkArgc, S32 argc, ConsoleValu return execute(obj, argc, argv); } -#define A ConsoleValueRef -#define OBJ SimObject* obj -const char *executef(OBJ, A a) { ConsoleValueRef params[] = {a,ConsoleValueRef()}; return _executef(obj, 2, 2, params); } -const char *executef(OBJ, A a, A b) { ConsoleValueRef params[] = {a,ConsoleValueRef(),b}; return _executef(obj, 3, 3, params); } -const char *executef(OBJ, A a, A b, A c) { ConsoleValueRef params[] = {a,ConsoleValueRef(),b,c}; return _executef(obj, 4, 4, params); } -const char *executef(OBJ, A a, A b, A c, A d) { ConsoleValueRef params[] = {a,ConsoleValueRef(),b,c,d}; return _executef(obj, 5, 5, params); } -const char *executef(OBJ, A a, A b, A c, A d, A e) { ConsoleValueRef params[] = {a,ConsoleValueRef(),b,c,d,e}; return _executef(obj, 6, 6, params); } -const char *executef(OBJ, A a, A b, A c, A d, A e, A f) { ConsoleValueRef params[] = {a,ConsoleValueRef(),b,c,d,e,f}; return _executef(obj, 7, 7, params); } -const char *executef(OBJ, A a, A b, A c, A d, A e, A f, A g) { ConsoleValueRef params[] = {a,ConsoleValueRef(),b,c,d,e,f,g}; return _executef(obj, 8, 8, params); } -const char *executef(OBJ, A a, A b, A c, A d, A e, A f, A g, A h) { ConsoleValueRef params[] = {a,ConsoleValueRef(),b,c,d,e,f,g,h}; return _executef(obj, 9, 9, params); } -const char *executef(OBJ, A a, A b, A c, A d, A e, A f, A g, A h, A i) { ConsoleValueRef params[] = {a,ConsoleValueRef(),b,c,d,e,f,g,h,i}; return _executef(obj, 10, 10, params); } -const char *executef(OBJ, A a, A b, A c, A d, A e, A f, A g, A h, A i, A j) { ConsoleValueRef params[] = {a,ConsoleValueRef(),b,c,d,e,f,g,h,i,j}; return _executef(obj, 11, 11, params); } -const char *executef(OBJ, A a, A b, A c, A d, A e, A f, A g, A h, A i, A j, A k) { ConsoleValueRef params[] = {a,ConsoleValueRef(),b,c,d,e,f,g,h,i,j,k}; return _executef(obj, 12, 12, params); } - //------------------------------------------------------------------------------ -inline const char*_executef(S32 checkArgc, S32 argc, ConsoleValueRef *argv) +inline ConsoleValueRef _executef(S32 checkArgc, S32 argc, ConsoleValueRef *argv) { const U32 maxArg = 10; AssertFatal(checkArgc == argc, "Incorrect arg count passed to Con::executef()"); AssertFatal(argc <= maxArg, "Too many args passed to Con::_executef(). Please update the function to handle more."); return execute(argc, argv); } - -#define A ConsoleValueRef -const char *executef(A a) { ConsoleValueRef params[] = {a}; return _executef(1, 1, params); } -const char *executef(A a, A b) { ConsoleValueRef params[] = {a,b}; return _executef(2, 2, params); } -const char *executef(A a, A b, A c) { ConsoleValueRef params[] = {a,b,c}; return _executef(3, 3, params); } -const char *executef(A a, A b, A c, A d) { ConsoleValueRef params[] = {a,b,c,d}; return _executef(4, 4, params); } -const char *executef(A a, A b, A c, A d, A e) { ConsoleValueRef params[] = {a,b,c,d,e}; return _executef(5, 5, params); } -const char *executef(A a, A b, A c, A d, A e, A f) { ConsoleValueRef params[] = {a,b,c,d,e,f}; return _executef(6, 6, params); } -const char *executef(A a, A b, A c, A d, A e, A f, A g) { ConsoleValueRef params[] = {a,b,c,d,e,f,g}; return _executef(7, 7, params); } -const char *executef(A a, A b, A c, A d, A e, A f, A g, A h) { ConsoleValueRef params[] = {a,b,c,d,e,f,g,h}; return _executef(8, 8, params); } -const char *executef(A a, A b, A c, A d, A e, A f, A g, A h, A i) { ConsoleValueRef params[] = {a,b,c,d,e,f,g,h,i}; return _executef(9, 9, params); } -const char *executef(A a, A b, A c, A d, A e, A f, A g, A h, A i, A j) { ConsoleValueRef params[] = {a,b,c,d,e,f,g,h,i,j}; return _executef(10, 10, params); } -#undef A - //------------------------------------------------------------------------------ bool isFunction(const char *fn) @@ -1577,10 +1601,13 @@ DefineEngineFunction( logWarning, void, ( const char* message ),, Con::warnf( "%s", message ); } +//------------------------------------------------------------------------------ + +extern ConsoleValueStack CSTK; + ConsoleValueRef::ConsoleValueRef(const ConsoleValueRef &ref) { - value = ref.value; - stringStackValue = ref.stringStackValue; + value = ref.value; } ConsoleValueRef::ConsoleValueRef(const char *newValue) : value(NULL) @@ -1613,6 +1640,49 @@ ConsoleValueRef::ConsoleValueRef(F64 newValue) : value(NULL) *this = newValue; } +ConsoleValueRef& ConsoleValueRef::operator=(const ConsoleValueRef &newValue) +{ + value = newValue.value; + return *this; +} + +ConsoleValueRef& ConsoleValueRef::operator=(const char *newValue) +{ + AssertFatal(value, "value should not be NULL"); + value->setStringValue(newValue); + return *this; +} + +ConsoleValueRef& ConsoleValueRef::operator=(S32 newValue) +{ + AssertFatal(value, "value should not be NULL"); + value->setIntValue(newValue); + return *this; +} + +ConsoleValueRef& ConsoleValueRef::operator=(U32 newValue) +{ + AssertFatal(value, "value should not be NULL"); + value->setIntValue(newValue); + return *this; +} + +ConsoleValueRef& ConsoleValueRef::operator=(F32 newValue) +{ + AssertFatal(value, "value should not be NULL"); + value->setFloatValue(newValue); + return *this; +} + +ConsoleValueRef& ConsoleValueRef::operator=(F64 newValue) +{ + AssertFatal(value, "value should not be NULL"); + value->setFloatValue(newValue); + return *this; +} + +//------------------------------------------------------------------------------ + StringStackWrapper::StringStackWrapper(int targc, ConsoleValueRef targv[]) { argv = new const char*[targc]; @@ -1637,10 +1707,13 @@ StringStackWrapper::~StringStackWrapper() StringStackConsoleWrapper::StringStackConsoleWrapper(int targc, const char** targ) { argv = new ConsoleValueRef[targc]; + argvValue = new ConsoleValue[targc]; argc = targc; for (int i=0; i 0; else if(type == TypeInternalInt) @@ -1716,7 +1802,7 @@ void ConsoleValue::setIntValue(U32 val) ival = val; if(sval != typeValueEmpty) { - if (type != TypeInternalStackString) dFree(sval); + if (type != TypeInternalStackString && type != TypeInternalStringStackPtr) dFree(sval); sval = typeValueEmpty; } type = TypeInternalInt; @@ -1741,7 +1827,7 @@ void ConsoleValue::setFloatValue(F32 val) ival = static_cast(val); if(sval != typeValueEmpty) { - if (type != TypeInternalStackString) dFree(sval); + if (type != TypeInternalStackString && type != TypeInternalStringStackPtr) dFree(sval); sval = typeValueEmpty; } type = TypeInternalFloat; @@ -1753,70 +1839,49 @@ void ConsoleValue::setFloatValue(F32 val) } } +//------------------------------------------------------------------------------ -const char *ConsoleValueRef::getStringArgValue() +ConsoleValueRef _BaseEngineConsoleCallbackHelper::_exec() { - if (value) + ConsoleValueRef returnValue; + if( mThis ) { - if (stringStackValue == NULL) - stringStackValue = Con::getStringArg(value->getStringValue()); - return stringStackValue; + // Cannot invoke callback until object has been registered + if (mThis->isProperlyAdded()) { + returnValue = Con::_internalExecute( mThis, mArgc, mArgv, false ); + } else { + STR.clearFunctionOffset(); + returnValue = ConsoleValueRef(); + } } else + returnValue = Con::_internalExecute( mArgc, mArgv ); + + mArgc = mInitialArgc; // reset args + return returnValue; +} + +ConsoleValueRef _BaseEngineConsoleCallbackHelper::_execLater(SimConsoleThreadExecEvent *evt) +{ + mArgc = mInitialArgc; // reset args + Sim::postEvent((SimObject*)Sim::getRootGroup(), evt, Sim::getCurrentTime()); + return evt->getCB().waitForResult(); +} + +//------------------------------------------------------------------------------ + +void ConsoleStackFrameSaver::save() +{ + CSTK.pushFrame(); + STR.pushFrame(); + mSaved = true; +} + +void ConsoleStackFrameSaver::restore() +{ + if (mSaved) { - return ""; + CSTK.popFrame(); + STR.popFrame(); } } - - -extern ConsoleValueStack CSTK; - -ConsoleValueRef& ConsoleValueRef::operator=(const ConsoleValueRef &newValue) -{ - value = newValue.value; - stringStackValue = newValue.stringStackValue; - return *this; -} - -ConsoleValueRef& ConsoleValueRef::operator=(const char *newValue) -{ - value = CSTK.pushStackString(newValue); - stringStackValue = NULL; - return *this; -} - -ConsoleValueRef& ConsoleValueRef::operator=(S32 newValue) -{ - value = CSTK.pushFLT(newValue); - stringStackValue = NULL; - return *this; -} - -ConsoleValueRef& ConsoleValueRef::operator=(U32 newValue) -{ - value = CSTK.pushUINT(newValue); - stringStackValue = NULL; - return *this; -} - -ConsoleValueRef& ConsoleValueRef::operator=(F32 newValue) -{ - value = CSTK.pushFLT(newValue); - stringStackValue = NULL; - return *this; -} - -ConsoleValueRef& ConsoleValueRef::operator=(F64 newValue) -{ - value = CSTK.pushFLT(newValue); - stringStackValue = NULL; - return *this; -} - -namespace Con -{ - void resetStackFrame() - { - CSTK.resetFrame(); - } -} diff --git a/Engine/source/console/console.h b/Engine/source/console/console.h index 01c70e471..4ca0c8da8 100644 --- a/Engine/source/console/console.h +++ b/Engine/source/console/console.h @@ -44,6 +44,8 @@ struct ConsoleFunctionHeader; class EngineEnumTable; typedef EngineEnumTable EnumTable; +typedef U32 StringStackPtr; + template< typename T > S32 TYPEID(); @@ -121,8 +123,9 @@ public: enum { - TypeInternalInt = -4, - TypeInternalFloat = -3, + TypeInternalInt = -5, + TypeInternalFloat = -4, + TypeInternalStringStackPtr = -3, TypeInternalStackString = -2, TypeInternalString = -1, }; @@ -166,6 +169,7 @@ public: S32 getSignedIntValue(); F32 getFloatValue(); const char *getStringValue(); + StringStackPtr getStringStackPtr(); bool getBoolValue(); void setIntValue(U32 val); @@ -173,6 +177,7 @@ public: void setFloatValue(F32 val); void setStringValue(const char *value); void setStackStringValue(const char *value); + void setStringStackPtrValue(StringStackPtr ptr); void setBoolValue(bool val); void init() @@ -181,12 +186,13 @@ public: fval = 0; sval = typeValueEmpty; bufferLen = 0; + type = TypeInternalString; } void cleanup() { if (type <= TypeInternalString && - sval != typeValueEmpty && type != TypeInternalStackString ) + sval != typeValueEmpty && type != TypeInternalStackString && type != TypeInternalStringStackPtr) dFree(sval); sval = typeValueEmpty; type = ConsoleValue::TypeInternalString; @@ -203,9 +209,8 @@ class ConsoleValueRef { public: ConsoleValue *value; - const char *stringStackValue; - ConsoleValueRef() : value(0), stringStackValue(0) { ; } + ConsoleValueRef() : value(0) { ; } ~ConsoleValueRef() { ; } ConsoleValueRef(const ConsoleValueRef &ref); @@ -216,8 +221,10 @@ public: ConsoleValueRef(F32 value); ConsoleValueRef(F64 value); + static ConsoleValueRef fromValue(ConsoleValue *value) { ConsoleValueRef ref; ref.value = value; return ref; } + const char *getStringValue() { return value ? value->getStringValue() : ""; } - const char *getStringArgValue(); + StringStackPtr getStringStackPtrValue() { return value ? value->getStringStackPtr() : 0; } inline U32 getIntValue() { return value ? value->getIntValue() : 0; } inline S32 getSignedIntValue() { return value ? value->getSignedIntValue() : 0; } @@ -229,10 +236,13 @@ public: inline operator U32() { return getIntValue(); } inline operator S32() { return getSignedIntValue(); } inline operator F32() { return getFloatValue(); } - - inline bool isString() { return value ? value->type >= ConsoleValue::TypeInternalStackString : true; } + inline operator bool() { return getBoolValue(); } + + inline bool isStringStackPtr() { return value ? value->type == ConsoleValue::TypeInternalStringStackPtr : false; } + inline bool isString() { return value ? value->type >= ConsoleValue::TypeInternalStringStackPtr : true; } inline bool isInt() { return value ? value->type == ConsoleValue::TypeInternalInt : false; } inline bool isFloat() { return value ? value->type == ConsoleValue::TypeInternalFloat : false; } + inline S32 getType() { return value ? value->type : -1; } // Note: operators replace value ConsoleValueRef& operator=(const ConsoleValueRef &other); @@ -281,6 +291,7 @@ public: class StringStackConsoleWrapper { public: + ConsoleValue *argvValue; ConsoleValueRef *argv; int argc; @@ -753,23 +764,9 @@ namespace Con /// char* argv[] = {"abs", "-9"}; /// char* result = execute(2, argv); /// @endcode - const char *execute(S32 argc, const char* argv[]); - const char *execute(S32 argc, ConsoleValueRef argv[]); - - /// @see execute(S32 argc, const char* argv[]) - // Note: this can't be ConsoleValueRef& since the compiler will confuse it with SimObject* -#define ARG ConsoleValueRef - const char *executef( ARG); - const char *executef( ARG, ARG); - const char *executef( ARG, ARG, ARG); - const char *executef( ARG, ARG, ARG, ARG); - const char *executef( ARG, ARG, ARG, ARG, ARG); - const char *executef( ARG, ARG, ARG, ARG, ARG, ARG); - const char *executef( ARG, ARG, ARG, ARG, ARG, ARG, ARG); - const char *executef( ARG, ARG, ARG, ARG, ARG, ARG, ARG, ARG); - const char *executef( ARG, ARG, ARG, ARG, ARG, ARG, ARG, ARG, ARG); - const char *executef( ARG, ARG, ARG, ARG, ARG, ARG, ARG, ARG, ARG, ARG); -#undef ARG + /// NOTE: this function restores the console stack on return. + ConsoleValueRef execute(S32 argc, const char* argv[]); + ConsoleValueRef execute(S32 argc, ConsoleValueRef argv[]); /// Call a Torque Script member function of a SimObject from C/C++ code. /// @param object Object on which to execute the method call. @@ -783,35 +780,23 @@ namespace Con /// char* argv[] = {"setMode", "", "2"}; /// char* result = execute(mysimobject, 3, argv); /// @endcode - const char *execute(SimObject *object, S32 argc, const char *argv[], bool thisCallOnly = false); - const char *execute(SimObject *object, S32 argc, ConsoleValueRef argv[], bool thisCallOnly = false); - - /// @see execute(SimObject *, S32 argc, ConsoleValueRef argv[]) -#define ARG ConsoleValueRef - const char *executef(SimObject *, ARG); - const char *executef(SimObject *, ARG, ARG); - const char *executef(SimObject *, ARG, ARG, ARG); - const char *executef(SimObject *, ARG, ARG, ARG, ARG); - const char *executef(SimObject *, ARG, ARG, ARG, ARG, ARG); - const char *executef(SimObject *, ARG, ARG, ARG, ARG, ARG, ARG); - const char *executef(SimObject *, ARG, ARG, ARG, ARG, ARG, ARG, ARG); - const char *executef(SimObject *, ARG, ARG, ARG, ARG, ARG, ARG, ARG, ARG); - const char *executef(SimObject *, ARG, ARG, ARG, ARG, ARG, ARG, ARG, ARG, ARG); - const char *executef(SimObject *, ARG, ARG, ARG, ARG, ARG, ARG, ARG, ARG, ARG, ARG); - const char *executef(SimObject *, ARG, ARG, ARG, ARG, ARG, ARG, ARG, ARG, ARG, ARG, ARG); -#undef ARG + /// NOTE: this function restores the console stack on return. + ConsoleValueRef execute(SimObject *object, S32 argc, const char* argv[], bool thisCallOnly = false); + ConsoleValueRef execute(SimObject *object, S32 argc, ConsoleValueRef argv[], bool thisCallOnly = false); /// Evaluate an arbitrary chunk of code. /// /// @param string Buffer containing code to execute. /// @param echo Should we echo the string to the console? /// @param fileName Indicate what file this code is coming from; used in error reporting and such. - const char *evaluate(const char* string, bool echo = false, const char *fileName = NULL); + /// NOTE: This function restores the console stack on return. + ConsoleValueRef evaluate(const char* string, bool echo = false, const char *fileName = NULL); /// Evaluate an arbitrary line of script. /// /// This wraps dVsprintf(), so you can substitute parameters into the code being executed. - const char *evaluatef(const char* string, ...); + /// NOTE: This function restores the console stack on return. + ConsoleValueRef evaluatef(const char* string, ...); /// @} @@ -831,14 +816,12 @@ namespace Con char* getReturnBuffer( const StringBuilder& str ); char* getArgBuffer(U32 bufferSize); - ConsoleValueRef getFloatArg(F64 arg); - ConsoleValueRef getIntArg (S32 arg); - char* getStringArg( const char *arg ); + char* getFloatArg(F64 arg); + char* getIntArg (S32 arg); + char* getStringArg( const char* arg ); char* getStringArg( const String& arg ); /// @} - void resetStackFrame(); - /// @name Namespaces /// @{ @@ -872,21 +855,48 @@ namespace Con /// @name Dynamic Type System /// @{ - /// -/* void registerType( const char *typeName, S32 type, S32 size, GetDataFunction gdf, SetDataFunction sdf, bool isDatablockType = false ); - void registerType( const char* typeName, S32 type, S32 size, bool isDatablockType = false ); - void registerTypeGet( S32 type, GetDataFunction gdf ); - void registerTypeSet( S32 type, SetDataFunction sdf ); - - const char *getTypeName(S32 type); - bool isDatablockType( S32 type ); */ - void setData(S32 type, void *dptr, S32 index, S32 argc, const char **argv, const EnumTable *tbl = NULL, BitSet32 flag = 0); const char *getData(S32 type, void *dptr, S32 index, const EnumTable *tbl = NULL, BitSet32 flag = 0); const char *getFormattedData(S32 type, const char *data, const EnumTable *tbl = NULL, BitSet32 flag = 0); + /// @} }; +struct _EngineConsoleCallbackHelper; +template struct _EngineConsoleExecCallbackHelper; + +namespace Con +{ + /// @name Console Execution - executef + /// { + /// + /// Implements a script function thunk which automatically converts parameters to relevant console types. + /// Can be used as follows: + /// - Con::executef("functionName", ...); + /// - Con::executef(mySimObject, "functionName", ...); + /// + /// NOTE: if you get a rather cryptic template error coming through here, most likely you are trying to + /// convert a parameter which EngineMarshallType does not have a specialization for. + /// Another problem can occur if you do not include "console/simBase.h" and "console/engineAPI.h" + /// since _EngineConsoleExecCallbackHelper and SimConsoleThreadExecCallback are required. + /// + /// @see _EngineConsoleExecCallbackHelper + /// + template ConsoleValueRef executef(A a) { _EngineConsoleExecCallbackHelper callback( a ); return callback.template call(); } + template ConsoleValueRef executef(A a, B b) { _EngineConsoleExecCallbackHelper callback( a ); return callback.template call(b); } + template ConsoleValueRef executef(A a, B b, C c) { _EngineConsoleExecCallbackHelper callback( a ); return callback.template call(b, c); } + template ConsoleValueRef executef(A a, B b, C c, D d) { _EngineConsoleExecCallbackHelper callback( a ); return callback.template call(b, c, d); } + template ConsoleValueRef executef(A a, B b, C c, D d, E e) { _EngineConsoleExecCallbackHelper callback( a ); return callback.template call(b, c, d, e); } + template ConsoleValueRef executef(A a, B b, C c, D d, E e, F f) { _EngineConsoleExecCallbackHelper callback( a ); return callback.template call(b, c, d, e, f); } + template ConsoleValueRef executef(A a, B b, C c, D d, E e, F f, G g) { _EngineConsoleExecCallbackHelper callback( a ); return callback.template call(b, c, d, e, f, g); } + template ConsoleValueRef executef(A a, B b, C c, D d, E e, F f, G g, H h) { _EngineConsoleExecCallbackHelper callback( a ); return callback.template call(b, c, d, e, f, g, h); } + template ConsoleValueRef executef(A a, B b, C c, D d, E e, F f, G g, H h, I i) { _EngineConsoleExecCallbackHelper callback( a ); return callback.template call(b, c, d, e, f, g, h, i); } + template ConsoleValueRef executef(A a, B b, C c, D d, E e, F f, G g, H h, I i, J j) { _EngineConsoleExecCallbackHelper callback( a ); return callback.template call(b, c, d, e, f, g, h, i, j); } + template ConsoleValueRef executef(A a, B b, C c, D d, E e, F f, G g, H h, I i, J j, K k) { _EngineConsoleExecCallbackHelper callback( a ); return callback.template call(b, c, d, e, f, g, h, i, j, k); } + template ConsoleValueRef executef(A a, B b, C c, D d, E e, F f, G g, H h, I i, J j, K k, L l) { _EngineConsoleExecCallbackHelper callback( a ); return callback.template call(b, c, d, e, f, g, h, i, j, k, l); } + /// } +}; + extern void expandEscape(char *dest, const char *src); extern bool collapseEscape(char *buf); extern U32 HashPointer(StringTableEntry ptr); @@ -1103,6 +1113,28 @@ struct ConsoleDocFragment }; +/// Utility class to save and restore the current console stack frame +/// +class ConsoleStackFrameSaver +{ +public: + + bool mSaved; + + ConsoleStackFrameSaver() : mSaved(false) + { + } + + ~ConsoleStackFrameSaver() + { + restore(); + } + + void save(); + void restore(); +}; + + /// @name Global Console Definition Macros /// /// @note If TORQUE_DEBUG is defined, then we gather documentation information, and diff --git a/Engine/source/console/consoleInternal.cpp b/Engine/source/console/consoleInternal.cpp index 62c354dcb..e72ddee80 100644 --- a/Engine/source/console/consoleInternal.cpp +++ b/Engine/source/console/consoleInternal.cpp @@ -512,7 +512,7 @@ void ConsoleValue::setStringValue(const char * value) */ if (value == typeValueEmpty) { - if (sval && sval != typeValueEmpty && type != TypeInternalStackString) dFree(sval); + if (sval && sval != typeValueEmpty && type != TypeInternalStackString && type != TypeInternalStringStackPtr) dFree(sval); sval = typeValueEmpty; bufferLen = 0; fval = 0.f; @@ -541,7 +541,7 @@ void ConsoleValue::setStringValue(const char * value) // may as well pad to the next cache line U32 newLen = ((stringLen + 1) + 15) & ~15; - if(sval == typeValueEmpty || type == TypeInternalStackString) + if(sval == typeValueEmpty || type == TypeInternalStackString || type == TypeInternalStringStackPtr) sval = (char *) dMalloc(newLen); else if(newLen > bufferLen) sval = (char *) dRealloc(sval, newLen); @@ -556,7 +556,7 @@ void ConsoleValue::setStringValue(const char * value) } -void ConsoleValue::setStackStringValue(const char * value) +void ConsoleValue::setStackStringValue(const char *value) { if (value == NULL) value = typeValueEmpty; @@ -564,7 +564,7 @@ void ConsoleValue::setStackStringValue(const char * value) { if (value == typeValueEmpty) { - if (sval && sval != typeValueEmpty && type != ConsoleValue::TypeInternalStackString) dFree(sval); + if (sval && sval != typeValueEmpty && type != ConsoleValue::TypeInternalStackString && type != ConsoleValue::TypeInternalStringStackPtr) dFree(sval); sval = typeValueEmpty; bufferLen = 0; fval = 0.f; @@ -586,13 +586,42 @@ void ConsoleValue::setStackStringValue(const char * value) } type = TypeInternalStackString; - sval = (char*)value; + sval = (char*)value; bufferLen = stringLen; } else Con::setData(type, dataPtr, 0, 1, &value, enumTable); } +void ConsoleValue::setStringStackPtrValue(StringStackPtr ptrValue) +{ + if(type <= ConsoleValue::TypeInternalString) + { + const char *value = StringStackPtrRef(ptrValue).getPtr(&STR); + if (sval && sval != typeValueEmpty && type != ConsoleValue::TypeInternalStackString && type != TypeInternalStringStackPtr) dFree(sval); + + U32 stringLen = dStrlen(value); + if(stringLen < 256) + { + fval = dAtof(value); + ival = dAtoi(value); + } + else + { + fval = 0.f; + ival = 0; + } + + type = TypeInternalStringStackPtr; + sval = (char*)(value - STR.mBuffer); + bufferLen = stringLen; + } + else + { + const char *value = StringStackPtrRef(ptrValue).getPtr(&STR); + Con::setData(type, dataPtr, 0, 1, &value, enumTable); + } +} S32 Dictionary::getIntVariable(StringTableEntry name, bool *entValid) { @@ -651,7 +680,8 @@ Dictionary::Entry* Dictionary::addVariable( const char *name, Entry *ent = add(StringTable->insert(name)); if ( ent->value.type <= ConsoleValue::TypeInternalString && - ent->value.sval != typeValueEmpty && ent->value.type != ConsoleValue::TypeInternalStackString ) + ent->value.sval != typeValueEmpty && + ent->value.type != ConsoleValue::TypeInternalStackString && ent->value.type != ConsoleValue::TypeInternalStringStackPtr ) dFree(ent->value.sval); ent->value.type = type; @@ -1338,14 +1368,20 @@ void Namespace::markGroup(const char* name, const char* usage) extern S32 executeBlock(StmtNode *block, ExprEvalState *state); -const char *Namespace::Entry::execute(S32 argc, ConsoleValueRef *argv, ExprEvalState *state) +ConsoleValueRef Namespace::Entry::execute(S32 argc, ConsoleValueRef *argv, ExprEvalState *state) { + STR.clearFunctionOffset(); + if(mType == ConsoleFunctionType) { if(mFunctionOffset) + { return mCode->exec(mFunctionOffset, argv[0], mNamespace, argc, argv, false, mPackage); + } else - return ""; + { + return ConsoleValueRef(); + } } #ifndef TORQUE_DEBUG @@ -1354,7 +1390,7 @@ const char *Namespace::Entry::execute(S32 argc, ConsoleValueRef *argv, ExprEvalS if(mToolOnly && ! Con::isCurrentScriptToolScript()) { Con::errorf(ConsoleLogEntry::Script, "%s::%s - attempting to call tools only function from outside of tools", mNamespace->mName, mFunctionName); - return ""; + return ConsoleValueRef(); } #endif @@ -1362,32 +1398,26 @@ const char *Namespace::Entry::execute(S32 argc, ConsoleValueRef *argv, ExprEvalS { Con::warnf(ConsoleLogEntry::Script, "%s::%s - wrong number of arguments.", mNamespace->mName, mFunctionName); Con::warnf(ConsoleLogEntry::Script, "usage: %s", mUsage); - return ""; + return ConsoleValueRef(); } static char returnBuffer[32]; switch(mType) { case StringCallbackType: - return cb.mStringCallbackFunc(state->thisObject, argc, argv); + return ConsoleValueRef::fromValue(CSTK.pushStackString(cb.mStringCallbackFunc(state->thisObject, argc, argv))); case IntCallbackType: - dSprintf(returnBuffer, sizeof(returnBuffer), "%d", - cb.mIntCallbackFunc(state->thisObject, argc, argv)); - return returnBuffer; + return ConsoleValueRef::fromValue(CSTK.pushUINT((U32)cb.mBoolCallbackFunc(state->thisObject, argc, argv))); case FloatCallbackType: - dSprintf(returnBuffer, sizeof(returnBuffer), "%g", - cb.mFloatCallbackFunc(state->thisObject, argc, argv)); - return returnBuffer; + return ConsoleValueRef::fromValue(CSTK.pushFLT((U32)cb.mBoolCallbackFunc(state->thisObject, argc, argv))); case VoidCallbackType: cb.mVoidCallbackFunc(state->thisObject, argc, argv); - return ""; + return ConsoleValueRef(); case BoolCallbackType: - dSprintf(returnBuffer, sizeof(returnBuffer), "%d", - (U32)cb.mBoolCallbackFunc(state->thisObject, argc, argv)); - return returnBuffer; + return ConsoleValueRef::fromValue(CSTK.pushUINT((U32)cb.mBoolCallbackFunc(state->thisObject, argc, argv))); } - - return ""; + + return ConsoleValueRef(); } //----------------------------------------------------------------------------- diff --git a/Engine/source/console/consoleInternal.h b/Engine/source/console/consoleInternal.h index 23d3b2e95..35ebff800 100644 --- a/Engine/source/console/consoleInternal.h +++ b/Engine/source/console/consoleInternal.h @@ -151,7 +151,7 @@ class Namespace void clear(); /// - const char *execute( S32 argc, ConsoleValueRef* argv, ExprEvalState* state ); + ConsoleValueRef execute( S32 argc, ConsoleValueRef* argv, ExprEvalState* state ); /// Return a one-line documentation text string for the function. String getBriefDescription( String* outRemainingDocText = NULL ) const; @@ -367,6 +367,22 @@ public: notify->trigger(); } + void setStringStackPtrValue(StringStackPtr newValue) + { + if( mIsConstant ) + { + Con::errorf( "Cannot assign value to constant '%s'.", name ); + return; + } + + value.setStringStackPtrValue(newValue); + + + // Fire off the notification if we have one. + if ( notify ) + notify->trigger(); + } + void setStringValue(const char *newValue) { if( mIsConstant ) @@ -495,6 +511,7 @@ public: void setIntVariable(S32 val); void setFloatVariable(F64 val); void setStringVariable(const char *str); + void setStringStackPtrVariable(StringStackPtr str); void setCopyVariable(); void pushFrame(StringTableEntry frameName, Namespace *ns); diff --git a/Engine/source/console/engineAPI.h b/Engine/source/console/engineAPI.h index c61d2d1af..c2b940f01 100644 --- a/Engine/source/console/engineAPI.h +++ b/Engine/source/console/engineAPI.h @@ -53,6 +53,11 @@ #include "console/engineStructs.h" #endif +// Needed for the executef macros. Blame GCC. +#ifndef _SIMEVENTS_H_ +#include "console/simEvents.h" +#endif + /// @file /// Definitions for exposing engine functionality to the control layer. @@ -102,6 +107,10 @@ template<> struct EngineTypeTraits< const char* > : public EngineTypeTraits< Str template<> inline const EngineTypeInfo* TYPE< const char* >() { return TYPE< String >(); } + + + + /// @name Marshalling /// /// Functions for converting to/from string-based data representations. @@ -148,15 +157,15 @@ inline const char* EngineMarshallData( U32 value ) template< typename T > inline void EngineMarshallData( const T& arg, S32& argc, ConsoleValueRef *argv ) { - argv[ argc ] = Con::getStringArg( castConsoleTypeToString( arg ) ); + argv[ argc ] = castConsoleTypeToString( arg ); argc ++; } inline void EngineMarshallData( bool arg, S32& argc, ConsoleValueRef *argv ) { if( arg ) - argv[ argc ] = "1"; + argv[ argc ] = 1; else - argv[ argc ] = "0"; + argv[ argc ] = 0; argc ++; } inline void EngineMarshallData( S32 arg, S32& argc, ConsoleValueRef *argv ) @@ -178,16 +187,22 @@ inline void EngineMarshallData( const char* arg, S32& argc, ConsoleValueRef *arg argv[ argc ] = arg; argc ++; } +inline void EngineMarshallData( char* arg, S32& argc, ConsoleValueRef *argv ) +{ + argv[ argc ] = arg; + argc ++; +} + template< typename T > inline void EngineMarshallData( T* object, S32& argc, ConsoleValueRef *argv ) { - argv[ argc ] = ( object ? object->getIdString() : "0" ); + argv[ argc ] = object ? object->getId() : 0; argc ++; } template< typename T > inline void EngineMarshallData( const T* object, S32& argc, ConsoleValueRef *argv ) { - argv[ argc ] = ( object ? object->getIdString() : "0" ); + argv[ argc ] = object ? object->getId() : 0; argc ++; } @@ -260,6 +275,11 @@ struct EngineUnmarshallData< U8 > template<> struct EngineUnmarshallData< const char* > { + const char* operator()( ConsoleValueRef &ref ) const + { + return ref.getStringValue(); + } + const char* operator()( const char* str ) const { return str; @@ -268,6 +288,11 @@ struct EngineUnmarshallData< const char* > template< typename T > struct EngineUnmarshallData< T* > { + T* operator()( ConsoleValueRef &ref ) const + { + return dynamic_cast< T* >( Sim::findObject( ref.getStringValue() ) ); + } + T* operator()( const char* str ) const { return dynamic_cast< T* >( Sim::findObject( str ) ); @@ -276,9 +301,20 @@ struct EngineUnmarshallData< T* > template<> struct EngineUnmarshallData< void > { + void operator()( ConsoleValueRef& ) const {} void operator()( const char* ) const {} }; + +template<> +struct EngineUnmarshallData< ConsoleValueRef > +{ + ConsoleValueRef operator()( ConsoleValueRef ref ) const + { + return ref; + } +}; + /// @} @@ -302,20 +338,23 @@ struct _EngineTrampoline { struct Args {}; }; + template< typename R, typename A > struct _EngineTrampoline< R( A ) > { struct Args { char data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) ]; - + typename EngineTypeTraits< A >::ValueType a() const { return EngineTypeTraits< A >::ArgumentToValue( - *( reinterpret_cast< const typename EngineTypeTraits< A >::ArgumentValueType* >( &data[ 0 ] ) ) ); + *( reinterpret_cast< const typename EngineTypeTraits< A >::ArgumentValueType* > + ( &data[ 0 ] ) ) ); } }; }; + template< typename R, typename A, typename B > struct _EngineTrampoline< R( A, B ) > { @@ -327,8 +366,10 @@ struct _EngineTrampoline< R( A, B ) > typename EngineTypeTraits< A >::ValueType a() const { return EngineTypeTraits< A >::ArgumentToValue( - *( reinterpret_cast< const typename EngineTypeTraits< A >::ArgumentValueType* >( &data[ 0 ] ) ) ); + *( reinterpret_cast< const typename EngineTypeTraits< A >::ArgumentValueType* > + ( &data[ 0 ] ) ) ); } + typename EngineTypeTraits< B >::ValueType b() const { return EngineTypeTraits< B >::ArgumentToValue( @@ -337,6 +378,7 @@ struct _EngineTrampoline< R( A, B ) > } }; }; + template< typename R, typename A, typename B, typename C > struct _EngineTrampoline< R( A, B, C ) > { @@ -349,14 +391,17 @@ struct _EngineTrampoline< R( A, B, C ) > typename EngineTypeTraits< A >::ValueType a() const { return EngineTypeTraits< A >::ArgumentToValue( - *( reinterpret_cast< const typename EngineTypeTraits< A >::ArgumentValueType* >( &data[ 0 ] ) ) ); + *( reinterpret_cast< const typename EngineTypeTraits< A >::ArgumentValueType* > + ( &data[ 0 ] ) ) ); } + typename EngineTypeTraits< B >::ValueType b() const { return EngineTypeTraits< B >::ArgumentToValue( *( reinterpret_cast< const typename EngineTypeTraits< B >::ArgumentValueType* > ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) ] ) ) ); } + typename EngineTypeTraits< C >::ValueType c() const { return EngineTypeTraits< C >::ArgumentToValue( @@ -366,6 +411,7 @@ struct _EngineTrampoline< R( A, B, C ) > } }; }; + template< typename R, typename A, typename B, typename C, typename D > struct _EngineTrampoline< R( A, B, C, D ) > { @@ -379,14 +425,17 @@ struct _EngineTrampoline< R( A, B, C, D ) > typename EngineTypeTraits< A >::ValueType a() const { return EngineTypeTraits< A >::ArgumentToValue( - *( reinterpret_cast< const typename EngineTypeTraits< A >::ArgumentValueType* >( &data[ 0 ] ) ) ); + *( reinterpret_cast< const typename EngineTypeTraits< A >::ArgumentValueType* > + ( &data[ 0 ] ) ) ); } + typename EngineTypeTraits< B >::ValueType b() const { return EngineTypeTraits< B >::ArgumentToValue( *( reinterpret_cast< const typename EngineTypeTraits< B >::ArgumentValueType* > ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) ] ) ) ); } + typename EngineTypeTraits< C >::ValueType c() const { return EngineTypeTraits< C >::ArgumentToValue( @@ -394,6 +443,7 @@ struct _EngineTrampoline< R( A, B, C, D ) > ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) + sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) ] ) ) ); } + typename EngineTypeTraits< D >::ValueType d() const { return EngineTypeTraits< D >::ArgumentToValue( @@ -404,6 +454,7 @@ struct _EngineTrampoline< R( A, B, C, D ) > } }; }; + template< typename R, typename A, typename B, typename C, typename D, typename E > struct _EngineTrampoline< R( A, B, C, D, E ) > { @@ -418,14 +469,17 @@ struct _EngineTrampoline< R( A, B, C, D, E ) > typename EngineTypeTraits< A >::ValueType a() const { return EngineTypeTraits< A >::ArgumentToValue( - *( reinterpret_cast< const typename EngineTypeTraits< A >::ArgumentValueType* >( &data[ 0 ] ) ) ); + *( reinterpret_cast< const typename EngineTypeTraits< A >::ArgumentValueType* > + ( &data[ 0 ] ) ) ); } + typename EngineTypeTraits< B >::ValueType b() const { return EngineTypeTraits< B >::ArgumentToValue( *( reinterpret_cast< const typename EngineTypeTraits< B >::ArgumentValueType* > ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) ] ) ) ); } + typename EngineTypeTraits< C >::ValueType c() const { return EngineTypeTraits< C >::ArgumentToValue( @@ -433,6 +487,7 @@ struct _EngineTrampoline< R( A, B, C, D, E ) > ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) + sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) ] ) ) ); } + typename EngineTypeTraits< D >::ValueType d() const { return EngineTypeTraits< D >::ArgumentToValue( @@ -441,6 +496,7 @@ struct _EngineTrampoline< R( A, B, C, D, E ) > sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) + sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) ] ) ) ); } + typename EngineTypeTraits< E >::ValueType e() const { return EngineTypeTraits< E >::ArgumentToValue( @@ -452,6 +508,7 @@ struct _EngineTrampoline< R( A, B, C, D, E ) > } }; }; + template< typename R, typename A, typename B, typename C, typename D, typename E, typename F > struct _EngineTrampoline< R( A, B, C, D, E, F ) > { @@ -467,14 +524,17 @@ struct _EngineTrampoline< R( A, B, C, D, E, F ) > typename EngineTypeTraits< A >::ValueType a() const { return EngineTypeTraits< A >::ArgumentToValue( - *( reinterpret_cast< const typename EngineTypeTraits< A >::ArgumentValueType* >( &data[ 0 ] ) ) ); + *( reinterpret_cast< const typename EngineTypeTraits< A >::ArgumentValueType* > + ( &data[ 0 ] ) ) ); } + typename EngineTypeTraits< B >::ValueType b() const { return EngineTypeTraits< B >::ArgumentToValue( *( reinterpret_cast< const typename EngineTypeTraits< B >::ArgumentValueType* > ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) ] ) ) ); } + typename EngineTypeTraits< C >::ValueType c() const { return EngineTypeTraits< C >::ArgumentToValue( @@ -482,6 +542,7 @@ struct _EngineTrampoline< R( A, B, C, D, E, F ) > ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) + sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) ] ) ) ); } + typename EngineTypeTraits< D >::ValueType d() const { return EngineTypeTraits< D >::ArgumentToValue( @@ -490,6 +551,7 @@ struct _EngineTrampoline< R( A, B, C, D, E, F ) > sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) + sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) ] ) ) ); } + typename EngineTypeTraits< E >::ValueType e() const { return EngineTypeTraits< E >::ArgumentToValue( @@ -499,6 +561,7 @@ struct _EngineTrampoline< R( A, B, C, D, E, F ) > sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) + sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) ] ) ) ); } + typename EngineTypeTraits< F >::ValueType f() const { return EngineTypeTraits< F >::ArgumentToValue( @@ -511,6 +574,7 @@ struct _EngineTrampoline< R( A, B, C, D, E, F ) > } }; }; + template< typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G > struct _EngineTrampoline< R( A, B, C, D, E, F, G ) > { @@ -527,14 +591,17 @@ struct _EngineTrampoline< R( A, B, C, D, E, F, G ) > typename EngineTypeTraits< A >::ValueType a() const { return EngineTypeTraits< A >::ArgumentToValue( - *( reinterpret_cast< const typename EngineTypeTraits< A >::ArgumentValueType* >( &data[ 0 ] ) ) ); + *( reinterpret_cast< const typename EngineTypeTraits< A >::ArgumentValueType* > + ( &data[ 0 ] ) ) ); } + typename EngineTypeTraits< B >::ValueType b() const { return EngineTypeTraits< B >::ArgumentToValue( *( reinterpret_cast< const typename EngineTypeTraits< B >::ArgumentValueType* > ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) ] ) ) ); } + typename EngineTypeTraits< C >::ValueType c() const { return EngineTypeTraits< C >::ArgumentToValue( @@ -542,6 +609,7 @@ struct _EngineTrampoline< R( A, B, C, D, E, F, G ) > ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) + sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) ] ) ) ); } + typename EngineTypeTraits< D >::ValueType d() const { return EngineTypeTraits< D >::ArgumentToValue( @@ -550,6 +618,7 @@ struct _EngineTrampoline< R( A, B, C, D, E, F, G ) > sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) + sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) ] ) ) ); } + typename EngineTypeTraits< E >::ValueType e() const { return EngineTypeTraits< E >::ArgumentToValue( @@ -559,6 +628,7 @@ struct _EngineTrampoline< R( A, B, C, D, E, F, G ) > sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) + sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) ] ) ) ); } + typename EngineTypeTraits< F >::ValueType f() const { return EngineTypeTraits< F >::ArgumentToValue( @@ -569,6 +639,7 @@ struct _EngineTrampoline< R( A, B, C, D, E, F, G ) > sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) + sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) ] ) ) ); } + typename EngineTypeTraits< G >::ValueType g() const { return EngineTypeTraits< G >::ArgumentToValue( @@ -582,6 +653,7 @@ struct _EngineTrampoline< R( A, B, C, D, E, F, G ) > } }; }; + template< typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H > struct _EngineTrampoline< R( A, B, C, D, E, F, G, H ) > { @@ -599,14 +671,17 @@ struct _EngineTrampoline< R( A, B, C, D, E, F, G, H ) > typename EngineTypeTraits< A >::ValueType a() const { return EngineTypeTraits< A >::ArgumentToValue( - *( reinterpret_cast< const typename EngineTypeTraits< A >::ArgumentValueType* >( &data[ 0 ] ) ) ); + *( reinterpret_cast< const typename EngineTypeTraits< A >::ArgumentValueType* > + ( &data[ 0 ] ) ) ); } + typename EngineTypeTraits< B >::ValueType b() const { return EngineTypeTraits< B >::ArgumentToValue( *( reinterpret_cast< const typename EngineTypeTraits< B >::ArgumentValueType* > ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) ] ) ) ); } + typename EngineTypeTraits< C >::ValueType c() const { return EngineTypeTraits< C >::ArgumentToValue( @@ -614,6 +689,7 @@ struct _EngineTrampoline< R( A, B, C, D, E, F, G, H ) > ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) + sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) ] ) ) ); } + typename EngineTypeTraits< D >::ValueType d() const { return EngineTypeTraits< D >::ArgumentToValue( @@ -622,6 +698,7 @@ struct _EngineTrampoline< R( A, B, C, D, E, F, G, H ) > sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) + sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) ] ) ) ); } + typename EngineTypeTraits< E >::ValueType e() const { return EngineTypeTraits< E >::ArgumentToValue( @@ -631,6 +708,7 @@ struct _EngineTrampoline< R( A, B, C, D, E, F, G, H ) > sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) + sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) ] ) ) ); } + typename EngineTypeTraits< F >::ValueType f() const { return EngineTypeTraits< F >::ArgumentToValue( @@ -641,6 +719,7 @@ struct _EngineTrampoline< R( A, B, C, D, E, F, G, H ) > sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) + sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) ] ) ) ); } + typename EngineTypeTraits< G >::ValueType g() const { return EngineTypeTraits< G >::ArgumentToValue( @@ -652,6 +731,7 @@ struct _EngineTrampoline< R( A, B, C, D, E, F, G, H ) > sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) + sizeof( typename EngineTypeTraits< F >::ArgumentValueType ) ] ) ) ); } + typename EngineTypeTraits< H >::ValueType h() const { return EngineTypeTraits< H >::ArgumentToValue( @@ -666,6 +746,7 @@ struct _EngineTrampoline< R( A, B, C, D, E, F, G, H ) > } }; }; + template< typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I > struct _EngineTrampoline< R( A, B, C, D, E, F, G, H, I ) > { @@ -684,14 +765,17 @@ struct _EngineTrampoline< R( A, B, C, D, E, F, G, H, I ) > typename EngineTypeTraits< A >::ValueType a() const { return EngineTypeTraits< A >::ArgumentToValue( - *( reinterpret_cast< const typename EngineTypeTraits< A >::ArgumentValueType* >( &data[ 0 ] ) ) ); + *( reinterpret_cast< const typename EngineTypeTraits< A >::ArgumentValueType* > + ( &data[ 0 ] ) ) ); } + typename EngineTypeTraits< B >::ValueType b() const { return EngineTypeTraits< B >::ArgumentToValue( *( reinterpret_cast< const typename EngineTypeTraits< B >::ArgumentValueType* > ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) ] ) ) ); } + typename EngineTypeTraits< C >::ValueType c() const { return EngineTypeTraits< C >::ArgumentToValue( @@ -699,6 +783,7 @@ struct _EngineTrampoline< R( A, B, C, D, E, F, G, H, I ) > ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) + sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) ] ) ) ); } + typename EngineTypeTraits< D >::ValueType d() const { return EngineTypeTraits< D >::ArgumentToValue( @@ -707,6 +792,7 @@ struct _EngineTrampoline< R( A, B, C, D, E, F, G, H, I ) > sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) + sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) ] ) ) ); } + typename EngineTypeTraits< E >::ValueType e() const { return EngineTypeTraits< E >::ArgumentToValue( @@ -716,6 +802,7 @@ struct _EngineTrampoline< R( A, B, C, D, E, F, G, H, I ) > sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) + sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) ] ) ) ); } + typename EngineTypeTraits< F >::ValueType f() const { return EngineTypeTraits< F >::ArgumentToValue( @@ -726,6 +813,7 @@ struct _EngineTrampoline< R( A, B, C, D, E, F, G, H, I ) > sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) + sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) ] ) ) ); } + typename EngineTypeTraits< G >::ValueType g() const { return EngineTypeTraits< G >::ArgumentToValue( @@ -737,6 +825,7 @@ struct _EngineTrampoline< R( A, B, C, D, E, F, G, H, I ) > sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) + sizeof( typename EngineTypeTraits< F >::ArgumentValueType ) ] ) ) ); } + typename EngineTypeTraits< H >::ValueType h() const { return EngineTypeTraits< H >::ArgumentToValue( @@ -749,6 +838,7 @@ struct _EngineTrampoline< R( A, B, C, D, E, F, G, H, I ) > sizeof( typename EngineTypeTraits< F >::ArgumentValueType ) + sizeof( typename EngineTypeTraits< G >::ArgumentValueType ) ] ) ) ); } + typename EngineTypeTraits< I >::ValueType i() const { return EngineTypeTraits< I >::ArgumentToValue( @@ -764,6 +854,7 @@ struct _EngineTrampoline< R( A, B, C, D, E, F, G, H, I ) > } }; }; + template< typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I, typename J > struct _EngineTrampoline< R( A, B, C, D, E, F, G, H, I, J ) > { @@ -783,14 +874,17 @@ struct _EngineTrampoline< R( A, B, C, D, E, F, G, H, I, J ) > typename EngineTypeTraits< A >::ValueType a() const { return EngineTypeTraits< A >::ArgumentToValue( - *( reinterpret_cast< const typename EngineTypeTraits< A >::ArgumentValueType* >( &data[ 0 ] ) ) ); + *( reinterpret_cast< const typename EngineTypeTraits< A >::ArgumentValueType* > + ( &data[ 0 ] ) ) ); } + typename EngineTypeTraits< B >::ValueType b() const { return EngineTypeTraits< B >::ArgumentToValue( *( reinterpret_cast< const typename EngineTypeTraits< B >::ArgumentValueType* > ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) ] ) ) ); } + typename EngineTypeTraits< C >::ValueType c() const { return EngineTypeTraits< C >::ArgumentToValue( @@ -798,6 +892,7 @@ struct _EngineTrampoline< R( A, B, C, D, E, F, G, H, I, J ) > ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) + sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) ] ) ) ); } + typename EngineTypeTraits< D >::ValueType d() const { return EngineTypeTraits< D >::ArgumentToValue( @@ -806,6 +901,7 @@ struct _EngineTrampoline< R( A, B, C, D, E, F, G, H, I, J ) > sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) + sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) ] ) ) ); } + typename EngineTypeTraits< E >::ValueType e() const { return EngineTypeTraits< E >::ArgumentToValue( @@ -815,6 +911,7 @@ struct _EngineTrampoline< R( A, B, C, D, E, F, G, H, I, J ) > sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) + sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) ] ) ) ); } + typename EngineTypeTraits< F >::ValueType f() const { return EngineTypeTraits< F >::ArgumentToValue( @@ -825,6 +922,7 @@ struct _EngineTrampoline< R( A, B, C, D, E, F, G, H, I, J ) > sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) + sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) ] ) ) ); } + typename EngineTypeTraits< G >::ValueType g() const { return EngineTypeTraits< G >::ArgumentToValue( @@ -836,6 +934,7 @@ struct _EngineTrampoline< R( A, B, C, D, E, F, G, H, I, J ) > sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) + sizeof( typename EngineTypeTraits< F >::ArgumentValueType ) ] ) ) ); } + typename EngineTypeTraits< H >::ValueType h() const { return EngineTypeTraits< H >::ArgumentToValue( @@ -848,6 +947,7 @@ struct _EngineTrampoline< R( A, B, C, D, E, F, G, H, I, J ) > sizeof( typename EngineTypeTraits< F >::ArgumentValueType ) + sizeof( typename EngineTypeTraits< G >::ArgumentValueType ) ] ) ) ); } + typename EngineTypeTraits< I >::ValueType i() const { return EngineTypeTraits< I >::ArgumentToValue( @@ -861,6 +961,7 @@ struct _EngineTrampoline< R( A, B, C, D, E, F, G, H, I, J ) > sizeof( typename EngineTypeTraits< G >::ArgumentValueType ) + sizeof( typename EngineTypeTraits< H >::ArgumentValueType ) ] ) ) ); } + typename EngineTypeTraits< J >::ValueType j() const { return EngineTypeTraits< J >::ArgumentToValue( @@ -877,6 +978,7 @@ struct _EngineTrampoline< R( A, B, C, D, E, F, G, H, I, J ) > } }; }; + 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 > struct _EngineTrampoline< R( A, B, C, D, E, F, G, H, I, J, K ) > { @@ -897,14 +999,17 @@ struct _EngineTrampoline< R( A, B, C, D, E, F, G, H, I, J, K ) > typename EngineTypeTraits< A >::ValueType a() const { return EngineTypeTraits< A >::ArgumentToValue( - *( reinterpret_cast< const typename EngineTypeTraits< A >::ArgumentValueType* >( &data[ 0 ] ) ) ); + *( reinterpret_cast< const typename EngineTypeTraits< A >::ArgumentValueType* > + ( &data[ 0 ] ) ) ); } + typename EngineTypeTraits< B >::ValueType b() const { return EngineTypeTraits< B >::ArgumentToValue( *( reinterpret_cast< const typename EngineTypeTraits< B >::ArgumentValueType* > ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) ] ) ) ); } + typename EngineTypeTraits< C >::ValueType c() const { return EngineTypeTraits< C >::ArgumentToValue( @@ -912,6 +1017,7 @@ struct _EngineTrampoline< R( A, B, C, D, E, F, G, H, I, J, K ) > ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) + sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) ] ) ) ); } + typename EngineTypeTraits< D >::ValueType d() const { return EngineTypeTraits< D >::ArgumentToValue( @@ -920,6 +1026,7 @@ struct _EngineTrampoline< R( A, B, C, D, E, F, G, H, I, J, K ) > sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) + sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) ] ) ) ); } + typename EngineTypeTraits< E >::ValueType e() const { return EngineTypeTraits< E >::ArgumentToValue( @@ -929,6 +1036,7 @@ struct _EngineTrampoline< R( A, B, C, D, E, F, G, H, I, J, K ) > sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) + sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) ] ) ) ); } + typename EngineTypeTraits< F >::ValueType f() const { return EngineTypeTraits< F >::ArgumentToValue( @@ -939,6 +1047,7 @@ struct _EngineTrampoline< R( A, B, C, D, E, F, G, H, I, J, K ) > sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) + sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) ] ) ) ); } + typename EngineTypeTraits< G >::ValueType g() const { return EngineTypeTraits< G >::ArgumentToValue( @@ -950,6 +1059,7 @@ struct _EngineTrampoline< R( A, B, C, D, E, F, G, H, I, J, K ) > sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) + sizeof( typename EngineTypeTraits< F >::ArgumentValueType ) ] ) ) ); } + typename EngineTypeTraits< H >::ValueType h() const { return EngineTypeTraits< H >::ArgumentToValue( @@ -962,6 +1072,7 @@ struct _EngineTrampoline< R( A, B, C, D, E, F, G, H, I, J, K ) > sizeof( typename EngineTypeTraits< F >::ArgumentValueType ) + sizeof( typename EngineTypeTraits< G >::ArgumentValueType ) ] ) ) ); } + typename EngineTypeTraits< I >::ValueType i() const { return EngineTypeTraits< I >::ArgumentToValue( @@ -975,6 +1086,7 @@ struct _EngineTrampoline< R( A, B, C, D, E, F, G, H, I, J, K ) > sizeof( typename EngineTypeTraits< G >::ArgumentValueType ) + sizeof( typename EngineTypeTraits< H >::ArgumentValueType ) ] ) ) ); } + typename EngineTypeTraits< J >::ValueType j() const { return EngineTypeTraits< J >::ArgumentToValue( @@ -989,6 +1101,7 @@ struct _EngineTrampoline< R( A, B, C, D, E, F, G, H, I, J, K ) > sizeof( typename EngineTypeTraits< H >::ArgumentValueType ) + sizeof( typename EngineTypeTraits< I >::ArgumentValueType ) ] ) ) ); } + typename EngineTypeTraits< K >::ValueType k() const { return EngineTypeTraits< K >::ArgumentToValue( @@ -1007,6 +1120,166 @@ struct _EngineTrampoline< R( A, B, C, D, E, F, G, H, I, J, K ) > }; }; +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 > +struct _EngineTrampoline< R( A, B, C, D, E, F, G, H, I, J, K, L ) > +{ + struct Args + { + char data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) + + sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) + + sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) + + sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) + + sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) + + sizeof( typename EngineTypeTraits< F >::ArgumentValueType ) + + sizeof( typename EngineTypeTraits< G >::ArgumentValueType ) + + sizeof( typename EngineTypeTraits< H >::ArgumentValueType ) + + sizeof( typename EngineTypeTraits< I >::ArgumentValueType ) + + sizeof( typename EngineTypeTraits< J >::ArgumentValueType ) + + sizeof( typename EngineTypeTraits< K >::ArgumentValueType ) + + sizeof( typename EngineTypeTraits< L >::ArgumentValueType ) ]; + + typename EngineTypeTraits< A >::ValueType a() const + { + return EngineTypeTraits< A >::ArgumentToValue( + *( reinterpret_cast< const typename EngineTypeTraits< A >::ArgumentValueType* > + ( &data[ 0 ] ) ) ); + } + + typename EngineTypeTraits< B >::ValueType b() const + { + return EngineTypeTraits< B >::ArgumentToValue( + *( reinterpret_cast< const typename EngineTypeTraits< B >::ArgumentValueType* > + ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) ] ) ) ); + } + + typename EngineTypeTraits< C >::ValueType c() const + { + return EngineTypeTraits< C >::ArgumentToValue( + *( reinterpret_cast< const typename EngineTypeTraits< C >::ArgumentValueType* > + ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) + + sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) ] ) ) ); + } + + typename EngineTypeTraits< D >::ValueType d() const + { + return EngineTypeTraits< D >::ArgumentToValue( + *( reinterpret_cast< const typename EngineTypeTraits< D >::ArgumentValueType* > + ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) + + sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) + + sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) ] ) ) ); + } + + typename EngineTypeTraits< E >::ValueType e() const + { + return EngineTypeTraits< E >::ArgumentToValue( + *( reinterpret_cast< const typename EngineTypeTraits< E >::ArgumentValueType* > + ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) + + sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) + + sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) + + sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) ] ) ) ); + } + + typename EngineTypeTraits< F >::ValueType f() const + { + return EngineTypeTraits< F >::ArgumentToValue( + *( reinterpret_cast< const typename EngineTypeTraits< F >::ArgumentValueType* > + ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) + + sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) + + sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) + + sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) + + sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) ] ) ) ); + } + + typename EngineTypeTraits< G >::ValueType g() const + { + return EngineTypeTraits< G >::ArgumentToValue( + *( reinterpret_cast< const typename EngineTypeTraits< G >::ArgumentValueType* > + ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) + + sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) + + sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) + + sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) + + sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) + + sizeof( typename EngineTypeTraits< F >::ArgumentValueType ) ] ) ) ); + } + + typename EngineTypeTraits< H >::ValueType h() const + { + return EngineTypeTraits< H >::ArgumentToValue( + *( reinterpret_cast< const typename EngineTypeTraits< H >::ArgumentValueType* > + ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) + + sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) + + sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) + + sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) + + sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) + + sizeof( typename EngineTypeTraits< F >::ArgumentValueType ) + + sizeof( typename EngineTypeTraits< G >::ArgumentValueType ) ] ) ) ); + } + + typename EngineTypeTraits< I >::ValueType i() const + { + return EngineTypeTraits< I >::ArgumentToValue( + *( reinterpret_cast< const typename EngineTypeTraits< I >::ArgumentValueType* > + ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) + + sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) + + sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) + + sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) + + sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) + + sizeof( typename EngineTypeTraits< F >::ArgumentValueType ) + + sizeof( typename EngineTypeTraits< G >::ArgumentValueType ) + + sizeof( typename EngineTypeTraits< H >::ArgumentValueType ) ] ) ) ); + } + + typename EngineTypeTraits< J >::ValueType j() const + { + return EngineTypeTraits< J >::ArgumentToValue( + *( reinterpret_cast< const typename EngineTypeTraits< J >::ArgumentValueType* > + ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) + + sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) + + sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) + + sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) + + sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) + + sizeof( typename EngineTypeTraits< F >::ArgumentValueType ) + + sizeof( typename EngineTypeTraits< G >::ArgumentValueType ) + + sizeof( typename EngineTypeTraits< H >::ArgumentValueType ) + + sizeof( typename EngineTypeTraits< I >::ArgumentValueType ) ] ) ) ); + } + + typename EngineTypeTraits< K >::ValueType k() const + { + return EngineTypeTraits< K >::ArgumentToValue( + *( reinterpret_cast< const typename EngineTypeTraits< K >::ArgumentValueType* > + ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) + + sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) + + sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) + + sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) + + sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) + + sizeof( typename EngineTypeTraits< F >::ArgumentValueType ) + + sizeof( typename EngineTypeTraits< G >::ArgumentValueType ) + + sizeof( typename EngineTypeTraits< H >::ArgumentValueType ) + + sizeof( typename EngineTypeTraits< I >::ArgumentValueType ) + + sizeof( typename EngineTypeTraits< J >::ArgumentValueType ) ] ) ) ); + } + + typename EngineTypeTraits< L >::ValueType l() const + { + return EngineTypeTraits< L >::ArgumentToValue( + *( reinterpret_cast< const typename EngineTypeTraits< L >::ArgumentValueType* > + ( &data[ sizeof( typename EngineTypeTraits< A >::ArgumentValueType ) + + sizeof( typename EngineTypeTraits< B >::ArgumentValueType ) + + sizeof( typename EngineTypeTraits< C >::ArgumentValueType ) + + sizeof( typename EngineTypeTraits< D >::ArgumentValueType ) + + sizeof( typename EngineTypeTraits< E >::ArgumentValueType ) + + sizeof( typename EngineTypeTraits< F >::ArgumentValueType ) + + sizeof( typename EngineTypeTraits< G >::ArgumentValueType ) + + sizeof( typename EngineTypeTraits< H >::ArgumentValueType ) + + sizeof( typename EngineTypeTraits< I >::ArgumentValueType ) + + sizeof( typename EngineTypeTraits< J >::ArgumentValueType ) + + sizeof( typename EngineTypeTraits< K >::ArgumentValueType ) ] ) ) ); + } + }; +}; + + template< typename T > struct _EngineFunctionTrampolineBase : public _EngineTrampoline< T > { @@ -1025,6 +1298,8 @@ struct _EngineFunctionTrampoline< R() > : public _EngineFunctionTrampolineBase< return R( fn() ); } }; + + template< typename R, typename A > struct _EngineFunctionTrampoline< R( A ) > : public _EngineFunctionTrampolineBase< R( A ) > { @@ -1033,6 +1308,7 @@ struct _EngineFunctionTrampoline< R( A ) > : public _EngineFunctionTrampolineBas return R( fn( args.a() ) ); } }; + template< typename R, typename A, typename B > struct _EngineFunctionTrampoline< R( A, B ) > : public _EngineFunctionTrampolineBase< R( A, B ) > { @@ -1041,6 +1317,7 @@ struct _EngineFunctionTrampoline< R( A, B ) > : public _EngineFunctionTrampoline return R( fn( args.a(), args.b() ) ); } }; + template< typename R, typename A, typename B, typename C > struct _EngineFunctionTrampoline< R( A, B, C ) > : public _EngineFunctionTrampolineBase< R( A, B, C ) > { @@ -1049,6 +1326,7 @@ struct _EngineFunctionTrampoline< R( A, B, C ) > : public _EngineFunctionTrampol return R( fn( args.a(), args.b(), args.c() ) ); } }; + template< typename R, typename A, typename B, typename C, typename D > struct _EngineFunctionTrampoline< R( A, B, C, D ) > : public _EngineFunctionTrampolineBase< R( A, B, C, D ) > { @@ -1057,6 +1335,7 @@ struct _EngineFunctionTrampoline< R( A, B, C, D ) > : public _EngineFunctionTram return R( fn( args.a(), args.b(), args.c(), args.d() ) ); } }; + template< typename R, typename A, typename B, typename C, typename D, typename E > struct _EngineFunctionTrampoline< R( A, B, C, D, E ) > : public _EngineFunctionTrampolineBase< R( A, B, C, D, E ) > { @@ -1065,6 +1344,7 @@ struct _EngineFunctionTrampoline< R( A, B, C, D, E ) > : public _EngineFunctionT return R( fn( args.a(), args.b(), args.c(), args.d(), args.e() ) ); } }; + template< typename R, typename A, typename B, typename C, typename D, typename E, typename F > struct _EngineFunctionTrampoline< R( A, B, C, D, E, F ) > : public _EngineFunctionTrampolineBase< R( A, B, C, D, E, F ) > { @@ -1073,6 +1353,7 @@ struct _EngineFunctionTrampoline< R( A, B, C, D, E, F ) > : public _EngineFuncti return R( fn( args.a(), args.b(), args.c(), args.d(), args.e(), args.f() ) ); } }; + template< typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G > struct _EngineFunctionTrampoline< R( A, B, C, D, E, F, G ) > : public _EngineFunctionTrampolineBase< R( A, B, C, D, E, F, G ) > { @@ -1081,6 +1362,7 @@ struct _EngineFunctionTrampoline< R( A, B, C, D, E, F, G ) > : public _EngineFun return R( fn( args.a(), args.b(), args.c(), args.d(), args.e(), args.f(), args.g() ) ); } }; + template< typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H > struct _EngineFunctionTrampoline< R( A, B, C, D, E, F, G, H ) > : public _EngineFunctionTrampolineBase< R( A, B, C, D, E, F, G, H ) > { @@ -1089,6 +1371,7 @@ struct _EngineFunctionTrampoline< R( A, B, C, D, E, F, G, H ) > : public _Engine return R( fn( args.a(), args.b(), args.c(), args.d(), args.e(), args.f(), args.g(), args.h() ) ); } }; + template< typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I > struct _EngineFunctionTrampoline< R( A, B, C, D, E, F, G, H, I ) > : public _EngineFunctionTrampolineBase< R( A, B, C, D, E, F, G, H, I ) > { @@ -1097,6 +1380,7 @@ struct _EngineFunctionTrampoline< R( A, B, C, D, E, F, G, H, I ) > : public _Eng return R( fn( args.a(), args.b(), args.c(), args.d(), args.e(), args.f(), args.g(), args.h(), args.i() ) ); } }; + template< typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I, typename J > 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 ) > { @@ -1105,6 +1389,7 @@ struct _EngineFunctionTrampoline< R( A, B, C, D, E, F, G, H, I, J ) > : public _ return R( fn( args.a(), args.b(), args.c(), args.d(), args.e(), args.f(), args.g(), args.h(), args.i(), args.j() ) ); } }; + 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 > 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 ) > { @@ -1114,6 +1399,18 @@ struct _EngineFunctionTrampoline< R( A, B, C, D, E, F, G, H, I, J, K ) > : publi } }; +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 > +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 ) > +{ + 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 ) + { + 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() ) ); + } +}; + + +// Trampolines for engine methods + template< typename T > struct _EngineMethodTrampolineBase : public _EngineTrampoline< T > {}; @@ -1131,6 +1428,8 @@ struct _EngineMethodTrampoline< Frame, R() > : public _EngineMethodTrampolineBas return R( f._exec() ); } }; + + template< typename Frame, typename R, typename A > struct _EngineMethodTrampoline< Frame, R( A ) > : public _EngineMethodTrampolineBase< R( A ) > { @@ -1142,6 +1441,7 @@ struct _EngineMethodTrampoline< Frame, R( A ) > : public _EngineMethodTrampoline return R( f._exec( args.a() ) ); } }; + template< typename Frame, typename R, typename A, typename B > struct _EngineMethodTrampoline< Frame, R( A, B ) > : public _EngineMethodTrampolineBase< R( A, B ) > { @@ -1153,6 +1453,7 @@ struct _EngineMethodTrampoline< Frame, R( A, B ) > : public _EngineMethodTrampol return R( f._exec( args.a(), args.b() ) ); } }; + template< typename Frame, typename R, typename A, typename B, typename C > struct _EngineMethodTrampoline< Frame, R( A, B, C ) > : public _EngineMethodTrampolineBase< R( A, B, C ) > { @@ -1164,6 +1465,7 @@ struct _EngineMethodTrampoline< Frame, R( A, B, C ) > : public _EngineMethodTram return R( f._exec( args.a(), args.b(), args.c() ) ); } }; + template< typename Frame, typename R, typename A, typename B, typename C, typename D > struct _EngineMethodTrampoline< Frame, R( A, B, C, D ) > : public _EngineMethodTrampolineBase< R( A, B, C, D ) > { @@ -1175,6 +1477,7 @@ struct _EngineMethodTrampoline< Frame, R( A, B, C, D ) > : public _EngineMethodT return R( f._exec( args.a(), args.b(), args.c(), args.d() ) ); } }; + template< typename Frame, typename R, typename A, typename B, typename C, typename D, typename E > struct _EngineMethodTrampoline< Frame, R( A, B, C, D, E ) > : public _EngineMethodTrampolineBase< R( A, B, C, D, E ) > { @@ -1186,6 +1489,7 @@ struct _EngineMethodTrampoline< Frame, R( A, B, C, D, E ) > : public _EngineMeth return R( f._exec( args.a(), args.b(), args.c(), args.d(), args.e() ) ); } }; + template< typename Frame, typename R, typename A, typename B, typename C, typename D, typename E, typename F > struct _EngineMethodTrampoline< Frame, R( A, B, C, D, E, F ) > : public _EngineMethodTrampolineBase< R( A, B, C, D, E, F ) > { @@ -1197,6 +1501,7 @@ struct _EngineMethodTrampoline< Frame, R( A, B, C, D, E, F ) > : public _EngineM return R( f._exec( args.a(), args.b(), args.c(), args.d(), args.e(), args.f() ) ); } }; + template< typename Frame, typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G > struct _EngineMethodTrampoline< Frame, R( A, B, C, D, E, F, G ) > : public _EngineMethodTrampolineBase< R( A, B, C, D, E, F, G ) > { @@ -1208,6 +1513,7 @@ struct _EngineMethodTrampoline< Frame, R( A, B, C, D, E, F, G ) > : public _Engi return R( f._exec( args.a(), args.b(), args.c(), args.d(), args.e(), args.f(), args.g() ) ); } }; + template< typename Frame, typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H > struct _EngineMethodTrampoline< Frame, R( A, B, C, D, E, F, G, H ) > : public _EngineMethodTrampolineBase< R( A, B, C, D, E, F, G, H ) > { @@ -1219,6 +1525,7 @@ struct _EngineMethodTrampoline< Frame, R( A, B, C, D, E, F, G, H ) > : public _E return R( f._exec( args.a(), args.b(), args.c(), args.d(), args.e(), args.f(), args.g(), args.h() ) ); } }; + template< typename Frame, typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I > 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 ) > { @@ -1230,6 +1537,7 @@ struct _EngineMethodTrampoline< Frame, R( A, B, C, D, E, F, G, H, I ) > : public return R( f._exec( args.a(), args.b(), args.c(), args.d(), args.e(), args.f(), args.g(), args.h(), args.i() ) ); } }; + 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 > 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 ) > { @@ -1241,6 +1549,7 @@ struct _EngineMethodTrampoline< Frame, R( A, B, C, D, E, F, G, H, I, J ) > : pub return R( f._exec( args.a(), args.b(), args.c(), args.d(), args.e(), args.f(), args.g(), args.h(), args.i(), args.j() ) ); } }; + 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 > 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 ) > { @@ -1253,6 +1562,20 @@ struct _EngineMethodTrampoline< Frame, R( A, B, C, D, E, F, G, H, I, J, K ) > : } }; +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 > +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 ) > +{ + typedef R( FunctionType )( typename Frame::ObjectType*, A, B, C, D, E, F, G, H, I, J, K, L ); + 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 ) + { + Frame f; + f.object = object; + 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() ) ); + } +}; + + + /// @} @@ -1347,61 +1670,79 @@ struct _EngineConsoleThunkType< void > // The setup through operator () allows omitting the the argument list entirely. struct _EngineConsoleThunkCountArgs { + template< typename A > U32 operator ()( A a ) { return 1; } + template< typename A, typename B > U32 operator ()( A a, B b ) { return 2; } + template< typename A, typename B, typename C > U32 operator ()( A a, B b, C c ) { return 3; } + template< typename A, typename B, typename C, typename D > U32 operator ()( A a, B b, C c, D d ) { return 4; } + template< typename A, typename B, typename C, typename D, typename E > U32 operator ()( A a, B b, C c, D d, E e ) { return 5; } + template< typename A, typename B, typename C, typename D, typename E, typename F > U32 operator ()( A a, B b, C c, D d, E e, F f ) { return 6; } + template< typename A, typename B, typename C, typename D, typename E, typename F, typename G > U32 operator ()( A a, B b, C c, D d, E e, F f, G g ) { return 7; } + template< typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H > U32 operator ()( A a, B b, C c, D d, E e, F f, G g, H h ) { return 8; } + template< typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I > U32 operator ()( A a, B b, C c, D d, E e, F f, G g, H h, I i ) { return 9; } + template< typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I, typename J > U32 operator ()( A a, B b, C c, D d, E e, F f, G g, H h, I i, J j ) { return 10; } + template< typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I, typename J, typename K > U32 operator ()( A a, B b, C c, D d, E e, F f, G g, H h, I i, J j, K k ) { return 11; } + + 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 > + 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 ) + { + return 12; + } + operator U32() const { @@ -1410,6 +1751,8 @@ struct _EngineConsoleThunkCountArgs }; + + // Encapsulation of a legacy console function invocation. template< S32 startArgc, typename T > @@ -1430,6 +1773,7 @@ struct _EngineConsoleThunk< startArgc, R() > return _EngineConsoleThunkReturnValue( ( frame->*fn )() ); } }; + template< S32 startArgc > struct _EngineConsoleThunk< startArgc, void() > { @@ -1446,6 +1790,8 @@ struct _EngineConsoleThunk< startArgc, void() > } }; + + template< S32 startArgc, typename R, typename A > struct _EngineConsoleThunk< startArgc, R( A ) > { @@ -1453,16 +1799,19 @@ struct _EngineConsoleThunk< startArgc, R( A ) > static const S32 NUM_ARGS = 1 + startArgc; static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( *fn )( A ), const _EngineFunctionDefaultArguments< void( A ) >& defaultArgs ) { - A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.a ) ); + A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.a ) ); + return _EngineConsoleThunkReturnValue( fn( a ) ); } template< typename Frame > static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( Frame::*fn )( A ) const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, A ) >& defaultArgs ) { - A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.b ) ); + A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.b ) ); + return _EngineConsoleThunkReturnValue( ( frame->*fn )( a ) ); } }; + template< S32 startArgc, typename A > struct _EngineConsoleThunk< startArgc, void( A ) > { @@ -1470,17 +1819,20 @@ struct _EngineConsoleThunk< startArgc, void( A ) > static const S32 NUM_ARGS = 1 + startArgc; static void thunk( S32 argc, ConsoleValueRef *argv, void ( *fn )( A ), const _EngineFunctionDefaultArguments< void( A ) >& defaultArgs ) { - A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.a ) ); + A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.a ) ); + fn( a ); } template< typename Frame > static void thunk( S32 argc, ConsoleValueRef *argv, void ( Frame::*fn )( A ) const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, A ) >& defaultArgs ) { - A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.b ) ); + A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.b ) ); + ( frame->*fn )( a ); } }; + template< S32 startArgc, typename R, typename A, typename B > struct _EngineConsoleThunk< startArgc, R( A, B ) > { @@ -1488,18 +1840,21 @@ struct _EngineConsoleThunk< startArgc, R( A, B ) > static const S32 NUM_ARGS = 2 + startArgc; static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( *fn )( A, B ), const _EngineFunctionDefaultArguments< void( A, B ) >& defaultArgs ) { - A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.a ) ); + A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.a ) ); B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) ); + return _EngineConsoleThunkReturnValue( fn( a, b ) ); } template< typename Frame > static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( Frame::*fn )( A, B ) const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, A, B ) >& defaultArgs ) { - A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.b ) ); + A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.b ) ); B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) ); + return _EngineConsoleThunkReturnValue( ( frame->*fn )( a, b ) ); } }; + template< S32 startArgc, typename A, typename B > struct _EngineConsoleThunk< startArgc, void( A, B ) > { @@ -1507,19 +1862,22 @@ struct _EngineConsoleThunk< startArgc, void( A, B ) > static const S32 NUM_ARGS = 2 + startArgc; static void thunk( S32 argc, ConsoleValueRef *argv, void ( *fn )( A, B ), const _EngineFunctionDefaultArguments< void( A, B ) >& defaultArgs ) { - A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.a ) ); + A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.a ) ); B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) ); + fn( a, b ); } template< typename Frame > static void thunk( S32 argc, ConsoleValueRef *argv, void ( Frame::*fn )( A, B ) const, Frame* frame, const _EngineFunctionDefaultArguments< void( typename Frame::ObjectType*, A, B ) >& defaultArgs ) { - A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.b ) ); + A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.b ) ); B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) ); + ( frame->*fn )( a, b ); } }; + template< S32 startArgc, typename R, typename A, typename B, typename C > struct _EngineConsoleThunk< startArgc, R( A, B, C ) > { @@ -1527,20 +1885,23 @@ struct _EngineConsoleThunk< startArgc, R( A, B, C ) > static const S32 NUM_ARGS = 3 + startArgc; static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( *fn )( A, B, C ), const _EngineFunctionDefaultArguments< void( A, B, C ) >& defaultArgs ) { - A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.a ) ); + A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.a ) ); B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) ); C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) ); + return _EngineConsoleThunkReturnValue( fn( a, b, c ) ); } template< typename Frame > 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 ) { - A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.b ) ); + A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.b ) ); B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) ); C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) ); + return _EngineConsoleThunkReturnValue( ( frame->*fn )( a, b, c ) ); } }; + template< S32 startArgc, typename A, typename B, typename C > struct _EngineConsoleThunk< startArgc, void( A, B, C ) > { @@ -1548,21 +1909,24 @@ struct _EngineConsoleThunk< startArgc, void( A, B, C ) > static const S32 NUM_ARGS = 3 + startArgc; static void thunk( S32 argc, ConsoleValueRef *argv, void ( *fn )( A, B, C ), const _EngineFunctionDefaultArguments< void( A, B, C ) >& defaultArgs ) { - A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.a ) ); + A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.a ) ); B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) ); C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) ); + fn( a, b, c ); } template< typename Frame > 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 ) { - A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.b ) ); + A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.b ) ); B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) ); C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) ); + ( frame->*fn )( a, b, c ); } }; + template< S32 startArgc, typename R, typename A, typename B, typename C, typename D > struct _EngineConsoleThunk< startArgc, R( A, B, C, D ) > { @@ -1570,22 +1934,25 @@ struct _EngineConsoleThunk< startArgc, R( A, B, C, D ) > static const S32 NUM_ARGS = 4 + startArgc; static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( *fn )( A, B, C, D ), const _EngineFunctionDefaultArguments< void( A, B, C, D ) >& defaultArgs ) { - A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.a ) ); + A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.a ) ); B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) ); C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) ); D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.d ) ); + return _EngineConsoleThunkReturnValue( fn( a, b, c, d ) ); } template< typename Frame > 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 ) { - A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.b ) ); + A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.b ) ); B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) ); C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) ); D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.e ) ); + return _EngineConsoleThunkReturnValue( ( frame->*fn )( a, b, c, d ) ); } }; + template< S32 startArgc, typename A, typename B, typename C, typename D > struct _EngineConsoleThunk< startArgc, void( A, B, C, D ) > { @@ -1593,23 +1960,26 @@ struct _EngineConsoleThunk< startArgc, void( A, B, C, D ) > static const S32 NUM_ARGS = 4 + startArgc; static void thunk( S32 argc, ConsoleValueRef *argv, void ( *fn )( A, B, C, D ), const _EngineFunctionDefaultArguments< void( A, B, C, D ) >& defaultArgs ) { - A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.a ) ); + A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.a ) ); B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) ); C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) ); D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.d ) ); + fn( a, b, c, d ); } template< typename Frame > 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 ) { - A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.b ) ); + A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.b ) ); B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) ); C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) ); D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.e ) ); + ( frame->*fn )( a, b, c, d ); } }; + template< S32 startArgc, typename R, typename A, typename B, typename C, typename D, typename E > struct _EngineConsoleThunk< startArgc, R( A, B, C, D, E ) > { @@ -1617,24 +1987,27 @@ struct _EngineConsoleThunk< startArgc, R( A, B, C, D, E ) > static const S32 NUM_ARGS = 5 + startArgc; static ReturnType thunk( S32 argc, ConsoleValueRef *argv, R ( *fn )( A, B, C, D, E ), const _EngineFunctionDefaultArguments< void( A, B, C, D, E ) >& defaultArgs ) { - A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.a ) ); + A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.a ) ); B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) ); C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) ); D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.d ) ); E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.e ) ); + return _EngineConsoleThunkReturnValue( fn( a, b, c, d, e ) ); } template< typename Frame > 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 ) { - A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.b ) ); + A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.b ) ); B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) ); C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) ); D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.e ) ); E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.f ) ); + return _EngineConsoleThunkReturnValue( ( frame->*fn )( a, b, c, d, e ) ); } }; + template< S32 startArgc, typename A, typename B, typename C, typename D, typename E > struct _EngineConsoleThunk< startArgc, void( A, B, C, D, E ) > { @@ -1642,25 +2015,28 @@ struct _EngineConsoleThunk< startArgc, void( A, B, C, D, E ) > static const S32 NUM_ARGS = 5 + startArgc; static void thunk( S32 argc, ConsoleValueRef *argv, void ( *fn )( A, B, C, D, E ), const _EngineFunctionDefaultArguments< void( A, B, C, D, E ) >& defaultArgs ) { - A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.a ) ); + A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.a ) ); B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) ); C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) ); D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.d ) ); E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.e ) ); + fn( a, b, c, d, e ); } template< typename Frame > 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 ) { - A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.b ) ); + A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.b ) ); B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) ); C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) ); D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.e ) ); E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.f ) ); + ( frame->*fn )( a, b, c, d, e ); } }; + template< S32 startArgc, typename R, typename A, typename B, typename C, typename D, typename E, typename F > struct _EngineConsoleThunk< startArgc, R( A, B, C, D, E, F ) > { @@ -1668,26 +2044,29 @@ struct _EngineConsoleThunk< startArgc, R( A, B, C, D, E, F ) > static const S32 NUM_ARGS = 6 + startArgc; 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 ) { - A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.a ) ); + A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.a ) ); B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) ); C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) ); D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.d ) ); E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.e ) ); F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.f ) ); + return _EngineConsoleThunkReturnValue( fn( a, b, c, d, e, f ) ); } template< typename Frame > 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 ) { - A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.b ) ); + A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.b ) ); B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) ); C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) ); D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.e ) ); E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.f ) ); F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.g ) ); + return _EngineConsoleThunkReturnValue( ( frame->*fn )( a, b, c, d, e, f ) ); } }; + template< S32 startArgc, typename A, typename B, typename C, typename D, typename E, typename F > struct _EngineConsoleThunk< startArgc, void( A, B, C, D, E, F ) > { @@ -1695,27 +2074,30 @@ struct _EngineConsoleThunk< startArgc, void( A, B, C, D, E, F ) > static const S32 NUM_ARGS = 6 + startArgc; 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 ) { - A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.a ) ); + A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.a ) ); B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) ); C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) ); D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.d ) ); E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.e ) ); F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.f ) ); + fn( a, b, c, d, e, f ); } template< typename Frame > 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 ) { - A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.b ) ); + A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.b ) ); B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) ); C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) ); D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.e ) ); E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.f ) ); F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.g ) ); + ( frame->*fn )( a, b, c, d, e, f ); } }; + template< S32 startArgc, typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G > struct _EngineConsoleThunk< startArgc, R( A, B, C, D, E, F, G ) > { @@ -1723,28 +2105,31 @@ struct _EngineConsoleThunk< startArgc, R( A, B, C, D, E, F, G ) > static const S32 NUM_ARGS = 7 + startArgc; 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 ) { - A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.a ) ); + A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.a ) ); B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) ); C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) ); D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.d ) ); E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.e ) ); F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.f ) ); G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.g ) ); + return _EngineConsoleThunkReturnValue( fn( a, b, c, d, e, f, g ) ); } template< typename Frame > 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 ) { - A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.b ) ); + A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.b ) ); B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) ); C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) ); D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.e ) ); E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.f ) ); F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.g ) ); G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.h ) ); + return _EngineConsoleThunkReturnValue( ( frame->*fn )( a, b, c, d, e, f, g ) ); } }; + template< S32 startArgc, typename A, typename B, typename C, typename D, typename E, typename F, typename G > struct _EngineConsoleThunk< startArgc, void( A, B, C, D, E, F, G ) > { @@ -1752,29 +2137,32 @@ struct _EngineConsoleThunk< startArgc, void( A, B, C, D, E, F, G ) > static const S32 NUM_ARGS = 7 + startArgc; 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 ) { - A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.a ) ); + A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.a ) ); B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) ); C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) ); D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.d ) ); E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.e ) ); F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.f ) ); G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.g ) ); + fn( a, b, c, d, e, f, g ); } template< typename Frame > 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 ) { - A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.b ) ); + A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.b ) ); B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) ); C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) ); D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.e ) ); E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.f ) ); F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.g ) ); G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.h ) ); + ( frame->*fn )( a, b, c, d, e, f, g ); } }; + template< S32 startArgc, typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H > struct _EngineConsoleThunk< startArgc, R( A, B, C, D, E, F, G, H ) > { @@ -1782,7 +2170,7 @@ struct _EngineConsoleThunk< startArgc, R( A, B, C, D, E, F, G, H ) > static const S32 NUM_ARGS = 8 + startArgc; 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 ) { - A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.a ) ); + A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.a ) ); B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) ); C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) ); D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.d ) ); @@ -1790,12 +2178,13 @@ struct _EngineConsoleThunk< startArgc, R( A, B, C, D, E, F, G, H ) > F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.f ) ); G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.g ) ); H h = ( startArgc + 7 < argc ? EngineUnmarshallData< H >()( argv[ startArgc + 7 ] ) : H( defaultArgs.h ) ); + return _EngineConsoleThunkReturnValue( fn( a, b, c, d, e, f, g, h ) ); } template< typename Frame > 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 ) { - A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.b ) ); + A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.b ) ); B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) ); C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) ); D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.e ) ); @@ -1803,9 +2192,11 @@ struct _EngineConsoleThunk< startArgc, R( A, B, C, D, E, F, G, H ) > F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.g ) ); G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.h ) ); H h = ( startArgc + 7 < argc ? EngineUnmarshallData< H >()( argv[ startArgc + 7 ] ) : H( defaultArgs.i ) ); + return _EngineConsoleThunkReturnValue( ( frame->*fn )( a, b, c, d, e, f, g, h ) ); } }; + template< S32 startArgc, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H > struct _EngineConsoleThunk< startArgc, void( A, B, C, D, E, F, G, H ) > { @@ -1813,7 +2204,7 @@ struct _EngineConsoleThunk< startArgc, void( A, B, C, D, E, F, G, H ) > static const S32 NUM_ARGS = 8 + startArgc; 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 ) { - A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.a ) ); + A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.a ) ); B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) ); C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) ); D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.d ) ); @@ -1821,12 +2212,13 @@ struct _EngineConsoleThunk< startArgc, void( A, B, C, D, E, F, G, H ) > F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.f ) ); G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.g ) ); H h = ( startArgc + 7 < argc ? EngineUnmarshallData< H >()( argv[ startArgc + 7 ] ) : H( defaultArgs.h ) ); + fn( a, b, c, d, e, f, g, h ); } template< typename Frame > 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 ) { - A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.b ) ); + A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.b ) ); B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) ); C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) ); D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.e ) ); @@ -1834,10 +2226,12 @@ struct _EngineConsoleThunk< startArgc, void( A, B, C, D, E, F, G, H ) > F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.g ) ); G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.h ) ); H h = ( startArgc + 7 < argc ? EngineUnmarshallData< H >()( argv[ startArgc + 7 ] ) : H( defaultArgs.i ) ); + ( frame->*fn )( a, b, c, d, e, f, g, h ); } }; + template< S32 startArgc, typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I > struct _EngineConsoleThunk< startArgc, R( A, B, C, D, E, F, G, H, I ) > { @@ -1845,7 +2239,7 @@ struct _EngineConsoleThunk< startArgc, R( A, B, C, D, E, F, G, H, I ) > static const S32 NUM_ARGS = 9 + startArgc; 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 ) { - A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.a ) ); + A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.a ) ); B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) ); C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) ); D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.d ) ); @@ -1854,12 +2248,13 @@ struct _EngineConsoleThunk< startArgc, R( A, B, C, D, E, F, G, H, I ) > G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.g ) ); H h = ( startArgc + 7 < argc ? EngineUnmarshallData< H >()( argv[ startArgc + 7 ] ) : H( defaultArgs.h ) ); I i = ( startArgc + 8 < argc ? EngineUnmarshallData< I >()( argv[ startArgc + 8 ] ) : I( defaultArgs.i ) ); + return _EngineConsoleThunkReturnValue( fn( a, b, c, d, e, f, g, h, i ) ); } template< typename Frame > 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 ) { - A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.b ) ); + A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.b ) ); B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) ); C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) ); D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.e ) ); @@ -1868,9 +2263,11 @@ struct _EngineConsoleThunk< startArgc, R( A, B, C, D, E, F, G, H, I ) > G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.h ) ); H h = ( startArgc + 7 < argc ? EngineUnmarshallData< H >()( argv[ startArgc + 7 ] ) : H( defaultArgs.i ) ); I i = ( startArgc + 8 < argc ? EngineUnmarshallData< I >()( argv[ startArgc + 8 ] ) : I( defaultArgs.j ) ); + return _EngineConsoleThunkReturnValue( ( frame->*fn )( a, b, c, d, e, f, g, h, i ) ); } }; + template< S32 startArgc, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I > struct _EngineConsoleThunk< startArgc, void( A, B, C, D, E, F, G, H, I ) > { @@ -1878,7 +2275,7 @@ struct _EngineConsoleThunk< startArgc, void( A, B, C, D, E, F, G, H, I ) > static const S32 NUM_ARGS = 9 + startArgc; 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 ) { - A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.a ) ); + A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.a ) ); B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) ); C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) ); D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.d ) ); @@ -1887,12 +2284,13 @@ struct _EngineConsoleThunk< startArgc, void( A, B, C, D, E, F, G, H, I ) > G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.g ) ); H h = ( startArgc + 7 < argc ? EngineUnmarshallData< H >()( argv[ startArgc + 7 ] ) : H( defaultArgs.h ) ); I i = ( startArgc + 8 < argc ? EngineUnmarshallData< I >()( argv[ startArgc + 8 ] ) : I( defaultArgs.i ) ); + fn( a, b, c, d, e, f, g, h, i ); } template< typename Frame > 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 ) { - A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.b ) ); + A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.b ) ); B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) ); C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) ); D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.e ) ); @@ -1901,10 +2299,12 @@ struct _EngineConsoleThunk< startArgc, void( A, B, C, D, E, F, G, H, I ) > G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.h ) ); H h = ( startArgc + 7 < argc ? EngineUnmarshallData< H >()( argv[ startArgc + 7 ] ) : H( defaultArgs.i ) ); I i = ( startArgc + 8 < argc ? EngineUnmarshallData< I >()( argv[ startArgc + 8 ] ) : I( defaultArgs.j ) ); + ( frame->*fn )( a, b, c, d, e, f, g, h, i ); } }; + 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 > struct _EngineConsoleThunk< startArgc, R( A, B, C, D, E, F, G, H, I, J ) > { @@ -1912,7 +2312,7 @@ struct _EngineConsoleThunk< startArgc, R( A, B, C, D, E, F, G, H, I, J ) > static const S32 NUM_ARGS = 10 + startArgc; 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 ) { - A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.a ) ); + A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.a ) ); B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) ); C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) ); D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.d ) ); @@ -1922,12 +2322,13 @@ struct _EngineConsoleThunk< startArgc, R( A, B, C, D, E, F, G, H, I, J ) > H h = ( startArgc + 7 < argc ? EngineUnmarshallData< H >()( argv[ startArgc + 7 ] ) : H( defaultArgs.h ) ); I i = ( startArgc + 8 < argc ? EngineUnmarshallData< I >()( argv[ startArgc + 8 ] ) : I( defaultArgs.i ) ); J j = ( startArgc + 9 < argc ? EngineUnmarshallData< J >()( argv[ startArgc + 9 ] ) : J( defaultArgs.j ) ); + return _EngineConsoleThunkReturnValue( fn( a, b, c, d, e, f, g, h, i, j ) ); } template< typename Frame > 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 ) { - A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.b ) ); + A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.b ) ); B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) ); C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) ); D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.e ) ); @@ -1937,9 +2338,11 @@ struct _EngineConsoleThunk< startArgc, R( A, B, C, D, E, F, G, H, I, J ) > H h = ( startArgc + 7 < argc ? EngineUnmarshallData< H >()( argv[ startArgc + 7 ] ) : H( defaultArgs.i ) ); I i = ( startArgc + 8 < argc ? EngineUnmarshallData< I >()( argv[ startArgc + 8 ] ) : I( defaultArgs.j ) ); J j = ( startArgc + 9 < argc ? EngineUnmarshallData< J >()( argv[ startArgc + 9 ] ) : J( defaultArgs.k ) ); + return _EngineConsoleThunkReturnValue( ( frame->*fn )( a, b, c, d, e, f, g, h, i, j ) ); } }; + template< S32 startArgc, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I, typename J > struct _EngineConsoleThunk< startArgc, void( A, B, C, D, E, F, G, H, I, J ) > { @@ -1947,7 +2350,7 @@ struct _EngineConsoleThunk< startArgc, void( A, B, C, D, E, F, G, H, I, J ) > static const S32 NUM_ARGS = 10 + startArgc; 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 ) { - A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.a ) ); + A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.a ) ); B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) ); C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) ); D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.d ) ); @@ -1957,12 +2360,13 @@ struct _EngineConsoleThunk< startArgc, void( A, B, C, D, E, F, G, H, I, J ) > H h = ( startArgc + 7 < argc ? EngineUnmarshallData< H >()( argv[ startArgc + 7 ] ) : H( defaultArgs.h ) ); I i = ( startArgc + 8 < argc ? EngineUnmarshallData< I >()( argv[ startArgc + 8 ] ) : I( defaultArgs.i ) ); J j = ( startArgc + 9 < argc ? EngineUnmarshallData< J >()( argv[ startArgc + 9 ] ) : J( defaultArgs.j ) ); + fn( a, b, c, d, e, f, g, h, i, j ); } template< typename Frame > 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 ) { - A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.b ) ); + A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.b ) ); B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) ); C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) ); D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.e ) ); @@ -1972,9 +2376,12 @@ struct _EngineConsoleThunk< startArgc, void( A, B, C, D, E, F, G, H, I, J ) > H h = ( startArgc + 7 < argc ? EngineUnmarshallData< H >()( argv[ startArgc + 7 ] ) : H( defaultArgs.i ) ); I i = ( startArgc + 8 < argc ? EngineUnmarshallData< I >()( argv[ startArgc + 8 ] ) : I( defaultArgs.j ) ); J j = ( startArgc + 9 < argc ? EngineUnmarshallData< J >()( argv[ startArgc + 9 ] ) : J( defaultArgs.k ) ); + ( frame->*fn )( a, b, c, d, e, f, g, h, i, j ); } }; + + 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 > struct _EngineConsoleThunk< startArgc, R( A, B, C, D, E, F, G, H, I, J, K ) > { @@ -1982,7 +2389,7 @@ struct _EngineConsoleThunk< startArgc, R( A, B, C, D, E, F, G, H, I, J, K ) > static const S32 NUM_ARGS = 11 + startArgc; 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 ) { - A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.a ) ); + A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.a ) ); B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) ); C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) ); D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.d ) ); @@ -1993,12 +2400,13 @@ struct _EngineConsoleThunk< startArgc, R( A, B, C, D, E, F, G, H, I, J, K ) > I i = ( startArgc + 8 < argc ? EngineUnmarshallData< I >()( argv[ startArgc + 8 ] ) : I( defaultArgs.i ) ); J j = ( startArgc + 9 < argc ? EngineUnmarshallData< J >()( argv[ startArgc + 9 ] ) : J( defaultArgs.j ) ); K k = ( startArgc + 10 < argc ? EngineUnmarshallData< K >()( argv[ startArgc + 10 ] ) : K( defaultArgs.k ) ); + return _EngineConsoleThunkReturnValue( fn( a, b, c, d, e, f, g, h, i, j, k ) ); } template< typename Frame > 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 ) { - A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.b ) ); + A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.b ) ); B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) ); C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) ); D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.e ) ); @@ -2009,9 +2417,11 @@ struct _EngineConsoleThunk< startArgc, R( A, B, C, D, E, F, G, H, I, J, K ) > I i = ( startArgc + 8 < argc ? EngineUnmarshallData< I >()( argv[ startArgc + 8 ] ) : I( defaultArgs.j ) ); J j = ( startArgc + 9 < argc ? EngineUnmarshallData< J >()( argv[ startArgc + 9 ] ) : J( defaultArgs.k ) ); K k = ( startArgc + 10 < argc ? EngineUnmarshallData< K >()( argv[ startArgc + 10 ] ) : K( defaultArgs.l ) ); + return _EngineConsoleThunkReturnValue( ( frame->*fn )( a, b, c, d, e, f, g, h, i, j, k ) ); } }; + 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 > struct _EngineConsoleThunk< startArgc, void( A, B, C, D, E, F, G, H, I, J, K ) > { @@ -2019,7 +2429,7 @@ struct _EngineConsoleThunk< startArgc, void( A, B, C, D, E, F, G, H, I, J, K ) > static const S32 NUM_ARGS = 11 + startArgc; 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 ) { - A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.a ) ); + A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.a ) ); B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) ); C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) ); D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.d ) ); @@ -2030,12 +2440,13 @@ struct _EngineConsoleThunk< startArgc, void( A, B, C, D, E, F, G, H, I, J, K ) > I i = ( startArgc + 8 < argc ? EngineUnmarshallData< I >()( argv[ startArgc + 8 ] ) : I( defaultArgs.i ) ); J j = ( startArgc + 9 < argc ? EngineUnmarshallData< J >()( argv[ startArgc + 9 ] ) : J( defaultArgs.j ) ); K k = ( startArgc + 10 < argc ? EngineUnmarshallData< K >()( argv[ startArgc + 10 ] ) : K( defaultArgs.k ) ); + fn( a, b, c, d, e, f, g, h, i, j, k ); } template< typename Frame > 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 ) { - A a = ( startArgc < argc ? EngineUnmarshallData< A >()( argv[ startArgc ] ) : A( defaultArgs.b ) ); + A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.b ) ); B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) ); C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) ); D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.e ) ); @@ -2046,11 +2457,98 @@ struct _EngineConsoleThunk< startArgc, void( A, B, C, D, E, F, G, H, I, J, K ) > I i = ( startArgc + 8 < argc ? EngineUnmarshallData< I >()( argv[ startArgc + 8 ] ) : I( defaultArgs.j ) ); J j = ( startArgc + 9 < argc ? EngineUnmarshallData< J >()( argv[ startArgc + 9 ] ) : J( defaultArgs.k ) ); K k = ( startArgc + 10 < argc ? EngineUnmarshallData< K >()( argv[ startArgc + 10 ] ) : K( defaultArgs.l ) ); + ( frame->*fn )( a, b, c, d, e, f, g, h, i, j, k ); } }; +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 > +struct _EngineConsoleThunk< startArgc, R( A, B, C, D, E, F, G, H, I, J, K, L ) > +{ + typedef typename _EngineConsoleThunkType< R >::ReturnType ReturnType; + static const S32 NUM_ARGS = 12 + startArgc; + 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 ) + { + A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.a ) ); + B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) ); + C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) ); + D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.d ) ); + E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.e ) ); + F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.f ) ); + G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.g ) ); + H h = ( startArgc + 7 < argc ? EngineUnmarshallData< H >()( argv[ startArgc + 7 ] ) : H( defaultArgs.h ) ); + I i = ( startArgc + 8 < argc ? EngineUnmarshallData< I >()( argv[ startArgc + 8 ] ) : I( defaultArgs.i ) ); + J j = ( startArgc + 9 < argc ? EngineUnmarshallData< J >()( argv[ startArgc + 9 ] ) : J( defaultArgs.j ) ); + K k = ( startArgc + 10 < argc ? EngineUnmarshallData< K >()( argv[ startArgc + 10 ] ) : K( defaultArgs.k ) ); + L l = ( startArgc + 11 < argc ? EngineUnmarshallData< L >()( argv[ startArgc + 11 ] ) : L( defaultArgs.l ) ); + + return _EngineConsoleThunkReturnValue( fn( a, b, c, d, e, f, g, h, i, j, k, l ) ); + } + template< typename Frame > + 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 ) + { + A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.b ) ); + B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) ); + C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) ); + D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.e ) ); + E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.f ) ); + F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.g ) ); + G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.h ) ); + H h = ( startArgc + 7 < argc ? EngineUnmarshallData< H >()( argv[ startArgc + 7 ] ) : H( defaultArgs.i ) ); + I i = ( startArgc + 8 < argc ? EngineUnmarshallData< I >()( argv[ startArgc + 8 ] ) : I( defaultArgs.j ) ); + J j = ( startArgc + 9 < argc ? EngineUnmarshallData< J >()( argv[ startArgc + 9 ] ) : J( defaultArgs.k ) ); + K k = ( startArgc + 10 < argc ? EngineUnmarshallData< K >()( argv[ startArgc + 10 ] ) : K( defaultArgs.l ) ); + L l = ( startArgc + 11 < argc ? EngineUnmarshallData< L >()( argv[ startArgc + 11 ] ) : L( defaultArgs.l ) ); + + return _EngineConsoleThunkReturnValue( ( frame->*fn )( a, b, c, d, e, f, g, h, i, j, k, l ) ); + } +}; + +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 > +struct _EngineConsoleThunk< startArgc, void( A, B, C, D, E, F, G, H, I, J, K, L ) > +{ + typedef void ReturnType; + static const S32 NUM_ARGS = 12 + startArgc; + 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 ) + { + A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.a ) ); + B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.b ) ); + C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.c ) ); + D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.d ) ); + E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.e ) ); + F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.f ) ); + G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.g ) ); + H h = ( startArgc + 7 < argc ? EngineUnmarshallData< H >()( argv[ startArgc + 7 ] ) : H( defaultArgs.h ) ); + I i = ( startArgc + 8 < argc ? EngineUnmarshallData< I >()( argv[ startArgc + 8 ] ) : I( defaultArgs.i ) ); + J j = ( startArgc + 9 < argc ? EngineUnmarshallData< J >()( argv[ startArgc + 9 ] ) : J( defaultArgs.j ) ); + K k = ( startArgc + 10 < argc ? EngineUnmarshallData< K >()( argv[ startArgc + 10 ] ) : K( defaultArgs.k ) ); + L l = ( startArgc + 11 < argc ? EngineUnmarshallData< L >()( argv[ startArgc + 11 ] ) : L( defaultArgs.l ) ); + + fn( a, b, c, d, e, f, g, h, i, j, k, l ); + } + template< typename Frame > + 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 ) + { + A a = ( startArgc + 0 < argc ? EngineUnmarshallData< A >()( argv[ startArgc + 0 ] ) : A( defaultArgs.b ) ); + B b = ( startArgc + 1 < argc ? EngineUnmarshallData< B >()( argv[ startArgc + 1 ] ) : B( defaultArgs.c ) ); + C c = ( startArgc + 2 < argc ? EngineUnmarshallData< C >()( argv[ startArgc + 2 ] ) : C( defaultArgs.d ) ); + D d = ( startArgc + 3 < argc ? EngineUnmarshallData< D >()( argv[ startArgc + 3 ] ) : D( defaultArgs.e ) ); + E e = ( startArgc + 4 < argc ? EngineUnmarshallData< E >()( argv[ startArgc + 4 ] ) : E( defaultArgs.f ) ); + F f = ( startArgc + 5 < argc ? EngineUnmarshallData< F >()( argv[ startArgc + 5 ] ) : F( defaultArgs.g ) ); + G g = ( startArgc + 6 < argc ? EngineUnmarshallData< G >()( argv[ startArgc + 6 ] ) : G( defaultArgs.h ) ); + H h = ( startArgc + 7 < argc ? EngineUnmarshallData< H >()( argv[ startArgc + 7 ] ) : H( defaultArgs.i ) ); + I i = ( startArgc + 8 < argc ? EngineUnmarshallData< I >()( argv[ startArgc + 8 ] ) : I( defaultArgs.j ) ); + J j = ( startArgc + 9 < argc ? EngineUnmarshallData< J >()( argv[ startArgc + 9 ] ) : J( defaultArgs.k ) ); + K k = ( startArgc + 10 < argc ? EngineUnmarshallData< K >()( argv[ startArgc + 10 ] ) : K( defaultArgs.l ) ); + L l = ( startArgc + 11 < argc ? EngineUnmarshallData< L >()( argv[ startArgc + 11 ] ) : L( defaultArgs.l ) ); + + ( frame->*fn )( a, b, c, d, e, f, g, h, i, j, k, l ); + } +}; + + + /// @} /// @name API Definition Macros @@ -2543,6 +3041,8 @@ struct _EngineConsoleThunk< startArgc, void( A, B, C, D, E, F, G, H, I, J, K ) > } + + // Internal helper class for doing call-outs in the new interop. struct _EngineCallbackHelper { @@ -2563,177 +3063,362 @@ struct _EngineCallbackHelper typedef R( FunctionType )( EngineObject* ); return R( reinterpret_cast< FunctionType* >( const_cast(mFn) )( mThis ) ); } + + template< typename R, typename A > R call( A a ) const { typedef R( FunctionType )( EngineObject*, A ); return R( reinterpret_cast< FunctionType* >( const_cast(mFn) )( mThis, a ) ); } + template< typename R, typename A, typename B > R call( A a, B b ) const { typedef R( FunctionType )( EngineObject*, A, B ); return R( reinterpret_cast< FunctionType* >( const_cast(mFn) )( mThis, a, b ) ); } + template< typename R, typename A, typename B, typename C > R call( A a, B b, C c ) const { typedef R( FunctionType )( EngineObject*, A, B, C ); return R( reinterpret_cast< FunctionType* >( const_cast(mFn) )( mThis, a, b, c ) ); } + template< typename R, typename A, typename B, typename C, typename D > R call( A a, B b, C c, D d ) const { typedef R( FunctionType )( EngineObject*, A, B, C, D ); return R( reinterpret_cast< FunctionType* >( const_cast(mFn) )( mThis, a, b, c, d ) ); } + template< typename R, typename A, typename B, typename C, typename D, typename E > R call( A a, B b, C c, D d, E e ) const { typedef R( FunctionType )( EngineObject*, A, B, C, D, E ); return R( reinterpret_cast< FunctionType* >( const_cast(mFn) )( mThis, a, b, c, d, e ) ); } + template< typename R, typename A, typename B, typename C, typename D, typename E, typename F > R call( A a, B b, C c, D d, E e, F f ) const { typedef R( FunctionType )( EngineObject*, A, B, C, D, E, F ); return R( reinterpret_cast< FunctionType* >( const_cast(mFn) )( mThis, a, b, c, d, e, f ) ); } + template< typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G > R call( A a, B b, C c, D d, E e, F f, G g ) const { typedef R( FunctionType )( EngineObject*, A, B, C, D, E, F, G ); return R( reinterpret_cast< FunctionType* >( const_cast(mFn) )( mThis, a, b, c, d, e, f, g ) ); } + template< typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H > R call( A a, B b, C c, D d, E e, F f, G g, H h ) const { typedef R( FunctionType )( EngineObject*, A, B, C, D, E, F, G, H ); return R( reinterpret_cast< FunctionType* >( const_cast(mFn) )( mThis, a, b, c, d, e, f, g, h ) ); } + template< typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I > R call( A a, B b, C c, D d, E e, F f, G g, H h, I i ) const { typedef R( FunctionType )( EngineObject*, A, B, C, D, E, F, G, H, I ); return R( reinterpret_cast< FunctionType* >( const_cast(mFn) )( mThis, a, b, c, d, e, f, g, h, i ) ); } + template< typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I, typename J > R call( A a, B b, C c, D d, E e, F f, G g, H h, I i, J j ) const { typedef R( FunctionType )( EngineObject*, A, B, C, D, E, F, G, H, I, J ); return R( reinterpret_cast< FunctionType* >( const_cast(mFn) )( mThis, a, b, c, d, e, f, g, h, i, j ) ); } + 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 > 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 { typedef R( FunctionType )( EngineObject*, A, B, C, D, E, F, G, H, I, J, K ); return R( reinterpret_cast< FunctionType* >( const_cast(mFn) )( mThis, a, b, c, d, e, f, g, h, i, j, k ) ); } + 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 > 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 { - typedef R( FunctionType )( EngineObject*, A, B, C, D, E, F, G, H, I, J, K, L l ); + typedef R( FunctionType )( EngineObject*, A, B, C, D, E, F, G, H, I, J, K, L ); return R( reinterpret_cast< FunctionType* >( const_cast(mFn) )( mThis, a, b, c, d, e, f, g, h, i, j, k, l ) ); } + }; + +#include "console/stringStack.h" + // Internal helper for callback support in legacy console system. -struct _EngineConsoleCallbackHelper +struct _BaseEngineConsoleCallbackHelper { +public: + + /// Matches up to storeArgs. + static const U32 MAX_ARGUMENTS = 11; + + SimObject* mThis; + S32 mInitialArgc; + S32 mArgc; + StringTableEntry mCallbackName; + ConsoleValueRef mArgv[ MAX_ARGUMENTS + 2 ]; + + ConsoleValueRef _exec(); + ConsoleValueRef _execLater(SimConsoleThreadExecEvent *evt); + + _BaseEngineConsoleCallbackHelper() {;} +}; + + + +// Base helper for console callbacks +struct _EngineConsoleCallbackHelper : public _BaseEngineConsoleCallbackHelper +{ +public: + + _EngineConsoleCallbackHelper( StringTableEntry callbackName, SimObject* pThis ) + { + mThis = pThis; + mArgc = mInitialArgc = pThis ? 2 : 1 ; + mCallbackName = callbackName; + } + + template< typename R > + R call() + { + if (Con::isMainThread()) + { + ConsoleStackFrameSaver sav; sav.save(); + CSTK.reserveValues(mArgc, mArgv); + mArgv[ 0 ].value->setStackStringValue(mCallbackName); + return R( EngineUnmarshallData< R >()( _exec() ) ); + } + else + { + SimConsoleThreadExecCallback cb; + SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc, NULL, false, &cb); + evt->populateArgs(mArgv); + mArgv[ 0 ].value->setStackStringValue(mCallbackName); + Sim::postEvent((SimObject*)Sim::getRootGroup(), evt, Sim::getCurrentTime()); + + return R( EngineUnmarshallData< R >()( cb.waitForResult() ) ); + } + } + - protected: - /// Matches up to storeArgs. - static const U32 MAX_ARGUMENTS = 11; + template< typename R, typename A > + R call( A a ) + { + if (Con::isMainThread()) + { + ConsoleStackFrameSaver sav; sav.save(); + CSTK.reserveValues(mArgc+1, mArgv); + mArgv[ 0 ].value->setStackStringValue(mCallbackName); - SimObject* mThis; - S32 mArgc; - ConsoleValueRef mArgv[ MAX_ARGUMENTS + 2 ]; - - const char* _exec() - { - if( mThis ) - { - // Cannot invoke callback until object has been registered - if (mThis->isProperlyAdded()) { - return Con::execute( mThis, mArgc, mArgv ); - } else { - Con::resetStackFrame(); // We might have pushed some vars here - return ""; - } - } - else - return Con::execute( mArgc, mArgv ); - } - - public: - - _EngineConsoleCallbackHelper( StringTableEntry callbackName, SimObject* pThis ) - : mThis( pThis ), - mArgc( pThis ? 2 : 1 ) - { - mArgv[ 0 ] = callbackName; - } - - template< typename R > - R call() - { - return R( EngineUnmarshallData< R >()( _exec() ) ); - } - template< typename R, typename A > - R call( A a ) - { EngineMarshallData( a, mArgc, mArgv ); + return R( EngineUnmarshallData< R >()( _exec() ) ); } - template< typename R, typename A, typename B > - R call( A a, B b ) + else { + SimConsoleThreadExecCallback cb; + SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc+1, NULL, false, &cb); + evt->populateArgs(mArgv); + mArgv[ 0 ].value->setStackStringValue(mCallbackName); + + EngineMarshallData( a, mArgc, mArgv ); + + Sim::postEvent((SimObject*)Sim::getRootGroup(), evt, Sim::getCurrentTime()); + + return R( EngineUnmarshallData< R >()( cb.waitForResult() ) ); + } + } + + template< typename R, typename A, typename B > + R call( A a, B b ) + { + if (Con::isMainThread()) + { + ConsoleStackFrameSaver sav; sav.save(); + CSTK.reserveValues(mArgc+2, mArgv); + mArgv[ 0 ].value->setStackStringValue(mCallbackName); + EngineMarshallData( a, mArgc, mArgv ); EngineMarshallData( b, mArgc, mArgv ); + return R( EngineUnmarshallData< R >()( _exec() ) ); } - template< typename R, typename A, typename B, typename C > - R call( A a, B b, C c ) + else { + SimConsoleThreadExecCallback cb; + SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc+2, NULL, false, &cb); + evt->populateArgs(mArgv); + mArgv[ 0 ].value->setStackStringValue(mCallbackName); + + EngineMarshallData( a, mArgc, mArgv ); + EngineMarshallData( b, mArgc, mArgv ); + + Sim::postEvent((SimObject*)Sim::getRootGroup(), evt, Sim::getCurrentTime()); + + return R( EngineUnmarshallData< R >()( cb.waitForResult() ) ); + } + } + + template< typename R, typename A, typename B, typename C > + R call( A a, B b, C c ) + { + if (Con::isMainThread()) + { + ConsoleStackFrameSaver sav; sav.save(); + CSTK.reserveValues(mArgc+3, mArgv); + mArgv[ 0 ].value->setStackStringValue(mCallbackName); + EngineMarshallData( a, mArgc, mArgv ); EngineMarshallData( b, mArgc, mArgv ); EngineMarshallData( c, mArgc, mArgv ); + return R( EngineUnmarshallData< R >()( _exec() ) ); } - template< typename R, typename A, typename B, typename C, typename D > - R call( A a, B b, C c, D d ) + else { + SimConsoleThreadExecCallback cb; + SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc+3, NULL, false, &cb); + evt->populateArgs(mArgv); + mArgv[ 0 ].value->setStackStringValue(mCallbackName); + + EngineMarshallData( a, mArgc, mArgv ); + EngineMarshallData( b, mArgc, mArgv ); + EngineMarshallData( c, mArgc, mArgv ); + + Sim::postEvent((SimObject*)Sim::getRootGroup(), evt, Sim::getCurrentTime()); + + return R( EngineUnmarshallData< R >()( cb.waitForResult() ) ); + } + } + + template< typename R, typename A, typename B, typename C, typename D > + R call( A a, B b, C c, D d ) + { + if (Con::isMainThread()) + { + ConsoleStackFrameSaver sav; sav.save(); + CSTK.reserveValues(mArgc+4, mArgv); + mArgv[ 0 ].value->setStackStringValue(mCallbackName); + EngineMarshallData( a, mArgc, mArgv ); EngineMarshallData( b, mArgc, mArgv ); EngineMarshallData( c, mArgc, mArgv ); EngineMarshallData( d, mArgc, mArgv ); + return R( EngineUnmarshallData< R >()( _exec() ) ); } - template< typename R, typename A, typename B, typename C, typename D, typename E > - R call( A a, B b, C c, D d, E e ) + else { + SimConsoleThreadExecCallback cb; + SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc+4, NULL, false, &cb); + evt->populateArgs(mArgv); + mArgv[ 0 ].value->setStackStringValue(mCallbackName); + + EngineMarshallData( a, mArgc, mArgv ); + EngineMarshallData( b, mArgc, mArgv ); + EngineMarshallData( c, mArgc, mArgv ); + EngineMarshallData( d, mArgc, mArgv ); + + Sim::postEvent((SimObject*)Sim::getRootGroup(), evt, Sim::getCurrentTime()); + + return R( EngineUnmarshallData< R >()( cb.waitForResult() ) ); + } + } + + template< typename R, typename A, typename B, typename C, typename D, typename E > + R call( A a, B b, C c, D d, E e ) + { + if (Con::isMainThread()) + { + ConsoleStackFrameSaver sav; sav.save(); + CSTK.reserveValues(mArgc+5, mArgv); + mArgv[ 0 ].value->setStackStringValue(mCallbackName); + EngineMarshallData( a, mArgc, mArgv ); EngineMarshallData( b, mArgc, mArgv ); EngineMarshallData( c, mArgc, mArgv ); EngineMarshallData( d, mArgc, mArgv ); EngineMarshallData( e, mArgc, mArgv ); + return R( EngineUnmarshallData< R >()( _exec() ) ); } - template< typename R, typename A, typename B, typename C, typename D, typename E, typename F > - R call( A a, B b, C c, D d, E e, F f ) + else { + SimConsoleThreadExecCallback cb; + SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc+5, NULL, false, &cb); + evt->populateArgs(mArgv); + mArgv[ 0 ].value->setStackStringValue(mCallbackName); + + EngineMarshallData( a, mArgc, mArgv ); + EngineMarshallData( b, mArgc, mArgv ); + EngineMarshallData( c, mArgc, mArgv ); + EngineMarshallData( d, mArgc, mArgv ); + EngineMarshallData( e, mArgc, mArgv ); + + Sim::postEvent((SimObject*)Sim::getRootGroup(), evt, Sim::getCurrentTime()); + + return R( EngineUnmarshallData< R >()( cb.waitForResult() ) ); + } + } + + template< typename R, typename A, typename B, typename C, typename D, typename E, typename F > + R call( A a, B b, C c, D d, E e, F f ) + { + if (Con::isMainThread()) + { + ConsoleStackFrameSaver sav; sav.save(); + CSTK.reserveValues(mArgc+6, mArgv); + mArgv[ 0 ].value->setStackStringValue(mCallbackName); + EngineMarshallData( a, mArgc, mArgv ); EngineMarshallData( b, mArgc, mArgv ); EngineMarshallData( c, mArgc, mArgv ); EngineMarshallData( d, mArgc, mArgv ); EngineMarshallData( e, mArgc, mArgv ); EngineMarshallData( f, mArgc, mArgv ); + return R( EngineUnmarshallData< R >()( _exec() ) ); } - template< typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G > - R call( A a, B b, C c, D d, E e, F f, G g ) + else { + SimConsoleThreadExecCallback cb; + SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc+6, NULL, false, &cb); + evt->populateArgs(mArgv); + mArgv[ 0 ].value->setStackStringValue(mCallbackName); + + EngineMarshallData( a, mArgc, mArgv ); + EngineMarshallData( b, mArgc, mArgv ); + EngineMarshallData( c, mArgc, mArgv ); + EngineMarshallData( d, mArgc, mArgv ); + EngineMarshallData( e, mArgc, mArgv ); + EngineMarshallData( f, mArgc, mArgv ); + + Sim::postEvent((SimObject*)Sim::getRootGroup(), evt, Sim::getCurrentTime()); + + return R( EngineUnmarshallData< R >()( cb.waitForResult() ) ); + } + } + + template< typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G > + R call( A a, B b, C c, D d, E e, F f, G g ) + { + if (Con::isMainThread()) + { + ConsoleStackFrameSaver sav; sav.save(); + CSTK.reserveValues(mArgc+7, mArgv); + mArgv[ 0 ].value->setStackStringValue(mCallbackName); + EngineMarshallData( a, mArgc, mArgv ); EngineMarshallData( b, mArgc, mArgv ); EngineMarshallData( c, mArgc, mArgv ); @@ -2741,11 +3426,39 @@ struct _EngineConsoleCallbackHelper EngineMarshallData( e, mArgc, mArgv ); EngineMarshallData( f, mArgc, mArgv ); EngineMarshallData( g, mArgc, mArgv ); + return R( EngineUnmarshallData< R >()( _exec() ) ); } - template< typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H > - R call( A a, B b, C c, D d, E e, F f, G g, H h ) + else { + SimConsoleThreadExecCallback cb; + SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc+7, NULL, false, &cb); + evt->populateArgs(mArgv); + mArgv[ 0 ].value->setStackStringValue(mCallbackName); + + EngineMarshallData( a, mArgc, mArgv ); + EngineMarshallData( b, mArgc, mArgv ); + EngineMarshallData( c, mArgc, mArgv ); + EngineMarshallData( d, mArgc, mArgv ); + EngineMarshallData( e, mArgc, mArgv ); + EngineMarshallData( f, mArgc, mArgv ); + EngineMarshallData( g, mArgc, mArgv ); + + Sim::postEvent((SimObject*)Sim::getRootGroup(), evt, Sim::getCurrentTime()); + + return R( EngineUnmarshallData< R >()( cb.waitForResult() ) ); + } + } + + template< typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H > + R call( A a, B b, C c, D d, E e, F f, G g, H h ) + { + if (Con::isMainThread()) + { + ConsoleStackFrameSaver sav; sav.save(); + CSTK.reserveValues(mArgc+8, mArgv); + mArgv[ 0 ].value->setStackStringValue(mCallbackName); + EngineMarshallData( a, mArgc, mArgv ); EngineMarshallData( b, mArgc, mArgv ); EngineMarshallData( c, mArgc, mArgv ); @@ -2754,11 +3467,40 @@ struct _EngineConsoleCallbackHelper EngineMarshallData( f, mArgc, mArgv ); EngineMarshallData( g, mArgc, mArgv ); EngineMarshallData( h, mArgc, mArgv ); + return R( EngineUnmarshallData< R >()( _exec() ) ); } - template< typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I > - R call( A a, B b, C c, D d, E e, F f, G g, H h, I i ) + else { + SimConsoleThreadExecCallback cb; + SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc+8, NULL, false, &cb); + evt->populateArgs(mArgv); + mArgv[ 0 ].value->setStackStringValue(mCallbackName); + + EngineMarshallData( a, mArgc, mArgv ); + EngineMarshallData( b, mArgc, mArgv ); + EngineMarshallData( c, mArgc, mArgv ); + EngineMarshallData( d, mArgc, mArgv ); + EngineMarshallData( e, mArgc, mArgv ); + EngineMarshallData( f, mArgc, mArgv ); + EngineMarshallData( g, mArgc, mArgv ); + EngineMarshallData( h, mArgc, mArgv ); + + Sim::postEvent((SimObject*)Sim::getRootGroup(), evt, Sim::getCurrentTime()); + + return R( EngineUnmarshallData< R >()( cb.waitForResult() ) ); + } + } + + template< typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I > + R call( A a, B b, C c, D d, E e, F f, G g, H h, I i ) + { + if (Con::isMainThread()) + { + ConsoleStackFrameSaver sav; sav.save(); + CSTK.reserveValues(mArgc+9, mArgv); + mArgv[ 0 ].value->setStackStringValue(mCallbackName); + EngineMarshallData( a, mArgc, mArgv ); EngineMarshallData( b, mArgc, mArgv ); EngineMarshallData( c, mArgc, mArgv ); @@ -2768,11 +3510,41 @@ struct _EngineConsoleCallbackHelper EngineMarshallData( g, mArgc, mArgv ); EngineMarshallData( h, mArgc, mArgv ); EngineMarshallData( i, mArgc, mArgv ); + return R( EngineUnmarshallData< R >()( _exec() ) ); } - template< typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I, typename J > - R call( A a, B b, C c, D d, E e, F f, G g, H h, I i, J j ) + else { + SimConsoleThreadExecCallback cb; + SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc+9, NULL, false, &cb); + evt->populateArgs(mArgv); + mArgv[ 0 ].value->setStackStringValue(mCallbackName); + + EngineMarshallData( a, mArgc, mArgv ); + EngineMarshallData( b, mArgc, mArgv ); + EngineMarshallData( c, mArgc, mArgv ); + EngineMarshallData( d, mArgc, mArgv ); + EngineMarshallData( e, mArgc, mArgv ); + EngineMarshallData( f, mArgc, mArgv ); + EngineMarshallData( g, mArgc, mArgv ); + EngineMarshallData( h, mArgc, mArgv ); + EngineMarshallData( i, mArgc, mArgv ); + + Sim::postEvent((SimObject*)Sim::getRootGroup(), evt, Sim::getCurrentTime()); + + return R( EngineUnmarshallData< R >()( cb.waitForResult() ) ); + } + } + + template< typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I, typename J > + R call( A a, B b, C c, D d, E e, F f, G g, H h, I i, J j ) + { + if (Con::isMainThread()) + { + ConsoleStackFrameSaver sav; sav.save(); + CSTK.reserveValues(mArgc+10, mArgv); + mArgv[ 0 ].value->setStackStringValue(mCallbackName); + EngineMarshallData( a, mArgc, mArgv ); EngineMarshallData( b, mArgc, mArgv ); EngineMarshallData( c, mArgc, mArgv ); @@ -2783,11 +3555,42 @@ struct _EngineConsoleCallbackHelper EngineMarshallData( h, mArgc, mArgv ); EngineMarshallData( i, mArgc, mArgv ); EngineMarshallData( j, mArgc, mArgv ); + return R( EngineUnmarshallData< R >()( _exec() ) ); } - 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 > - R call( A a, B b, C c, D d, E e, F f, G g, H h, I i, J j, K k ) + else { + SimConsoleThreadExecCallback cb; + SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc+10, NULL, false, &cb); + evt->populateArgs(mArgv); + mArgv[ 0 ].value->setStackStringValue(mCallbackName); + + EngineMarshallData( a, mArgc, mArgv ); + EngineMarshallData( b, mArgc, mArgv ); + EngineMarshallData( c, mArgc, mArgv ); + EngineMarshallData( d, mArgc, mArgv ); + EngineMarshallData( e, mArgc, mArgv ); + EngineMarshallData( f, mArgc, mArgv ); + EngineMarshallData( g, mArgc, mArgv ); + EngineMarshallData( h, mArgc, mArgv ); + EngineMarshallData( i, mArgc, mArgv ); + EngineMarshallData( j, mArgc, mArgv ); + + Sim::postEvent((SimObject*)Sim::getRootGroup(), evt, Sim::getCurrentTime()); + + return R( EngineUnmarshallData< R >()( cb.waitForResult() ) ); + } + } + + 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 > + R call( A a, B b, C c, D d, E e, F f, G g, H h, I i, J j, K k ) + { + if (Con::isMainThread()) + { + ConsoleStackFrameSaver sav; sav.save(); + CSTK.reserveValues(mArgc+11, mArgv); + mArgv[ 0 ].value->setStackStringValue(mCallbackName); + EngineMarshallData( a, mArgc, mArgv ); EngineMarshallData( b, mArgc, mArgv ); EngineMarshallData( c, mArgc, mArgv ); @@ -2799,11 +3602,43 @@ struct _EngineConsoleCallbackHelper EngineMarshallData( i, mArgc, mArgv ); EngineMarshallData( j, mArgc, mArgv ); EngineMarshallData( k, mArgc, mArgv ); + return R( EngineUnmarshallData< R >()( _exec() ) ); } - 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 > - 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 ) + else { + SimConsoleThreadExecCallback cb; + SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc+11, NULL, false, &cb); + evt->populateArgs(mArgv); + mArgv[ 0 ].value->setStackStringValue(mCallbackName); + + EngineMarshallData( a, mArgc, mArgv ); + EngineMarshallData( b, mArgc, mArgv ); + EngineMarshallData( c, mArgc, mArgv ); + EngineMarshallData( d, mArgc, mArgv ); + EngineMarshallData( e, mArgc, mArgv ); + EngineMarshallData( f, mArgc, mArgv ); + EngineMarshallData( g, mArgc, mArgv ); + EngineMarshallData( h, mArgc, mArgv ); + EngineMarshallData( i, mArgc, mArgv ); + EngineMarshallData( j, mArgc, mArgv ); + EngineMarshallData( k, mArgc, mArgv ); + + Sim::postEvent((SimObject*)Sim::getRootGroup(), evt, Sim::getCurrentTime()); + + return R( EngineUnmarshallData< R >()( cb.waitForResult() ) ); + } + } + + 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 > + 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 ) + { + if (Con::isMainThread()) + { + ConsoleStackFrameSaver sav; sav.save(); + CSTK.reserveValues(mArgc+12, mArgv); + mArgv[ 0 ].value->setStackStringValue(mCallbackName); + EngineMarshallData( a, mArgc, mArgv ); EngineMarshallData( b, mArgc, mArgv ); EngineMarshallData( c, mArgc, mArgv ); @@ -2816,12 +3651,1004 @@ struct _EngineConsoleCallbackHelper EngineMarshallData( j, mArgc, mArgv ); EngineMarshallData( k, mArgc, mArgv ); EngineMarshallData( l, mArgc, mArgv ); + return R( EngineUnmarshallData< R >()( _exec() ) ); } + else + { + SimConsoleThreadExecCallback cb; + SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc+12, NULL, false, &cb); + evt->populateArgs(mArgv); + mArgv[ 0 ].value->setStackStringValue(mCallbackName); + + EngineMarshallData( a, mArgc, mArgv ); + EngineMarshallData( b, mArgc, mArgv ); + EngineMarshallData( c, mArgc, mArgv ); + EngineMarshallData( d, mArgc, mArgv ); + EngineMarshallData( e, mArgc, mArgv ); + EngineMarshallData( f, mArgc, mArgv ); + EngineMarshallData( g, mArgc, mArgv ); + EngineMarshallData( h, mArgc, mArgv ); + EngineMarshallData( i, mArgc, mArgv ); + EngineMarshallData( j, mArgc, mArgv ); + EngineMarshallData( k, mArgc, mArgv ); + EngineMarshallData( l, mArgc, mArgv ); + + Sim::postEvent((SimObject*)Sim::getRootGroup(), evt, Sim::getCurrentTime()); + + return R( EngineUnmarshallData< R >()( cb.waitForResult() ) ); + } + } + }; +// Override for when first parameter is presumably a SimObject*, in which case A will be absorbed as the callback +template struct _EngineConsoleExecCallbackHelper : public _BaseEngineConsoleCallbackHelper +{ +public: + + _EngineConsoleExecCallbackHelper( SimObject* pThis ) + { + mThis = pThis; + mArgc = mInitialArgc = 2; + mCallbackName = NULL; + } + + + template< typename R, typename A > + R call( A a ) + { + if (Con::isMainThread()) + { + ConsoleStackFrameSaver sav; sav.save(); + CSTK.reserveValues(mArgc+0, mArgv); + mArgv[ 0 ].value->setStackStringValue(a); + + + + return R( EngineUnmarshallData< R >()( _exec() ) ); + } + else + { + SimConsoleThreadExecCallback cb; + SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc+0, NULL, true, &cb); + evt->populateArgs(mArgv); + mArgv[ 0 ].value->setStackStringValue(a); + + + + Sim::postEvent(mThis, evt, Sim::getCurrentTime()); + + return R( EngineUnmarshallData< R >()( cb.waitForResult() ) ); + } + } + + template< typename R, typename A, typename B > + R call( A a, B b ) + { + if (Con::isMainThread()) + { + ConsoleStackFrameSaver sav; sav.save(); + CSTK.reserveValues(mArgc+1, mArgv); + mArgv[ 0 ].value->setStackStringValue(a); + + EngineMarshallData( b, mArgc, mArgv ); + + return R( EngineUnmarshallData< R >()( _exec() ) ); + } + else + { + SimConsoleThreadExecCallback cb; + SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc+1, NULL, true, &cb); + evt->populateArgs(mArgv); + mArgv[ 0 ].value->setStackStringValue(a); + + EngineMarshallData( b, mArgc, mArgv ); + + Sim::postEvent(mThis, evt, Sim::getCurrentTime()); + + return R( EngineUnmarshallData< R >()( cb.waitForResult() ) ); + } + } + + template< typename R, typename A, typename B, typename C > + R call( A a, B b, C c ) + { + if (Con::isMainThread()) + { + ConsoleStackFrameSaver sav; sav.save(); + CSTK.reserveValues(mArgc+2, mArgv); + mArgv[ 0 ].value->setStackStringValue(a); + + EngineMarshallData( b, mArgc, mArgv ); + EngineMarshallData( c, mArgc, mArgv ); + + return R( EngineUnmarshallData< R >()( _exec() ) ); + } + else + { + SimConsoleThreadExecCallback cb; + SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc+2, NULL, true, &cb); + evt->populateArgs(mArgv); + mArgv[ 0 ].value->setStackStringValue(a); + + EngineMarshallData( b, mArgc, mArgv ); + EngineMarshallData( c, mArgc, mArgv ); + + Sim::postEvent(mThis, evt, Sim::getCurrentTime()); + + return R( EngineUnmarshallData< R >()( cb.waitForResult() ) ); + } + } + + template< typename R, typename A, typename B, typename C, typename D > + R call( A a, B b, C c, D d ) + { + if (Con::isMainThread()) + { + ConsoleStackFrameSaver sav; sav.save(); + CSTK.reserveValues(mArgc+3, mArgv); + mArgv[ 0 ].value->setStackStringValue(a); + + EngineMarshallData( b, mArgc, mArgv ); + EngineMarshallData( c, mArgc, mArgv ); + EngineMarshallData( d, mArgc, mArgv ); + + return R( EngineUnmarshallData< R >()( _exec() ) ); + } + else + { + SimConsoleThreadExecCallback cb; + SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc+3, NULL, true, &cb); + evt->populateArgs(mArgv); + mArgv[ 0 ].value->setStackStringValue(a); + + EngineMarshallData( b, mArgc, mArgv ); + EngineMarshallData( c, mArgc, mArgv ); + EngineMarshallData( d, mArgc, mArgv ); + + Sim::postEvent(mThis, evt, Sim::getCurrentTime()); + + return R( EngineUnmarshallData< R >()( cb.waitForResult() ) ); + } + } + + template< typename R, typename A, typename B, typename C, typename D, typename E > + R call( A a, B b, C c, D d, E e ) + { + if (Con::isMainThread()) + { + ConsoleStackFrameSaver sav; sav.save(); + CSTK.reserveValues(mArgc+4, mArgv); + mArgv[ 0 ].value->setStackStringValue(a); + + EngineMarshallData( b, mArgc, mArgv ); + EngineMarshallData( c, mArgc, mArgv ); + EngineMarshallData( d, mArgc, mArgv ); + EngineMarshallData( e, mArgc, mArgv ); + + return R( EngineUnmarshallData< R >()( _exec() ) ); + } + else + { + SimConsoleThreadExecCallback cb; + SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc+4, NULL, true, &cb); + evt->populateArgs(mArgv); + mArgv[ 0 ].value->setStackStringValue(a); + + EngineMarshallData( b, mArgc, mArgv ); + EngineMarshallData( c, mArgc, mArgv ); + EngineMarshallData( d, mArgc, mArgv ); + EngineMarshallData( e, mArgc, mArgv ); + + Sim::postEvent(mThis, evt, Sim::getCurrentTime()); + + return R( EngineUnmarshallData< R >()( cb.waitForResult() ) ); + } + } + + template< typename R, typename A, typename B, typename C, typename D, typename E, typename F > + R call( A a, B b, C c, D d, E e, F f ) + { + if (Con::isMainThread()) + { + ConsoleStackFrameSaver sav; sav.save(); + CSTK.reserveValues(mArgc+5, mArgv); + mArgv[ 0 ].value->setStackStringValue(a); + + EngineMarshallData( b, mArgc, mArgv ); + EngineMarshallData( c, mArgc, mArgv ); + EngineMarshallData( d, mArgc, mArgv ); + EngineMarshallData( e, mArgc, mArgv ); + EngineMarshallData( f, mArgc, mArgv ); + + return R( EngineUnmarshallData< R >()( _exec() ) ); + } + else + { + SimConsoleThreadExecCallback cb; + SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc+5, NULL, true, &cb); + evt->populateArgs(mArgv); + mArgv[ 0 ].value->setStackStringValue(a); + + EngineMarshallData( b, mArgc, mArgv ); + EngineMarshallData( c, mArgc, mArgv ); + EngineMarshallData( d, mArgc, mArgv ); + EngineMarshallData( e, mArgc, mArgv ); + EngineMarshallData( f, mArgc, mArgv ); + + Sim::postEvent(mThis, evt, Sim::getCurrentTime()); + + return R( EngineUnmarshallData< R >()( cb.waitForResult() ) ); + } + } + + template< typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G > + R call( A a, B b, C c, D d, E e, F f, G g ) + { + if (Con::isMainThread()) + { + ConsoleStackFrameSaver sav; sav.save(); + CSTK.reserveValues(mArgc+6, mArgv); + mArgv[ 0 ].value->setStackStringValue(a); + + EngineMarshallData( b, mArgc, mArgv ); + EngineMarshallData( c, mArgc, mArgv ); + EngineMarshallData( d, mArgc, mArgv ); + EngineMarshallData( e, mArgc, mArgv ); + EngineMarshallData( f, mArgc, mArgv ); + EngineMarshallData( g, mArgc, mArgv ); + + return R( EngineUnmarshallData< R >()( _exec() ) ); + } + else + { + SimConsoleThreadExecCallback cb; + SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc+6, NULL, true, &cb); + evt->populateArgs(mArgv); + mArgv[ 0 ].value->setStackStringValue(a); + + EngineMarshallData( b, mArgc, mArgv ); + EngineMarshallData( c, mArgc, mArgv ); + EngineMarshallData( d, mArgc, mArgv ); + EngineMarshallData( e, mArgc, mArgv ); + EngineMarshallData( f, mArgc, mArgv ); + EngineMarshallData( g, mArgc, mArgv ); + + Sim::postEvent(mThis, evt, Sim::getCurrentTime()); + + return R( EngineUnmarshallData< R >()( cb.waitForResult() ) ); + } + } + + template< typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H > + R call( A a, B b, C c, D d, E e, F f, G g, H h ) + { + if (Con::isMainThread()) + { + ConsoleStackFrameSaver sav; sav.save(); + CSTK.reserveValues(mArgc+7, mArgv); + mArgv[ 0 ].value->setStackStringValue(a); + + EngineMarshallData( b, mArgc, mArgv ); + EngineMarshallData( c, mArgc, mArgv ); + EngineMarshallData( d, mArgc, mArgv ); + EngineMarshallData( e, mArgc, mArgv ); + EngineMarshallData( f, mArgc, mArgv ); + EngineMarshallData( g, mArgc, mArgv ); + EngineMarshallData( h, mArgc, mArgv ); + + return R( EngineUnmarshallData< R >()( _exec() ) ); + } + else + { + SimConsoleThreadExecCallback cb; + SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc+7, NULL, true, &cb); + evt->populateArgs(mArgv); + mArgv[ 0 ].value->setStackStringValue(a); + + EngineMarshallData( b, mArgc, mArgv ); + EngineMarshallData( c, mArgc, mArgv ); + EngineMarshallData( d, mArgc, mArgv ); + EngineMarshallData( e, mArgc, mArgv ); + EngineMarshallData( f, mArgc, mArgv ); + EngineMarshallData( g, mArgc, mArgv ); + EngineMarshallData( h, mArgc, mArgv ); + + Sim::postEvent(mThis, evt, Sim::getCurrentTime()); + + return R( EngineUnmarshallData< R >()( cb.waitForResult() ) ); + } + } + + template< typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I > + R call( A a, B b, C c, D d, E e, F f, G g, H h, I i ) + { + if (Con::isMainThread()) + { + ConsoleStackFrameSaver sav; sav.save(); + CSTK.reserveValues(mArgc+8, mArgv); + mArgv[ 0 ].value->setStackStringValue(a); + + EngineMarshallData( b, mArgc, mArgv ); + EngineMarshallData( c, mArgc, mArgv ); + EngineMarshallData( d, mArgc, mArgv ); + EngineMarshallData( e, mArgc, mArgv ); + EngineMarshallData( f, mArgc, mArgv ); + EngineMarshallData( g, mArgc, mArgv ); + EngineMarshallData( h, mArgc, mArgv ); + EngineMarshallData( i, mArgc, mArgv ); + + return R( EngineUnmarshallData< R >()( _exec() ) ); + } + else + { + SimConsoleThreadExecCallback cb; + SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc+8, NULL, true, &cb); + evt->populateArgs(mArgv); + mArgv[ 0 ].value->setStackStringValue(a); + + EngineMarshallData( b, mArgc, mArgv ); + EngineMarshallData( c, mArgc, mArgv ); + EngineMarshallData( d, mArgc, mArgv ); + EngineMarshallData( e, mArgc, mArgv ); + EngineMarshallData( f, mArgc, mArgv ); + EngineMarshallData( g, mArgc, mArgv ); + EngineMarshallData( h, mArgc, mArgv ); + EngineMarshallData( i, mArgc, mArgv ); + + Sim::postEvent(mThis, evt, Sim::getCurrentTime()); + + return R( EngineUnmarshallData< R >()( cb.waitForResult() ) ); + } + } + + template< typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I, typename J > + R call( A a, B b, C c, D d, E e, F f, G g, H h, I i, J j ) + { + if (Con::isMainThread()) + { + ConsoleStackFrameSaver sav; sav.save(); + CSTK.reserveValues(mArgc+9, mArgv); + mArgv[ 0 ].value->setStackStringValue(a); + + EngineMarshallData( b, mArgc, mArgv ); + EngineMarshallData( c, mArgc, mArgv ); + EngineMarshallData( d, mArgc, mArgv ); + EngineMarshallData( e, mArgc, mArgv ); + EngineMarshallData( f, mArgc, mArgv ); + EngineMarshallData( g, mArgc, mArgv ); + EngineMarshallData( h, mArgc, mArgv ); + EngineMarshallData( i, mArgc, mArgv ); + EngineMarshallData( j, mArgc, mArgv ); + + return R( EngineUnmarshallData< R >()( _exec() ) ); + } + else + { + SimConsoleThreadExecCallback cb; + SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc+9, NULL, true, &cb); + evt->populateArgs(mArgv); + mArgv[ 0 ].value->setStackStringValue(a); + + EngineMarshallData( b, mArgc, mArgv ); + EngineMarshallData( c, mArgc, mArgv ); + EngineMarshallData( d, mArgc, mArgv ); + EngineMarshallData( e, mArgc, mArgv ); + EngineMarshallData( f, mArgc, mArgv ); + EngineMarshallData( g, mArgc, mArgv ); + EngineMarshallData( h, mArgc, mArgv ); + EngineMarshallData( i, mArgc, mArgv ); + EngineMarshallData( j, mArgc, mArgv ); + + Sim::postEvent(mThis, evt, Sim::getCurrentTime()); + + return R( EngineUnmarshallData< R >()( cb.waitForResult() ) ); + } + } + + 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 > + R call( A a, B b, C c, D d, E e, F f, G g, H h, I i, J j, K k ) + { + if (Con::isMainThread()) + { + ConsoleStackFrameSaver sav; sav.save(); + CSTK.reserveValues(mArgc+10, mArgv); + mArgv[ 0 ].value->setStackStringValue(a); + + EngineMarshallData( b, mArgc, mArgv ); + EngineMarshallData( c, mArgc, mArgv ); + EngineMarshallData( d, mArgc, mArgv ); + EngineMarshallData( e, mArgc, mArgv ); + EngineMarshallData( f, mArgc, mArgv ); + EngineMarshallData( g, mArgc, mArgv ); + EngineMarshallData( h, mArgc, mArgv ); + EngineMarshallData( i, mArgc, mArgv ); + EngineMarshallData( j, mArgc, mArgv ); + EngineMarshallData( k, mArgc, mArgv ); + + return R( EngineUnmarshallData< R >()( _exec() ) ); + } + else + { + SimConsoleThreadExecCallback cb; + SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc+10, NULL, true, &cb); + evt->populateArgs(mArgv); + mArgv[ 0 ].value->setStackStringValue(a); + + EngineMarshallData( b, mArgc, mArgv ); + EngineMarshallData( c, mArgc, mArgv ); + EngineMarshallData( d, mArgc, mArgv ); + EngineMarshallData( e, mArgc, mArgv ); + EngineMarshallData( f, mArgc, mArgv ); + EngineMarshallData( g, mArgc, mArgv ); + EngineMarshallData( h, mArgc, mArgv ); + EngineMarshallData( i, mArgc, mArgv ); + EngineMarshallData( j, mArgc, mArgv ); + EngineMarshallData( k, mArgc, mArgv ); + + Sim::postEvent(mThis, evt, Sim::getCurrentTime()); + + return R( EngineUnmarshallData< R >()( cb.waitForResult() ) ); + } + } + + 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 > + 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 ) + { + if (Con::isMainThread()) + { + ConsoleStackFrameSaver sav; sav.save(); + CSTK.reserveValues(mArgc+11, mArgv); + mArgv[ 0 ].value->setStackStringValue(a); + + EngineMarshallData( b, mArgc, mArgv ); + EngineMarshallData( c, mArgc, mArgv ); + EngineMarshallData( d, mArgc, mArgv ); + EngineMarshallData( e, mArgc, mArgv ); + EngineMarshallData( f, mArgc, mArgv ); + EngineMarshallData( g, mArgc, mArgv ); + EngineMarshallData( h, mArgc, mArgv ); + EngineMarshallData( i, mArgc, mArgv ); + EngineMarshallData( j, mArgc, mArgv ); + EngineMarshallData( k, mArgc, mArgv ); + EngineMarshallData( l, mArgc, mArgv ); + + return R( EngineUnmarshallData< R >()( _exec() ) ); + } + else + { + SimConsoleThreadExecCallback cb; + SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc+11, NULL, true, &cb); + evt->populateArgs(mArgv); + mArgv[ 0 ].value->setStackStringValue(a); + + EngineMarshallData( b, mArgc, mArgv ); + EngineMarshallData( c, mArgc, mArgv ); + EngineMarshallData( d, mArgc, mArgv ); + EngineMarshallData( e, mArgc, mArgv ); + EngineMarshallData( f, mArgc, mArgv ); + EngineMarshallData( g, mArgc, mArgv ); + EngineMarshallData( h, mArgc, mArgv ); + EngineMarshallData( i, mArgc, mArgv ); + EngineMarshallData( j, mArgc, mArgv ); + EngineMarshallData( k, mArgc, mArgv ); + EngineMarshallData( l, mArgc, mArgv ); + + Sim::postEvent(mThis, evt, Sim::getCurrentTime()); + + return R( EngineUnmarshallData< R >()( cb.waitForResult() ) ); + } + } + +}; + +// Override for when first parameter is const char* +template<> struct _EngineConsoleExecCallbackHelper : public _BaseEngineConsoleCallbackHelper +{ + _EngineConsoleExecCallbackHelper( const char *callbackName ) + { + mThis = NULL; + mArgc = mInitialArgc = 1; + mCallbackName = StringTable->insert(callbackName); + } + + template< typename R > + R call() + { + if (Con::isMainThread()) + { + ConsoleStackFrameSaver sav; sav.save(); + CSTK.reserveValues(mArgc, mArgv); + mArgv[ 0 ].value->setStackStringValue(mCallbackName); + return R( EngineUnmarshallData< R >()( _exec() ) ); + } + else + { + SimConsoleThreadExecCallback cb; + SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc, NULL, false, &cb); + evt->populateArgs(mArgv); + mArgv[ 0 ].value->setStackStringValue(mCallbackName); + + Sim::postEvent((SimObject*)Sim::getRootGroup(), evt, Sim::getCurrentTime()); + return R( EngineUnmarshallData< R >()( cb.waitForResult() ) ); + } + } + + + + template< typename R, typename A > + R call( A a ) + { + if (Con::isMainThread()) + { + ConsoleStackFrameSaver sav; sav.save(); + CSTK.reserveValues(mArgc+1, mArgv); + mArgv[ 0 ].value->setStackStringValue(mCallbackName); + + EngineMarshallData( a, mArgc, mArgv ); + + return R( EngineUnmarshallData< R >()( _exec() ) ); + } + else + { + SimConsoleThreadExecCallback cb; + SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc+1, NULL, false, &cb); + evt->populateArgs(mArgv); + mArgv[ 0 ].value->setStackStringValue(mCallbackName); + + EngineMarshallData( a, mArgc, mArgv ); + + Sim::postEvent((SimObject*)Sim::getRootGroup(), evt, Sim::getCurrentTime()); + + return R( EngineUnmarshallData< R >()( cb.waitForResult() ) ); + } + } + + template< typename R, typename A, typename B > + R call( A a, B b ) + { + if (Con::isMainThread()) + { + ConsoleStackFrameSaver sav; sav.save(); + CSTK.reserveValues(mArgc+2, mArgv); + mArgv[ 0 ].value->setStackStringValue(mCallbackName); + + EngineMarshallData( a, mArgc, mArgv ); + EngineMarshallData( b, mArgc, mArgv ); + + return R( EngineUnmarshallData< R >()( _exec() ) ); + } + else + { + SimConsoleThreadExecCallback cb; + SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc+2, NULL, false, &cb); + evt->populateArgs(mArgv); + mArgv[ 0 ].value->setStackStringValue(mCallbackName); + + EngineMarshallData( a, mArgc, mArgv ); + EngineMarshallData( b, mArgc, mArgv ); + + Sim::postEvent((SimObject*)Sim::getRootGroup(), evt, Sim::getCurrentTime()); + + return R( EngineUnmarshallData< R >()( cb.waitForResult() ) ); + } + } + + template< typename R, typename A, typename B, typename C > + R call( A a, B b, C c ) + { + if (Con::isMainThread()) + { + ConsoleStackFrameSaver sav; sav.save(); + CSTK.reserveValues(mArgc+3, mArgv); + mArgv[ 0 ].value->setStackStringValue(mCallbackName); + + EngineMarshallData( a, mArgc, mArgv ); + EngineMarshallData( b, mArgc, mArgv ); + EngineMarshallData( c, mArgc, mArgv ); + + return R( EngineUnmarshallData< R >()( _exec() ) ); + } + else + { + SimConsoleThreadExecCallback cb; + SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc+3, NULL, false, &cb); + evt->populateArgs(mArgv); + mArgv[ 0 ].value->setStackStringValue(mCallbackName); + + EngineMarshallData( a, mArgc, mArgv ); + EngineMarshallData( b, mArgc, mArgv ); + EngineMarshallData( c, mArgc, mArgv ); + + Sim::postEvent((SimObject*)Sim::getRootGroup(), evt, Sim::getCurrentTime()); + + return R( EngineUnmarshallData< R >()( cb.waitForResult() ) ); + } + } + + template< typename R, typename A, typename B, typename C, typename D > + R call( A a, B b, C c, D d ) + { + if (Con::isMainThread()) + { + ConsoleStackFrameSaver sav; sav.save(); + CSTK.reserveValues(mArgc+4, mArgv); + mArgv[ 0 ].value->setStackStringValue(mCallbackName); + + EngineMarshallData( a, mArgc, mArgv ); + EngineMarshallData( b, mArgc, mArgv ); + EngineMarshallData( c, mArgc, mArgv ); + EngineMarshallData( d, mArgc, mArgv ); + + return R( EngineUnmarshallData< R >()( _exec() ) ); + } + else + { + SimConsoleThreadExecCallback cb; + SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc+4, NULL, false, &cb); + evt->populateArgs(mArgv); + mArgv[ 0 ].value->setStackStringValue(mCallbackName); + + EngineMarshallData( a, mArgc, mArgv ); + EngineMarshallData( b, mArgc, mArgv ); + EngineMarshallData( c, mArgc, mArgv ); + EngineMarshallData( d, mArgc, mArgv ); + + Sim::postEvent((SimObject*)Sim::getRootGroup(), evt, Sim::getCurrentTime()); + + return R( EngineUnmarshallData< R >()( cb.waitForResult() ) ); + } + } + + template< typename R, typename A, typename B, typename C, typename D, typename E > + R call( A a, B b, C c, D d, E e ) + { + if (Con::isMainThread()) + { + ConsoleStackFrameSaver sav; sav.save(); + CSTK.reserveValues(mArgc+5, mArgv); + mArgv[ 0 ].value->setStackStringValue(mCallbackName); + + EngineMarshallData( a, mArgc, mArgv ); + EngineMarshallData( b, mArgc, mArgv ); + EngineMarshallData( c, mArgc, mArgv ); + EngineMarshallData( d, mArgc, mArgv ); + EngineMarshallData( e, mArgc, mArgv ); + + return R( EngineUnmarshallData< R >()( _exec() ) ); + } + else + { + SimConsoleThreadExecCallback cb; + SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc+5, NULL, false, &cb); + evt->populateArgs(mArgv); + mArgv[ 0 ].value->setStackStringValue(mCallbackName); + + EngineMarshallData( a, mArgc, mArgv ); + EngineMarshallData( b, mArgc, mArgv ); + EngineMarshallData( c, mArgc, mArgv ); + EngineMarshallData( d, mArgc, mArgv ); + EngineMarshallData( e, mArgc, mArgv ); + + Sim::postEvent((SimObject*)Sim::getRootGroup(), evt, Sim::getCurrentTime()); + + return R( EngineUnmarshallData< R >()( cb.waitForResult() ) ); + } + } + + template< typename R, typename A, typename B, typename C, typename D, typename E, typename F > + R call( A a, B b, C c, D d, E e, F f ) + { + if (Con::isMainThread()) + { + ConsoleStackFrameSaver sav; sav.save(); + CSTK.reserveValues(mArgc+6, mArgv); + mArgv[ 0 ].value->setStackStringValue(mCallbackName); + + EngineMarshallData( a, mArgc, mArgv ); + EngineMarshallData( b, mArgc, mArgv ); + EngineMarshallData( c, mArgc, mArgv ); + EngineMarshallData( d, mArgc, mArgv ); + EngineMarshallData( e, mArgc, mArgv ); + EngineMarshallData( f, mArgc, mArgv ); + + return R( EngineUnmarshallData< R >()( _exec() ) ); + } + else + { + SimConsoleThreadExecCallback cb; + SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc+6, NULL, false, &cb); + evt->populateArgs(mArgv); + mArgv[ 0 ].value->setStackStringValue(mCallbackName); + + EngineMarshallData( a, mArgc, mArgv ); + EngineMarshallData( b, mArgc, mArgv ); + EngineMarshallData( c, mArgc, mArgv ); + EngineMarshallData( d, mArgc, mArgv ); + EngineMarshallData( e, mArgc, mArgv ); + EngineMarshallData( f, mArgc, mArgv ); + + Sim::postEvent((SimObject*)Sim::getRootGroup(), evt, Sim::getCurrentTime()); + + return R( EngineUnmarshallData< R >()( cb.waitForResult() ) ); + } + } + + template< typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G > + R call( A a, B b, C c, D d, E e, F f, G g ) + { + if (Con::isMainThread()) + { + ConsoleStackFrameSaver sav; sav.save(); + CSTK.reserveValues(mArgc+7, mArgv); + mArgv[ 0 ].value->setStackStringValue(mCallbackName); + + EngineMarshallData( a, mArgc, mArgv ); + EngineMarshallData( b, mArgc, mArgv ); + EngineMarshallData( c, mArgc, mArgv ); + EngineMarshallData( d, mArgc, mArgv ); + EngineMarshallData( e, mArgc, mArgv ); + EngineMarshallData( f, mArgc, mArgv ); + EngineMarshallData( g, mArgc, mArgv ); + + return R( EngineUnmarshallData< R >()( _exec() ) ); + } + else + { + SimConsoleThreadExecCallback cb; + SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc+7, NULL, false, &cb); + evt->populateArgs(mArgv); + mArgv[ 0 ].value->setStackStringValue(mCallbackName); + + EngineMarshallData( a, mArgc, mArgv ); + EngineMarshallData( b, mArgc, mArgv ); + EngineMarshallData( c, mArgc, mArgv ); + EngineMarshallData( d, mArgc, mArgv ); + EngineMarshallData( e, mArgc, mArgv ); + EngineMarshallData( f, mArgc, mArgv ); + EngineMarshallData( g, mArgc, mArgv ); + + Sim::postEvent((SimObject*)Sim::getRootGroup(), evt, Sim::getCurrentTime()); + + return R( EngineUnmarshallData< R >()( cb.waitForResult() ) ); + } + } + + template< typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H > + R call( A a, B b, C c, D d, E e, F f, G g, H h ) + { + if (Con::isMainThread()) + { + ConsoleStackFrameSaver sav; sav.save(); + CSTK.reserveValues(mArgc+8, mArgv); + mArgv[ 0 ].value->setStackStringValue(mCallbackName); + + EngineMarshallData( a, mArgc, mArgv ); + EngineMarshallData( b, mArgc, mArgv ); + EngineMarshallData( c, mArgc, mArgv ); + EngineMarshallData( d, mArgc, mArgv ); + EngineMarshallData( e, mArgc, mArgv ); + EngineMarshallData( f, mArgc, mArgv ); + EngineMarshallData( g, mArgc, mArgv ); + EngineMarshallData( h, mArgc, mArgv ); + + return R( EngineUnmarshallData< R >()( _exec() ) ); + } + else + { + SimConsoleThreadExecCallback cb; + SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc+8, NULL, false, &cb); + evt->populateArgs(mArgv); + mArgv[ 0 ].value->setStackStringValue(mCallbackName); + + EngineMarshallData( a, mArgc, mArgv ); + EngineMarshallData( b, mArgc, mArgv ); + EngineMarshallData( c, mArgc, mArgv ); + EngineMarshallData( d, mArgc, mArgv ); + EngineMarshallData( e, mArgc, mArgv ); + EngineMarshallData( f, mArgc, mArgv ); + EngineMarshallData( g, mArgc, mArgv ); + EngineMarshallData( h, mArgc, mArgv ); + + Sim::postEvent((SimObject*)Sim::getRootGroup(), evt, Sim::getCurrentTime()); + + return R( EngineUnmarshallData< R >()( cb.waitForResult() ) ); + } + } + + template< typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I > + R call( A a, B b, C c, D d, E e, F f, G g, H h, I i ) + { + if (Con::isMainThread()) + { + ConsoleStackFrameSaver sav; sav.save(); + CSTK.reserveValues(mArgc+9, mArgv); + mArgv[ 0 ].value->setStackStringValue(mCallbackName); + + EngineMarshallData( a, mArgc, mArgv ); + EngineMarshallData( b, mArgc, mArgv ); + EngineMarshallData( c, mArgc, mArgv ); + EngineMarshallData( d, mArgc, mArgv ); + EngineMarshallData( e, mArgc, mArgv ); + EngineMarshallData( f, mArgc, mArgv ); + EngineMarshallData( g, mArgc, mArgv ); + EngineMarshallData( h, mArgc, mArgv ); + EngineMarshallData( i, mArgc, mArgv ); + + return R( EngineUnmarshallData< R >()( _exec() ) ); + } + else + { + SimConsoleThreadExecCallback cb; + SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc+9, NULL, false, &cb); + evt->populateArgs(mArgv); + mArgv[ 0 ].value->setStackStringValue(mCallbackName); + + EngineMarshallData( a, mArgc, mArgv ); + EngineMarshallData( b, mArgc, mArgv ); + EngineMarshallData( c, mArgc, mArgv ); + EngineMarshallData( d, mArgc, mArgv ); + EngineMarshallData( e, mArgc, mArgv ); + EngineMarshallData( f, mArgc, mArgv ); + EngineMarshallData( g, mArgc, mArgv ); + EngineMarshallData( h, mArgc, mArgv ); + EngineMarshallData( i, mArgc, mArgv ); + + Sim::postEvent((SimObject*)Sim::getRootGroup(), evt, Sim::getCurrentTime()); + + return R( EngineUnmarshallData< R >()( cb.waitForResult() ) ); + } + } + + template< typename R, typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I, typename J > + R call( A a, B b, C c, D d, E e, F f, G g, H h, I i, J j ) + { + if (Con::isMainThread()) + { + ConsoleStackFrameSaver sav; sav.save(); + CSTK.reserveValues(mArgc+10, mArgv); + mArgv[ 0 ].value->setStackStringValue(mCallbackName); + + EngineMarshallData( a, mArgc, mArgv ); + EngineMarshallData( b, mArgc, mArgv ); + EngineMarshallData( c, mArgc, mArgv ); + EngineMarshallData( d, mArgc, mArgv ); + EngineMarshallData( e, mArgc, mArgv ); + EngineMarshallData( f, mArgc, mArgv ); + EngineMarshallData( g, mArgc, mArgv ); + EngineMarshallData( h, mArgc, mArgv ); + EngineMarshallData( i, mArgc, mArgv ); + EngineMarshallData( j, mArgc, mArgv ); + + return R( EngineUnmarshallData< R >()( _exec() ) ); + } + else + { + SimConsoleThreadExecCallback cb; + SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc+10, NULL, false, &cb); + evt->populateArgs(mArgv); + mArgv[ 0 ].value->setStackStringValue(mCallbackName); + + EngineMarshallData( a, mArgc, mArgv ); + EngineMarshallData( b, mArgc, mArgv ); + EngineMarshallData( c, mArgc, mArgv ); + EngineMarshallData( d, mArgc, mArgv ); + EngineMarshallData( e, mArgc, mArgv ); + EngineMarshallData( f, mArgc, mArgv ); + EngineMarshallData( g, mArgc, mArgv ); + EngineMarshallData( h, mArgc, mArgv ); + EngineMarshallData( i, mArgc, mArgv ); + EngineMarshallData( j, mArgc, mArgv ); + + Sim::postEvent((SimObject*)Sim::getRootGroup(), evt, Sim::getCurrentTime()); + + return R( EngineUnmarshallData< R >()( cb.waitForResult() ) ); + } + } + + 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 > + R call( A a, B b, C c, D d, E e, F f, G g, H h, I i, J j, K k ) + { + if (Con::isMainThread()) + { + ConsoleStackFrameSaver sav; sav.save(); + CSTK.reserveValues(mArgc+11, mArgv); + mArgv[ 0 ].value->setStackStringValue(mCallbackName); + + EngineMarshallData( a, mArgc, mArgv ); + EngineMarshallData( b, mArgc, mArgv ); + EngineMarshallData( c, mArgc, mArgv ); + EngineMarshallData( d, mArgc, mArgv ); + EngineMarshallData( e, mArgc, mArgv ); + EngineMarshallData( f, mArgc, mArgv ); + EngineMarshallData( g, mArgc, mArgv ); + EngineMarshallData( h, mArgc, mArgv ); + EngineMarshallData( i, mArgc, mArgv ); + EngineMarshallData( j, mArgc, mArgv ); + EngineMarshallData( k, mArgc, mArgv ); + + return R( EngineUnmarshallData< R >()( _exec() ) ); + } + else + { + SimConsoleThreadExecCallback cb; + SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc+11, NULL, false, &cb); + evt->populateArgs(mArgv); + mArgv[ 0 ].value->setStackStringValue(mCallbackName); + + EngineMarshallData( a, mArgc, mArgv ); + EngineMarshallData( b, mArgc, mArgv ); + EngineMarshallData( c, mArgc, mArgv ); + EngineMarshallData( d, mArgc, mArgv ); + EngineMarshallData( e, mArgc, mArgv ); + EngineMarshallData( f, mArgc, mArgv ); + EngineMarshallData( g, mArgc, mArgv ); + EngineMarshallData( h, mArgc, mArgv ); + EngineMarshallData( i, mArgc, mArgv ); + EngineMarshallData( j, mArgc, mArgv ); + EngineMarshallData( k, mArgc, mArgv ); + + Sim::postEvent((SimObject*)Sim::getRootGroup(), evt, Sim::getCurrentTime()); + + return R( EngineUnmarshallData< R >()( cb.waitForResult() ) ); + } + } + + 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 > + 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 ) + { + if (Con::isMainThread()) + { + ConsoleStackFrameSaver sav; sav.save(); + CSTK.reserveValues(mArgc+12, mArgv); + mArgv[ 0 ].value->setStackStringValue(mCallbackName); + + EngineMarshallData( a, mArgc, mArgv ); + EngineMarshallData( b, mArgc, mArgv ); + EngineMarshallData( c, mArgc, mArgv ); + EngineMarshallData( d, mArgc, mArgv ); + EngineMarshallData( e, mArgc, mArgv ); + EngineMarshallData( f, mArgc, mArgv ); + EngineMarshallData( g, mArgc, mArgv ); + EngineMarshallData( h, mArgc, mArgv ); + EngineMarshallData( i, mArgc, mArgv ); + EngineMarshallData( j, mArgc, mArgv ); + EngineMarshallData( k, mArgc, mArgv ); + EngineMarshallData( l, mArgc, mArgv ); + + return R( EngineUnmarshallData< R >()( _exec() ) ); + } + else + { + SimConsoleThreadExecCallback cb; + SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc+12, NULL, false, &cb); + evt->populateArgs(mArgv); + mArgv[ 0 ].value->setStackStringValue(mCallbackName); + + EngineMarshallData( a, mArgc, mArgv ); + EngineMarshallData( b, mArgc, mArgv ); + EngineMarshallData( c, mArgc, mArgv ); + EngineMarshallData( d, mArgc, mArgv ); + EngineMarshallData( e, mArgc, mArgv ); + EngineMarshallData( f, mArgc, mArgv ); + EngineMarshallData( g, mArgc, mArgv ); + EngineMarshallData( h, mArgc, mArgv ); + EngineMarshallData( i, mArgc, mArgv ); + EngineMarshallData( j, mArgc, mArgv ); + EngineMarshallData( k, mArgc, mArgv ); + EngineMarshallData( l, mArgc, mArgv ); + + Sim::postEvent((SimObject*)Sim::getRootGroup(), evt, Sim::getCurrentTime()); + + return R( EngineUnmarshallData< R >()( cb.waitForResult() ) ); + } + } + +}; + // Re-enable some VC warnings we disabled for this file. #pragma warning( pop ) // 4510 and 4610 -#endif // !_ENGINEAPI_H_ +#endif // !_ENGINEAPI_H_ \ No newline at end of file diff --git a/Engine/source/console/sim.h b/Engine/source/console/sim.h index 013721872..682bab0c9 100644 --- a/Engine/source/console/sim.h +++ b/Engine/source/console/sim.h @@ -157,13 +157,13 @@ namespace Sim SimTime getTargetTime(); /// a target time of 0 on an event means current event - U32 postEvent(SimObject*, SimEvent*, U32 targetTime); + U32 postEvent(SimObject*, SimEvent*, SimTime targetTime); - inline U32 postEvent(SimObjectId iD,SimEvent*evt, U32 targetTime) + inline U32 postEvent(SimObjectId iD,SimEvent*evt, SimTime targetTime) { return postEvent(findObject(iD), evt, targetTime); } - inline U32 postEvent(const char *objectName,SimEvent*evt, U32 targetTime) + inline U32 postEvent(const char *objectName,SimEvent*evt, SimTime targetTime) { return postEvent(findObject(objectName), evt, targetTime); } diff --git a/Engine/source/console/simEvents.cpp b/Engine/source/console/simEvents.cpp index afb634bdf..4aa5c9920 100644 --- a/Engine/source/console/simEvents.cpp +++ b/Engine/source/console/simEvents.cpp @@ -39,7 +39,10 @@ SimConsoleEvent::SimConsoleEvent(S32 argc, ConsoleValueRef *argv, bool onObject) mArgv[i].value = new ConsoleValue(); mArgv[i].value->type = ConsoleValue::TypeInternalString; mArgv[i].value->init(); - mArgv[i].value->setStringValue((const char*)argv[i]); + if (argv) + { + mArgv[i].value->setStringValue((const char*)argv[i]); + } } } @@ -92,10 +95,19 @@ void SimConsoleEvent::process(SimObject* object) } } +void SimConsoleEvent::populateArgs(ConsoleValueRef *argv) +{ + for (U32 i=0; irelease(); } -const char *SimConsoleThreadExecCallback::waitForResult() +ConsoleValueRef SimConsoleThreadExecCallback::waitForResult() { if(sem->acquire(true)) { @@ -129,7 +141,7 @@ SimConsoleThreadExecEvent::SimConsoleThreadExecEvent(S32 argc, ConsoleValueRef * void SimConsoleThreadExecEvent::process(SimObject* object) { - const char *retVal; + ConsoleValueRef retVal; if(mOnObject) retVal = Con::execute(object, mArgc, mArgv); else diff --git a/Engine/source/console/simEvents.h b/Engine/source/console/simEvents.h index 360cf27ec..362bdb325 100644 --- a/Engine/source/console/simEvents.h +++ b/Engine/source/console/simEvents.h @@ -114,19 +114,24 @@ public: ~SimConsoleEvent(); virtual void process(SimObject *object); + + /// Creates a reference to our internal args list in argv + void populateArgs(ConsoleValueRef *argv); }; + +// NOTE: SimConsoleThreadExecCallback & SimConsoleThreadExecEvent moved to engineAPI.h /// Used by Con::threadSafeExecute() struct SimConsoleThreadExecCallback { Semaphore *sem; - const char *retVal; + ConsoleValueRef retVal; SimConsoleThreadExecCallback(); ~SimConsoleThreadExecCallback(); - void handleCallback(const char *ret); - const char *waitForResult(); + void handleCallback(ConsoleValueRef ret); + ConsoleValueRef waitForResult(); }; class SimConsoleThreadExecEvent : public SimConsoleEvent @@ -136,6 +141,7 @@ class SimConsoleThreadExecEvent : public SimConsoleEvent public: SimConsoleThreadExecEvent(S32 argc, ConsoleValueRef *argv, bool onObject, SimConsoleThreadExecCallback *callback); + SimConsoleThreadExecCallback& getCB() { return *cb; } virtual void process(SimObject *object); }; diff --git a/Engine/source/console/simObjectList.cpp b/Engine/source/console/simObjectList.cpp index be4b10b22..3dec06767 100644 --- a/Engine/source/console/simObjectList.cpp +++ b/Engine/source/console/simObjectList.cpp @@ -23,7 +23,8 @@ #include "platform/platform.h" #include "console/simObjectList.h" -#include "console/console.h" +#include "console/simBase.h" +#include "console/engineAPI.h" #include "console/sim.h" #include "console/simObject.h" diff --git a/Engine/source/console/stringStack.cpp b/Engine/source/console/stringStack.cpp index 23215eaec..45fd83740 100644 --- a/Engine/source/console/stringStack.cpp +++ b/Engine/source/console/stringStack.cpp @@ -31,12 +31,11 @@ void ConsoleValueStack::getArgcArgv(StringTableEntry name, U32 *argc, ConsoleVal U32 argCount = getMin(mStackPos - startStack, (U32)MaxArgs - 1); *in_argv = mArgv; - mArgv[0] = name; + mArgv[0].value = CSTK.pushStackString(name); for(U32 i = 0; i < argCount; i++) { ConsoleValueRef *ref = &mArgv[i+1]; ref->value = &mStack[startStack + i]; - ref->stringStackValue = NULL; } argCount++; @@ -91,11 +90,43 @@ void ConsoleValueStack::pushValue(ConsoleValue &variable) mStack[mStackPos++].setIntValue((S32)variable.getIntValue()); case ConsoleValue::TypeInternalFloat: mStack[mStackPos++].setFloatValue((F32)variable.getFloatValue()); + case ConsoleValue::TypeInternalStringStackPtr: + mStack[mStackPos++].setStringStackPtrValue(variable.getStringStackPtr()); default: mStack[mStackPos++].setStringValue(variable.getStringValue()); } } +ConsoleValue* ConsoleValueStack::reserveValues(U32 count) +{ + U32 startPos = mStackPos; + if (startPos+count >= ConsoleValueStack::MaxStackDepth) { + AssertFatal(false, "Console Value Stack is empty"); + return NULL; + } + + //Con::printf("[%i]CSTK reserveValues %i", mStackPos, count); + mStackPos += count; + return &mStack[startPos]; +} + +bool ConsoleValueStack::reserveValues(U32 count, ConsoleValueRef *outValues) +{ + U32 startPos = mStackPos; + if (startPos+count >= ConsoleValueStack::MaxStackDepth) { + AssertFatal(false, "Console Value Stack is empty"); + return false; + } + + //Con::printf("[%i]CSTK reserveValues %i", mStackPos, count); + for (U32 i=0; imBuffer + mOffset; } + #endif diff --git a/Engine/source/console/telnetConsole.cpp b/Engine/source/console/telnetConsole.cpp index 2a6e0258a..46e2421f4 100644 --- a/Engine/source/console/telnetConsole.cpp +++ b/Engine/source/console/telnetConsole.cpp @@ -21,9 +21,11 @@ //----------------------------------------------------------------------------- #include "platform/platform.h" + +#include "console/simBase.h" +#include "console/engineAPI.h" #include "console/telnetConsole.h" -#include "console/engineAPI.h" #include "core/strings/stringFunctions.h" #include "core/util/journal/process.h" #include "core/module.h" diff --git a/Engine/source/console/test/consoleTest.cpp b/Engine/source/console/test/consoleTest.cpp new file mode 100644 index 000000000..aa0b3970e --- /dev/null +++ b/Engine/source/console/test/consoleTest.cpp @@ -0,0 +1,287 @@ +#ifdef TORQUE_TESTS_ENABLED +#include "testing/unitTesting.h" +#include "platform/platform.h" +#include "console/simBase.h" +#include "console/consoleTypes.h" +#include "console/simBase.h" +#include "console/engineAPI.h" +#include "math/mMath.h" +#include "console/stringStack.h" + +TEST(Con, executef) +{ + char buffer[128]; + Con::evaluate("if (isObject(TestConExec)) {\r\nTestConExec.delete();\r\n}\r\nfunction testExecutef(%a,%b,%c,%d,%e,%f,%g,%h,%i,%j,%k){return %a SPC %b SPC %c SPC %d SPC %e SPC %f SPC %g SPC %h SPC %i SPC %j SPC %k;}\r\nfunction TestConExec::testThisFunction(%this,%a,%b,%c,%d,%e,%f,%g,%h,%i,%j){ return %a SPC %b SPC %c SPC %d SPC %e SPC %f SPC %g SPC %h SPC %i SPC %j;}\r\nnew ScriptObject(TestConExec);\r\n", false, "test"); + + SimObject *testObject = NULL; + Sim::findObject("TestConExec", testObject); + + EXPECT_TRUE(testObject != NULL) + << "TestConExec object should exist"; + + // Check basic calls with SimObject. We'll do this for every single possible call just to make sure. + const char *returnValue = NULL; + + returnValue = Con::executef(testObject, "testThisFunction"); + EXPECT_TRUE(dStricmp(returnValue, " ") == 0) << + "All values should be printed in the correct order"; + + returnValue = Con::executef(testObject, "testThisFunction", "a"); + EXPECT_TRUE(dStricmp(returnValue, "a ") == 0) << + "All values should be printed in the correct order"; + + returnValue = Con::executef(testObject, "testThisFunction", "a", "b"); + EXPECT_TRUE(dStricmp(returnValue, "a b ") == 0) << + "All values should be printed in the correct order"; + + returnValue = Con::executef(testObject, "testThisFunction", "a", "b", "c"); + EXPECT_TRUE(dStricmp(returnValue, "a b c ") == 0) << + "All values should be printed in the correct order"; + + returnValue = Con::executef(testObject, "testThisFunction", "a", "b", "c", "d"); + EXPECT_TRUE(dStricmp(returnValue, "a b c d ") == 0) << + "All values should be printed in the correct order"; + + returnValue = Con::executef(testObject, "testThisFunction", "a", "b", "c", "d", "e"); + EXPECT_TRUE(dStricmp(returnValue, "a b c d e ") == 0) << + "All values should be printed in the correct order"; + + returnValue = Con::executef(testObject, "testThisFunction", "a", "b", "c", "d", "e", "f"); + EXPECT_TRUE(dStricmp(returnValue, "a b c d e f ") == 0) << + "All values should be printed in the correct order"; + + returnValue = Con::executef(testObject, "testThisFunction", "a", "b", "c", "d", "e", "f", "g"); + EXPECT_TRUE(dStricmp(returnValue, "a b c d e f g ") == 0) << + "All values should be printed in the correct order"; + + returnValue = Con::executef(testObject, "testThisFunction", "a", "b", "c", "d", "e", "f", "g", "h"); + EXPECT_TRUE(dStricmp(returnValue, "a b c d e f g h ") == 0) << + "All values should be printed in the correct order"; + + returnValue = Con::executef(testObject, "testThisFunction", "a", "b", "c", "d", "e", "f", "g", "h", "i"); + EXPECT_TRUE(dStricmp(returnValue, "a b c d e f g h i ") == 0) << + "All values should be printed in the correct order"; + + // Now test without the object + + returnValue = Con::executef("testExecutef"); + EXPECT_TRUE(dStricmp(returnValue, " ") == 0) << + "All values should be printed in the correct order"; + + returnValue = Con::executef("testExecutef", "a"); + EXPECT_TRUE(dStricmp(returnValue, "a ") == 0) << + "All values should be printed in the correct order"; + + returnValue = Con::executef("testExecutef", "a", "b"); + EXPECT_TRUE(dStricmp(returnValue, "a b ") == 0) << + "All values should be printed in the correct order"; + + returnValue = Con::executef("testExecutef", "a", "b", "c"); + EXPECT_TRUE(dStricmp(returnValue, "a b c ") == 0) << + "All values should be printed in the correct order"; + + returnValue = Con::executef("testExecutef", "a", "b", "c", "d"); + EXPECT_TRUE(dStricmp(returnValue, "a b c d ") == 0) << + "All values should be printed in the correct order"; + + returnValue = Con::executef("testExecutef", "a", "b", "c", "d", "e"); + EXPECT_TRUE(dStricmp(returnValue, "a b c d e ") == 0) << + "All values should be printed in the correct order"; + + returnValue = Con::executef("testExecutef", "a", "b", "c", "d", "e", "f"); + EXPECT_TRUE(dStricmp(returnValue, "a b c d e f ") == 0) << + "All values should be printed in the correct order"; + + returnValue = Con::executef("testExecutef", "a", "b", "c", "d", "e", "f", "g"); + EXPECT_TRUE(dStricmp(returnValue, "a b c d e f g ") == 0) << + "All values should be printed in the correct order"; + + returnValue = Con::executef("testExecutef", "a", "b", "c", "d", "e", "f", "g", "h"); + EXPECT_TRUE(dStricmp(returnValue, "a b c d e f g h ") == 0) << + "All values should be printed in the correct order"; + + returnValue = Con::executef("testExecutef", "a", "b", "c", "d", "e", "f", "g", "h", "i"); + EXPECT_TRUE(dStricmp(returnValue, "a b c d e f g h i ") == 0) << + "All values should be printed in the correct order"; + + returnValue = Con::executef("testExecutef", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j"); + EXPECT_TRUE(dStricmp(returnValue, "a b c d e f g h i j ") == 0) << + "All values should be printed in the correct order"; + + // Test type conversions with and without SimObject... + + // Integer + returnValue = Con::executef(testObject, "testThisFunction", 123); + EXPECT_TRUE(dStricmp(returnValue, "123 ") == 0) << + "Integer should be converted"; + returnValue = Con::executef("testExecutef", 123); + EXPECT_TRUE(dStricmp(returnValue, "123 ") == 0) << + "Integer should be converted"; + + // Float + returnValue = Con::executef(testObject, "testThisFunction", (F32)123.4); + EXPECT_TRUE(dStricmp(returnValue, "123.4 ") == 0) << + "Float should be converted"; + returnValue = Con::executef("testExecutef", (F32)123.4); + EXPECT_TRUE(dStricmp(returnValue, "123.4 ") == 0) << + "Float should be converted"; + + // SimObject + dSprintf(buffer, sizeof(buffer), "%i ", testObject->getId()); + returnValue = Con::executef(testObject, "testThisFunction", testObject); + EXPECT_TRUE(dStricmp(returnValue, buffer) == 0) << + "SimObject should be converted"; + dSprintf(buffer, sizeof(buffer), "%i ", testObject->getId()); + returnValue = Con::executef("testExecutef", testObject); + EXPECT_TRUE(dStricmp(returnValue, buffer) == 0) << + "SimObject should be converted"; + + // Point3F + Point3F point(1,2,3); + returnValue = Con::executef(testObject, "testThisFunction", point); + EXPECT_TRUE(dStricmp(returnValue, "1 2 3 ") == 0) << + "Point3F should be converted"; + returnValue = Con::executef("testExecutef", point); + EXPECT_TRUE(dStricmp(returnValue, "1 2 3 ") == 0) << + "Point3F should be converted"; + + // Finally test the function arg offset. This should be consistently 0 after each call + + EXPECT_TRUE(STR.mFunctionOffset == 0) << + "Function offset should be 0"; + + const char *floatArg = Con::getFloatArg(1.23); + EXPECT_TRUE(STR.mFunctionOffset > 0) << + "Function offset should not be 0"; + + Con::executef("testExecutef", floatArg); + + EXPECT_TRUE(STR.mFunctionOffset == 0) << + "Function offset should be 0"; + + floatArg = Con::getFloatArg(1.23); + EXPECT_TRUE(STR.mFunctionOffset > 0) << + "Function offset should not be 0"; + + Con::executef("testImaginaryFunction_", floatArg); + + EXPECT_TRUE(STR.mFunctionOffset == 0) << + "Function offset should be 0"; +} + +TEST(Con, execute) +{ + Con::evaluate("if (isObject(TestConExec)) {\r\nTestConExec.delete();\r\n}\r\nfunction testScriptExecuteFunction(%a,%b) {return %a SPC %b;}\nfunction TestConExec::testScriptExecuteFunction(%this, %a,%b) {return %a SPC %b;}new ScriptObject(TestConExec);\r\n", false, "testExecute"); + + U32 startStackPos = CSTK.mStackPos; + U32 startStringStackPos = STR.mStart; + U32 startStackFrame = CSTK.mFrame; + + SimObject *testObject = NULL; + Sim::findObject("TestConExec", testObject); + + EXPECT_TRUE(testObject != NULL) + << "TestConExec object should exist"; + + // const char* versions of execute should maintain stack + const char *argv[] = {"testScriptExecuteFunction", "1", "2"}; + const char *argvObject[] = {"testScriptExecuteFunction", "", "1", "2"}; + const char *returnValue = Con::execute(3, argv); + + EXPECT_TRUE(dStricmp(returnValue, "1 2") == 0) << + "execute should return 1 2"; + + EXPECT_TRUE(CSTK.mStackPos == startStackPos) << + "execute should restore stack"; + + returnValue = Con::execute(testObject, 4, argvObject); + + EXPECT_TRUE(dStricmp(returnValue, "1 2") == 0) << + "execute should return 1 2"; + + EXPECT_TRUE(CSTK.mStackPos == startStackPos) << + "execute should restore stack"; + + // ConsoleValueRef versions of execute should not restore stack + CSTK.pushFrame(); + STR.pushFrame(); + + ConsoleValue valueArg[4]; + ConsoleValueRef refArg[4]; + ConsoleValue valueArgObject[4]; + ConsoleValueRef refArgObject[4]; + for (U32 i=0; i<4; i++) + { + refArg[i].value = &valueArg[i]; + refArgObject[i].value = &valueArgObject[i]; + valueArgObject[i].init(); + valueArg[i].init(); + } + + refArg[0] = "testScriptExecuteFunction"; + refArg[1] = "1"; + refArg[2] = "2"; + + refArgObject[0] = "testScriptExecuteFunction"; + refArgObject[2] = "1"; + refArgObject[3] = "2"; + + returnValue = Con::execute(3, refArg); + + EXPECT_TRUE(dStricmp(returnValue, "1 2") == 0) << + "execute should return 1 2"; + + EXPECT_TRUE(CSTK.mStackPos == startStackPos) << + "execute should restore stack"; + + CSTK.popFrame(); + STR.popFrame(); + + CSTK.pushFrame(); + STR.pushFrame(); + + returnValue = Con::execute(testObject, 4, refArgObject); + + EXPECT_TRUE(dStricmp(returnValue, "1 2") == 0) << + "execute should return 1 2"; + + EXPECT_TRUE(CSTK.mStackPos == startStackPos) << + "execute should restore stack"; + + CSTK.popFrame(); + STR.popFrame(); +} + +static U32 gConsoleStackFrame = 0; + +ConsoleFunction(testConsoleStackFrame, S32, 1, 1, "") +{ + gConsoleStackFrame = CSTK.mFrame; + return (U32)Con::executef("testScriptEvalFunction"); // execute a sub function which manipulates the stack +} + +TEST(Con, evaluate) +{ + U32 startStackPos = CSTK.mStackPos; + U32 startStringStackPos = STR.mStart; + S32 returnValue = Con::evaluate("function testScriptEvalFunction() {return \"1\"@\"2\"@\"3\";}\nreturn testConsoleStackFrame();", false, "testEvaluate"); + U32 frame = CSTK.mFrame; + + EXPECT_TRUE(returnValue == 123) << + "Evaluate should return 123"; + + EXPECT_TRUE(gConsoleStackFrame == (frame+2)) << + "Console stack frame inside function should be +2"; + + EXPECT_TRUE(CSTK.mFrame == frame) << + "Console stack frame outside function should be the same as before"; + + EXPECT_TRUE(STR.mStart == startStringStackPos) << + "Console string stack should not be changed"; + + EXPECT_TRUE(CSTK.mStackPos == startStackPos) << + "Console stack should not be changed"; + +} + +#endif \ No newline at end of file diff --git a/Engine/source/console/test/engineAPITest.cpp b/Engine/source/console/test/engineAPITest.cpp new file mode 100644 index 000000000..48e780531 --- /dev/null +++ b/Engine/source/console/test/engineAPITest.cpp @@ -0,0 +1,150 @@ +#ifdef TORQUE_TESTS_ENABLED +#include "testing/unitTesting.h" +#include "platform/platform.h" +#include "console/simBase.h" +#include "console/consoleTypes.h" +#include "console/simBase.h" +#include "console/engineAPI.h" +#include "math/mMath.h" + + +TEST(EngineAPI, EngineMarshallData) +{ + // Reserve some values + ConsoleValue values[16]; + ConsoleValueRef refValues[16]; + + for (U32 i=0; i<16; i++) + { + values[i].init(); + refValues[i].value = &values[i]; + } + + // Basic string casting... + SimObject *foo = new SimObject(); + foo->registerObject(); + + const char *value = EngineMarshallData(foo); + EXPECT_TRUE(dStricmp(value, foo->getIdString()) == 0) + << "SimObject should be casted to its ID"; + + U32 unsignedNumber = 123; + S32 signedNumber = -123; + value = EngineMarshallData(unsignedNumber); + EXPECT_TRUE(dStricmp(value, "123") == 0) + << "Integer should be converted to 123"; + value = EngineMarshallData(signedNumber); + EXPECT_TRUE(dStricmp(value, "-123") == 0) + << "Integer should be converted to -123"; + + bool boolValue = true; + value = EngineMarshallData(boolValue); + EXPECT_TRUE(dStricmp(value, "1") == 0) + << "Bool should be converted to 1"; + + Point3F point(1,2,3); + value = EngineMarshallData(point); + EXPECT_TRUE(dStricmp(value, "1 2 3") == 0) + << "Point3F should be converted to 1 2 3"; + + F32 floatValue = 1.23f; + value = EngineMarshallData(floatValue); + EXPECT_TRUE(dStricmp(value, "1.23") == 0) + << "F32 should be converted to 1.23"; + + // Argv based casting + S32 argc = 0; + EngineMarshallData(foo, argc, refValues); + EngineMarshallData((const SimObject*)foo, argc, refValues); + EngineMarshallData(point, argc, refValues); + EngineMarshallData(unsignedNumber, argc, refValues); + EngineMarshallData(signedNumber, argc, refValues); + EngineMarshallData(boolValue, argc, refValues); + EngineMarshallData(floatValue, argc, refValues); + + EXPECT_TRUE(argc == 7) + << "7 args should have been set"; + + EXPECT_TRUE(values[0].type == ConsoleValue::TypeInternalInt && values[0].getSignedIntValue() == foo->getId()) + << "1st arg should be foo's id"; + + EXPECT_TRUE(values[1].type == ConsoleValue::TypeInternalInt && values[1].getSignedIntValue() == foo->getId()) + << "2nd arg should be foo's id"; + + EXPECT_TRUE(values[2].type == ConsoleValue::TypeInternalString && dStricmp(values[2].getStringValue(), "1 2 3") == 0) + << "3rd arg should be 1 2 3"; + + EXPECT_TRUE(values[3].type == ConsoleValue::TypeInternalFloat && values[3].getSignedIntValue() == 123) + << "4th arg should be 123"; + + EXPECT_TRUE(values[4].type == ConsoleValue::TypeInternalFloat && values[4].getSignedIntValue() == -123) + << "5th arg should be -123"; + + EXPECT_TRUE(values[5].type == ConsoleValue::TypeInternalFloat && values[5].getBoolValue() == true) + << "6th arg should be -123"; + + EXPECT_TRUE(values[6].type == ConsoleValue::TypeInternalFloat && mRound(values[6].getFloatValue() * 100) == 123) + << "7th arg should be 1.23"; + + foo->deleteObject(); +} + +TEST(EngineAPI, EngineUnMarshallData) +{ + SimObject *foo = new SimObject(); + foo->registerObject(); + + SimObject *testFoo = EngineUnmarshallData()(foo->getIdString()); + + EXPECT_TRUE(foo == testFoo) + << "Unmarshalling foo's id should return foo"; + + testFoo = EngineUnmarshallData()("ShouldNotExist_Really123"); + EXPECT_TRUE(testFoo == NULL) + << "Unmarshalling a bad object should return NULL"; + + foo->deleteObject(); +} + +TEST(EngineAPI, _EngineConsoleCallbackHelper) +{ + Con::evaluate("if (isObject(TestConExec)) {\r\nTestConExec.delete();\r\n}\r\nfunction testExecutef(%a,%b,%c,%d,%e,%f,%g,%h,%i,%j,%k){return %a SPC %b SPC %c SPC %d SPC %e SPC %f SPC %g SPC %h SPC %i SPC %j SPC %k;}\r\nfunction TestConExec::testThisFunction(%this,%a,%b,%c,%d,%e,%f,%g,%h,%i,%j){ return %a SPC %b SPC %c SPC %d SPC %e SPC %f SPC %g SPC %h SPC %i SPC %j;}\r\nnew ScriptObject(TestConExec);\r\n", false, "test"); + + SimObject *testObject = NULL; + Sim::findObject("TestConExec", testObject); + + _EngineConsoleCallbackHelper helper("testExecutef", NULL); + const char *returnValue = helper.call("a", "b", "c"); + + EXPECT_TRUE(dStricmp(returnValue, "a b c ") == 0) << + "All values should be printed in the correct order"; + + _EngineConsoleCallbackHelper objectHelper("testThisFunction", testObject); + returnValue = helper.call("a", "b", "c"); + + EXPECT_TRUE(dStricmp(returnValue, "a b c ") == 0) << + "All values should be printed in the correct order"; +} + +// NOTE: this is also indirectly tested by the executef tests +TEST(EngineAPI, _EngineConsoleExecCallbackHelper) +{ + Con::evaluate("if (isObject(TestConExec)) {\r\nTestConExec.delete();\r\n}\r\nfunction testExecutef(%a,%b,%c,%d,%e,%f,%g,%h,%i,%j,%k){return %a SPC %b SPC %c SPC %d SPC %e SPC %f SPC %g SPC %h SPC %i SPC %j SPC %k;}\r\nfunction TestConExec::testThisFunction(%this,%a,%b,%c,%d,%e,%f,%g,%h,%i,%j){ return %a SPC %b SPC %c SPC %d SPC %e SPC %f SPC %g SPC %h SPC %i SPC %j;}\r\nnew ScriptObject(TestConExec);\r\n", false, "test"); + + SimObject *testObject = NULL; + Sim::findObject("TestConExec", testObject); + + _EngineConsoleExecCallbackHelper helper("testExecutef"); + const char *returnValue = helper.call("a", "b", "c"); + + EXPECT_TRUE(dStricmp(returnValue, "a b c ") == 0) << + "All values should be printed in the correct order"; + + _EngineConsoleExecCallbackHelper objectHelper(testObject); + returnValue = objectHelper.call("testThisFunction", "a", "b", "c"); + + EXPECT_TRUE(dStricmp(returnValue, "a b c ") == 0) << + "All values should be printed in the correct order"; +} + +#endif \ No newline at end of file diff --git a/Engine/source/forest/editor/forestSelectionTool.cpp b/Engine/source/forest/editor/forestSelectionTool.cpp index b3bc964c3..4b51684fd 100644 --- a/Engine/source/forest/editor/forestSelectionTool.cpp +++ b/Engine/source/forest/editor/forestSelectionTool.cpp @@ -517,7 +517,7 @@ bool ForestSelectionTool::updateGuiInfo() Con::executef( statusbar, "setInfo", text.c_str() ); - Con::executef( statusbar, "setSelectionObjectsByCount", Con::getIntArg( mSelection.size() ) ); + Con::executef( statusbar, "setSelectionObjectsByCount", mSelection.size() ); return true; } diff --git a/Engine/source/gui/controls/guiConsoleTextCtrl.cpp b/Engine/source/gui/controls/guiConsoleTextCtrl.cpp index 617099646..877970852 100644 --- a/Engine/source/gui/controls/guiConsoleTextCtrl.cpp +++ b/Engine/source/gui/controls/guiConsoleTextCtrl.cpp @@ -113,7 +113,7 @@ void GuiConsoleTextCtrl::onPreRender() { if ( mConsoleExpression.isNotEmpty() ) { - mResult = Con::evaluatef( "$guiConsoleTextCtrlTemp = %s;", mConsoleExpression.c_str() ); + mResult = (const char*)Con::evaluatef( "$guiConsoleTextCtrlTemp = %s;", mConsoleExpression.c_str() ); // Of the resulting string we will be printing, // Find the number of lines and length of each. diff --git a/Engine/source/gui/controls/guiListBoxCtrl.cpp b/Engine/source/gui/controls/guiListBoxCtrl.cpp index 54ecadca2..c5b50a94f 100644 --- a/Engine/source/gui/controls/guiListBoxCtrl.cpp +++ b/Engine/source/gui/controls/guiListBoxCtrl.cpp @@ -71,7 +71,7 @@ IMPLEMENT_CALLBACK( GuiListBoxCtrl, onClearSelection, void, (),(), "@see GuiControl\n\n" ); -IMPLEMENT_CALLBACK( GuiListBoxCtrl, onUnSelect, void, ( const char* index, const char* itemText),( index, itemText ), +IMPLEMENT_CALLBACK( GuiListBoxCtrl, onUnSelect, void, ( S32 index, const char* itemText),( index, itemText ), "@brief Called whenever a selected item in the list has been unselected.\n\n" "@param index Index id of the item that was unselected\n" "@param itemText Text for the list entry at the index id that was unselected\n\n" @@ -85,7 +85,7 @@ IMPLEMENT_CALLBACK( GuiListBoxCtrl, onUnSelect, void, ( const char* index, const "@see GuiControl\n\n" ); -IMPLEMENT_CALLBACK( GuiListBoxCtrl, onSelect, void, ( const char* index , const char* itemText ),( index, itemText ), +IMPLEMENT_CALLBACK( GuiListBoxCtrl, onSelect, void, ( S32 index , const char* itemText ),( index, itemText ), "@brief Called whenever an item in the list is selected.\n\n" "@param index Index id for the item in the list that was selected.\n" "@param itemText Text for the list item at the index that was selected.\n\n" @@ -111,7 +111,7 @@ IMPLEMENT_CALLBACK( GuiListBoxCtrl, onDoubleClick, void, (),(), "@see GuiControl\n\n" ); -IMPLEMENT_CALLBACK( GuiListBoxCtrl, onMouseUp, void, (const char* itemHit, const char* mouseClickCount),( itemHit,mouseClickCount), +IMPLEMENT_CALLBACK( GuiListBoxCtrl, onMouseUp, void, ( S32 itemHit, S32 mouseClickCount ),( itemHit,mouseClickCount ), "@brief Called whenever the mouse has previously been clicked down (onMouseDown) and has now been raised on the control.\n" "If an item in the list was hit during the click cycle, then the index id of the clicked object along with how many clicks occured are passed\n" "into the callback.\n\n" @@ -309,7 +309,7 @@ void GuiListBoxCtrl::removeSelection( LBItem *item, S32 index ) { mSelectedItems.erase( &mSelectedItems[i] ); item->isSelected = false; - onUnSelect_callback(Con::getIntArg(index), item->itemText); + onUnSelect_callback(index, item->itemText); return; } } @@ -355,7 +355,7 @@ void GuiListBoxCtrl::addSelection( LBItem *item, S32 index ) item->isSelected = true; mSelectedItems.push_front( item ); - onSelect_callback(Con::getIntArg( index ), item->itemText); + onSelect_callback(index, item->itemText); } S32 GuiListBoxCtrl::getItemIndex( LBItem *item ) @@ -1224,7 +1224,7 @@ void GuiListBoxCtrl::onMouseUp( const GuiEvent& event ) { S32 itemHit = -1; if( hitTest( event.mousePoint, itemHit ) ) - onMouseUp_callback(Con::getIntArg( itemHit ), Con::getIntArg( event.mouseClickCount ) ); + onMouseUp_callback( itemHit, event.mouseClickCount ); // Execute console command execConsoleCallback(); diff --git a/Engine/source/gui/controls/guiListBoxCtrl.h b/Engine/source/gui/controls/guiListBoxCtrl.h index 9f8020247..016e4ac63 100644 --- a/Engine/source/gui/controls/guiListBoxCtrl.h +++ b/Engine/source/gui/controls/guiListBoxCtrl.h @@ -57,10 +57,10 @@ public: DECLARE_CALLBACK( void, onMouseDragged, ()); DECLARE_CALLBACK( void, onClearSelection, ()); - DECLARE_CALLBACK( void, onUnSelect, ( const char* index, const char* itemText)); - DECLARE_CALLBACK( void, onSelect, ( const char* index , const char* itemText )); + DECLARE_CALLBACK( void, onUnSelect, ( S32 index, const char* itemText)); + DECLARE_CALLBACK( void, onSelect, ( S32 index , const char* itemText )); DECLARE_CALLBACK( void, onDoubleClick, ()); - DECLARE_CALLBACK( void, onMouseUp, (const char* itemHit, const char* mouseClickCount)); + DECLARE_CALLBACK( void, onMouseUp, ( S32 itemHit, S32 mouseClickCount )); DECLARE_CALLBACK( void, onDeleteKey, ()); DECLARE_CALLBACK( bool, isObjectMirrored, ( const char* indexIdString )); diff --git a/Engine/source/gui/controls/guiMLTextCtrl.cpp b/Engine/source/gui/controls/guiMLTextCtrl.cpp index 4233190c6..da7591349 100644 --- a/Engine/source/gui/controls/guiMLTextCtrl.cpp +++ b/Engine/source/gui/controls/guiMLTextCtrl.cpp @@ -73,7 +73,7 @@ IMPLEMENT_CALLBACK( GuiMLTextCtrl, onURL, void, ( const char* url ),( url ), "@see GuiControl\n\n" ); -IMPLEMENT_CALLBACK( GuiMLTextCtrl, onResize, void, ( const char* width, const char* maxY ),( width, maxY ), +IMPLEMENT_CALLBACK( GuiMLTextCtrl, onResize, void, ( S32 width, S32 maxY ),( width, maxY ), "@brief Called whenever the control size changes.\n\n" "@param width The new width value for the control\n" "@param maxY The current maximum allowed Y value for the control\n\n" @@ -2133,7 +2133,7 @@ textemit: processEmitAtoms(); emitNewLine(mScanPos); setHeight( mMaxY ); - onResize_callback(Con::getIntArg( getWidth() ), Con::getIntArg( mMaxY ) ); + onResize_callback( getWidth(), mMaxY ); //make sure the cursor is still visible - this handles if we're a child of a scroll ctrl... ensureCursorOnScreen(); diff --git a/Engine/source/gui/controls/guiMLTextCtrl.h b/Engine/source/gui/controls/guiMLTextCtrl.h index f917a3dd9..3aefa22e7 100644 --- a/Engine/source/gui/controls/guiMLTextCtrl.h +++ b/Engine/source/gui/controls/guiMLTextCtrl.h @@ -128,7 +128,7 @@ class GuiMLTextCtrl : public GuiControl ~GuiMLTextCtrl(); DECLARE_CALLBACK( void, onURL, (const char* url)); - DECLARE_CALLBACK( void, onResize, ( const char* width, const char* maxY )); + DECLARE_CALLBACK( void, onResize, ( S32 width, S32 maxY )); // Text retrieval functions U32 getNumChars() const; diff --git a/Engine/source/gui/controls/guiTextListCtrl.cpp b/Engine/source/gui/controls/guiTextListCtrl.cpp index dfd191795..4ac1e200e 100644 --- a/Engine/source/gui/controls/guiTextListCtrl.cpp +++ b/Engine/source/gui/controls/guiTextListCtrl.cpp @@ -52,7 +52,7 @@ ConsoleDocClass( GuiTextListCtrl, ); -IMPLEMENT_CALLBACK( GuiTextListCtrl, onSelect, void, (const char* cellid, const char* text),( cellid , text ), +IMPLEMENT_CALLBACK( GuiTextListCtrl, onSelect, void, (S32 cellid, const char* text),( cellid , text ), "@brief Called whenever an item in the list is selected.\n\n" "@param cellid The ID of the cell that was selected\n" "@param text The text in the selected cel\n\n" @@ -66,7 +66,7 @@ IMPLEMENT_CALLBACK( GuiTextListCtrl, onSelect, void, (const char* cellid, const "@see GuiControl\n\n" ); -IMPLEMENT_CALLBACK( GuiTextListCtrl, onDeleteKey, void, ( const char* id ),( id ), +IMPLEMENT_CALLBACK( GuiTextListCtrl, onDeleteKey, void, ( S32 id ),( id ), "@brief Called when the delete key has been pressed.\n\n" "@param id Id of the selected item in the list\n" "@tsexample\n" @@ -172,7 +172,7 @@ bool GuiTextListCtrl::cellSelected(Point2I cell) void GuiTextListCtrl::onCellSelected(Point2I cell) { - onSelect_callback(Con::getIntArg(mList[cell.y].id), mList[cell.y].text); + onSelect_callback(mList[cell.y].id, mList[cell.y].text); execConsoleCallback(); } @@ -497,7 +497,7 @@ bool GuiTextListCtrl::onKeyDown( const GuiEvent &event ) break; case KEY_DELETE: if ( mSelectedCell.y >= 0 && mSelectedCell.y < mList.size() ) - onDeleteKey_callback(Con::getIntArg( mList[mSelectedCell.y].id ) ); + onDeleteKey_callback( mList[mSelectedCell.y].id ); break; default: return( Parent::onKeyDown( event ) ); diff --git a/Engine/source/gui/controls/guiTextListCtrl.h b/Engine/source/gui/controls/guiTextListCtrl.h index 45e156ee8..ebc75f2df 100644 --- a/Engine/source/gui/controls/guiTextListCtrl.h +++ b/Engine/source/gui/controls/guiTextListCtrl.h @@ -67,8 +67,8 @@ class GuiTextListCtrl : public GuiArrayCtrl DECLARE_CATEGORY( "Gui Lists" ); DECLARE_DESCRIPTION( "A control that displays text in tabular form." ); - DECLARE_CALLBACK( void, onSelect, (const char* cellid, const char* text)); - DECLARE_CALLBACK( void, onDeleteKey, ( const char* id )); + DECLARE_CALLBACK( void, onSelect, (S32 cellid, const char* text)); + DECLARE_CALLBACK( void, onDeleteKey, ( S32 id )); static void initPersistFields(); diff --git a/Engine/source/gui/editor/guiMenuBar.cpp b/Engine/source/gui/editor/guiMenuBar.cpp index 3ecf7960c..aeabdca30 100644 --- a/Engine/source/gui/editor/guiMenuBar.cpp +++ b/Engine/source/gui/editor/guiMenuBar.cpp @@ -111,7 +111,7 @@ IMPLEMENT_CALLBACK( GuiMenuBar, onMouseInMenu, void, (bool isInMenu),( isInMenu "@see GuiTickCtrl\n\n" ); -IMPLEMENT_CALLBACK( GuiMenuBar, onMenuSelect, void, ( const char* menuId, const char* menuText ),( menuId , menuText ), +IMPLEMENT_CALLBACK( GuiMenuBar, onMenuSelect, void, ( S32 menuId, const char* menuText ),( menuId , menuText ), "@brief Called whenever a menu is selected.\n\n" "@param menuId Index id of the clicked menu\n" "@param menuText Text of the clicked menu\n\n" @@ -125,7 +125,7 @@ IMPLEMENT_CALLBACK( GuiMenuBar, onMenuSelect, void, ( const char* menuId, const "@see GuiTickCtrl\n\n" ); -IMPLEMENT_CALLBACK( GuiMenuBar, onMenuItemSelect, void, ( const char* menuId, const char* menuText, const char* menuItemId, const char* menuItemText ), +IMPLEMENT_CALLBACK( GuiMenuBar, onMenuItemSelect, void, ( S32 menuId, const char* menuText, S32 menuItemId, const char* menuItemText ), ( menuId, menuText, menuItemId, menuItemText ), "@brief Called whenever an item in a menu is selected.\n\n" "@param menuId Index id of the menu which contains the selected menu item\n" @@ -142,7 +142,7 @@ IMPLEMENT_CALLBACK( GuiMenuBar, onMenuItemSelect, void, ( const char* menuId, co "@see GuiTickCtrl\n\n" ); -IMPLEMENT_CALLBACK( GuiMenuBar, onSubmenuSelect, void, ( const char* submenuId, const char* submenuText ),( submenuId, submenuText ), +IMPLEMENT_CALLBACK( GuiMenuBar, onSubmenuSelect, void, ( S32 submenuId, const char* submenuText ),( submenuId, submenuText ), "@brief Called whenever a submenu is selected.\n\n" "@param submenuId Id of the selected submenu\n" "@param submenuText Text of the selected submenu\n\n" @@ -1393,7 +1393,7 @@ void GuiMenuBar::acceleratorKeyPress(U32 index) if(item->acceleratorIndex == index) { // first, call the script callback for menu selection: - onMenuSelect_callback(Con::getIntArg(menu->id), menu->text); + onMenuSelect_callback(menu->id, menu->text); if(item->visible) menuItemSelected(menu, item); @@ -1575,7 +1575,7 @@ bool GuiSubmenuBackgroundCtrl::pointInControl(const Point2I& parentCoordPoint) void GuiMenuBar::menuItemSelected(GuiMenuBar::Menu *menu, GuiMenuBar::MenuItem *item) { if(item->enabled) - onMenuItemSelect_callback(Con::getIntArg(menu->id), menu->text, Con::getIntArg(item->id), item->text); + onMenuItemSelect_callback(menu->id, menu->text, item->id, item->text); } void GuiMenuBar::onSleep() @@ -1668,7 +1668,7 @@ void GuiMenuBar::onAction() return; // first, call the script callback for menu selection: - onMenuSelect_callback(Con::getIntArg(mouseDownMenu->id), mouseDownMenu->text); + onMenuSelect_callback(mouseDownMenu->id, mouseDownMenu->text); MenuItem *visWalk = mouseDownMenu->firstMenuItem; while(visWalk) @@ -1783,7 +1783,7 @@ void GuiMenuBar::onSubmenuAction(S32 selectionIndex, RectI bounds, Point2I cellS return; // first, call the script callback for menu selection: - onSubmenuSelect_callback(Con::getIntArg(mouseOverSubmenu->id), mouseOverSubmenu->text); + onSubmenuSelect_callback(mouseOverSubmenu->id, mouseOverSubmenu->text); MenuItem *visWalk = mouseOverSubmenu->submenu->firstMenuItem; while(visWalk) diff --git a/Engine/source/gui/editor/guiMenuBar.h b/Engine/source/gui/editor/guiMenuBar.h index 99d54ffce..7bf64d109 100644 --- a/Engine/source/gui/editor/guiMenuBar.h +++ b/Engine/source/gui/editor/guiMenuBar.h @@ -220,10 +220,10 @@ public: static void initPersistFields(); DECLARE_CONOBJECT(GuiMenuBar); - DECLARE_CALLBACK( void, onMouseInMenu, (bool hasLeftMenu)); - DECLARE_CALLBACK( void, onMenuSelect, (const char* menuId, const char* menuText)); - DECLARE_CALLBACK( void, onMenuItemSelect, ( const char* menuId, const char* menuText, const char* menuItemId, const char* menuItemText )); - DECLARE_CALLBACK( void, onSubmenuSelect, ( const char* submenuId, const char* submenuText)); + DECLARE_CALLBACK( void, onMouseInMenu, ( bool hasLeftMenu )); + DECLARE_CALLBACK( void, onMenuSelect, ( S32 menuId, const char* menuText )); + DECLARE_CALLBACK( void, onMenuItemSelect, ( S32 menuId, const char* menuText, S32 menuItemId, const char* menuItemText )); + DECLARE_CALLBACK( void, onSubmenuSelect, ( S32 submenuId, const char* submenuText )); }; #endif diff --git a/Engine/source/gui/editor/inspector/customField.cpp b/Engine/source/gui/editor/inspector/customField.cpp index 8432c07a6..27feb7ebe 100644 --- a/Engine/source/gui/editor/inspector/customField.cpp +++ b/Engine/source/gui/editor/inspector/customField.cpp @@ -20,6 +20,8 @@ // IN THE SOFTWARE. //----------------------------------------------------------------------------- +#include "console/simBase.h" +#include "console/engineAPI.h" #include "gui/editor/inspector/customField.h" #include "gui/editor/guiInspector.h" diff --git a/Engine/source/gui/editor/inspector/field.cpp b/Engine/source/gui/editor/inspector/field.cpp index b2023ffb2..ac72b2e04 100644 --- a/Engine/source/gui/editor/inspector/field.cpp +++ b/Engine/source/gui/editor/inspector/field.cpp @@ -269,7 +269,7 @@ void GuiInspectorField::setData( const char* data, bool callbacks ) { char buffer[ 2048 ]; expandEscape( buffer, newValue ); - newValue = Con::evaluatef( "%%f = \"%s\"; return ( %s );", oldValue.c_str(), buffer ); + newValue = (const char*)Con::evaluatef( "%%f = \"%s\"; return ( %s );", oldValue.c_str(), buffer ); } else if( type == TypeS32Vector || type == TypeF32Vector diff --git a/Engine/source/lighting/common/sceneLighting.cpp b/Engine/source/lighting/common/sceneLighting.cpp index aa62782f8..2c6f1ddd9 100644 --- a/Engine/source/lighting/common/sceneLighting.cpp +++ b/Engine/source/lighting/common/sceneLighting.cpp @@ -24,6 +24,7 @@ #include "lighting/common/sceneLighting.h" #include "T3D/gameBase/gameConnection.h" +#include "console/engineAPI.h" #include "console/consoleTypes.h" #include "scene/sceneManager.h" #include "lighting/common/shadowVolumeBSP.h" @@ -605,7 +606,7 @@ void SceneLighting::completed(bool success) } if(gCompleteCallback && gCompleteCallback[0]) - Con::executef(gCompleteCallback); + Con::executef((const char*)gCompleteCallback); dFree(gCompleteCallback); gCompleteCallback = NULL; diff --git a/Engine/source/platform/platformRedBook.cpp b/Engine/source/platform/platformRedBook.cpp index 6ca34850c..d95a0eb92 100644 --- a/Engine/source/platform/platformRedBook.cpp +++ b/Engine/source/platform/platformRedBook.cpp @@ -22,6 +22,7 @@ #include "core/strings/stringFunctions.h" #include "console/console.h" +#include "console/simBase.h" #include "console/engineAPI.h" #include "platform/platformRedBook.h" diff --git a/Engine/source/platformSDL/menus/popupMenuSDL.cpp b/Engine/source/platformSDL/menus/popupMenuSDL.cpp index c9d283de5..3d196e1a2 100644 --- a/Engine/source/platformSDL/menus/popupMenuSDL.cpp +++ b/Engine/source/platformSDL/menus/popupMenuSDL.cpp @@ -35,6 +35,7 @@ #include "gui/editor/guiMenuBar.h" #include "platformSDL/menus/PlatformSDLPopupMenuData.h" +#include "console/engineAPI.h" ////////////////////////////////////////////////////////////////////////// // Platform Menu Data diff --git a/Engine/source/platformWin32/menus/popupMenuWin32.cpp b/Engine/source/platformWin32/menus/popupMenuWin32.cpp index a88cd208a..fc3170eeb 100644 --- a/Engine/source/platformWin32/menus/popupMenuWin32.cpp +++ b/Engine/source/platformWin32/menus/popupMenuWin32.cpp @@ -24,6 +24,7 @@ #include "platform/menus/popupMenu.h" #include "platformWin32/platformWin32.h" +#include "console/engineAPI.h" #include "console/consoleTypes.h" #include "gui/core/guiCanvas.h" #include "windowManager/platformWindowMgr.h" diff --git a/Engine/source/sfx/sfxModifier.cpp b/Engine/source/sfx/sfxModifier.cpp index 1931be1d3..f7b4e861a 100644 --- a/Engine/source/sfx/sfxModifier.cpp +++ b/Engine/source/sfx/sfxModifier.cpp @@ -20,6 +20,8 @@ // IN THE SOFTWARE. //----------------------------------------------------------------------------- +#include "console/simBase.h" +#include "console/engineAPI.h" #include "sfx/sfxModifier.h" #include "sfx/sfxSource.h" diff --git a/Engine/source/sfx/sfxParameter.cpp b/Engine/source/sfx/sfxParameter.cpp index a7c6f24b0..2ed4c3ac2 100644 --- a/Engine/source/sfx/sfxParameter.cpp +++ b/Engine/source/sfx/sfxParameter.cpp @@ -22,6 +22,7 @@ #include "sfx/sfxParameter.h" #include "console/consoleTypes.h" +#include "console/simBase.h" #include "console/engineAPI.h" #include "console/simSet.h" #include "math/mMathFn.h" diff --git a/Engine/source/sim/netDownload.cpp b/Engine/source/sim/netDownload.cpp index a53d633ef..00fc6f0fc 100644 --- a/Engine/source/sim/netDownload.cpp +++ b/Engine/source/sim/netDownload.cpp @@ -23,6 +23,7 @@ #include "platform/platform.h" #include "core/dnet.h" #include "console/simBase.h" +#include "console/engineAPI.h" #include "sim/netConnection.h" #include "core/stream/bitStream.h" #include "core/stream/fileStream.h" diff --git a/Engine/source/util/undo.h b/Engine/source/util/undo.h index 3552d3dac..63c78f813 100644 --- a/Engine/source/util/undo.h +++ b/Engine/source/util/undo.h @@ -29,6 +29,12 @@ #ifndef _TVECTOR_H_ #include "core/util/tVector.h" #endif +#ifndef _SIMBASE_H_ +#include "console/simBase.h" +#endif +#ifndef _ENGINEAPI_H_ +#include "console/engineAPI.h" +#endif class UndoManager;