This commit is contained in:
Jeff Hutchinson 2021-04-02 00:57:49 -04:00
parent 02447f0996
commit f776e73b04
11 changed files with 50 additions and 54 deletions

View file

@ -1076,7 +1076,7 @@ ConsoleValue CodeBlock::exec(U32 ip, const char* functionName, Namespace* thisNa
STR.rewind(); STR.rewind();
returnValue.setString(retVal, STR.mLen); returnValue.setString(retVal, STR.mLen);
//STR.setStringValue(returnValue); // Not nice but works. STR.setStringValue(retVal); // Not nice but works.
} }
goto execFinished; goto execFinished;
@ -2070,9 +2070,6 @@ ConsoleValue CodeBlock::exec(U32 ip, const char* functionName, Namespace* thisNa
} }
} }
execFinished: execFinished:
#ifdef TORQUE_DEBUG
AssertFatal(returnValue.getType() == ConsoleValueType::cvNone, "returnValue was never set during script exec");
#endif
if (telDebuggerOn && setFrame < 0) if (telDebuggerOn && setFrame < 0)
TelDebugger->popStackFrame(); TelDebugger->popStackFrame();
@ -2129,8 +2126,6 @@ execFinished:
AssertFatal(!(STR.mStartStackSize < stackStart), "String stack popped too much in script exec"); AssertFatal(!(STR.mStartStackSize < stackStart), "String stack popped too much in script exec");
#endif #endif
if (returnValue.getType() == ConsoleValueType::cvNone)
returnValue.setStringTableEntry(StringTable->EmptyString());
return std::move(returnValue); return std::move(returnValue);
} }

View file

@ -1555,7 +1555,7 @@ ConsoleValue _internalExecute(S32 argc, ConsoleValue argv[])
if (result) if (result)
{ {
ConsoleValue ret; ConsoleValue ret;
ret.setString(methodRes, dStrlen(methodRes)); ret.setString(methodRes);
return std::move(ret); return std::move(ret);
} }
@ -1644,7 +1644,7 @@ static ConsoleValue _internalExecute(SimObject *object, S32 argc, ConsoleValue a
if (result) if (result)
{ {
ConsoleValue val; ConsoleValue val;
val.setString(methodRes, dStrlen(methodRes)); val.setString(methodRes);
return std::move(val); return std::move(val);
} }
@ -1672,7 +1672,7 @@ static ConsoleValue _internalExecute(SimObject *object, S32 argc, ConsoleValue a
gEvalState.thisObject = save; gEvalState.thisObject = save;
// Twiddle it back // Twiddle it back
argv[1].setString(oldIdent, dStrlen(oldIdent)); argv[1].setString(oldIdent);
return std::move(ret); return std::move(ret);
} }
@ -1934,8 +1934,8 @@ void postConsoleInput( RawData data )
// TODO(JTH): Mem leak // TODO(JTH): Mem leak
// Schedule this to happen at the next time event. // Schedule this to happen at the next time event.
ConsoleValue* argv = new ConsoleValue[2]; ConsoleValue* argv = new ConsoleValue[2];
argv[0].setString("eval", 4); argv[0].setString("eval");
argv[1].setString(reinterpret_cast<const char*>(data.data), dStrlen(reinterpret_cast<const char*>(data.data))); argv[1].setString(reinterpret_cast<const char*>(data.data));
Sim::postCurrentEvent(Sim::getRootGroup(), new SimConsoleEvent(2, argv, false)); Sim::postCurrentEvent(Sim::getRootGroup(), new SimConsoleEvent(2, argv, false));
} }
@ -2577,7 +2577,7 @@ StringArrayToConsoleValueWrapper::StringArrayToConsoleValueWrapper(int targc, co
for (int i=0; i<targc; i++) for (int i=0; i<targc; i++)
{ {
argv[i].setString(targv[i], dStrlen(targv[i])); argv[i].setString(targv[i]);
} }
} }

View file

@ -36,6 +36,7 @@
#include "core/util/str.h" #include "core/util/str.h"
#include "core/util/journal/journaledSignal.h" #include "core/util/journal/journaledSignal.h"
#include "core/stringTable.h"
class SimObject; class SimObject;
class Namespace; class Namespace;
@ -119,7 +120,6 @@ extern char *typeValueEmpty;
enum ConsoleValueType enum ConsoleValueType
{ {
cvNone = -5,
cvInteger = -4, cvInteger = -4,
cvFloat = -3, cvFloat = -3,
cvString = -2, cvString = -2,
@ -160,7 +160,7 @@ class ConsoleValue
TORQUE_FORCEINLINE bool hasAllocatedData() const TORQUE_FORCEINLINE bool hasAllocatedData() const
{ {
return type == ConsoleValueType::cvString || isConsoleType(); return (type == ConsoleValueType::cvString || isConsoleType()) && data != NULL;
} }
const char* getConsoleData() const; const char* getConsoleData() const;
@ -170,13 +170,14 @@ class ConsoleValue
if (hasAllocatedData()) if (hasAllocatedData())
{ {
dFree(data); dFree(data);
data = NULL;
} }
} }
public: public:
ConsoleValue() ConsoleValue()
{ {
type = ConsoleValueType::cvNone; setEmptyString();
} }
ConsoleValue(ConsoleValue&& ref) noexcept ConsoleValue(ConsoleValue&& ref) noexcept
@ -186,9 +187,6 @@ public:
switch (ref.type) switch (ref.type)
{ {
TORQUE_UNLIKELY
case cvNone:
break;
case cvInteger: case cvInteger:
i = ref.i; i = ref.i;
break; break;
@ -205,7 +203,7 @@ public:
break; break;
} }
ref.type = cvNone; ref.setEmptyString();
} }
ConsoleValue(const ConsoleValue&) = delete; ConsoleValue(const ConsoleValue&) = delete;
@ -219,12 +217,11 @@ public:
TORQUE_FORCEINLINE void reset() TORQUE_FORCEINLINE void reset()
{ {
cleanupData(); cleanupData();
type = ConsoleValueType::cvNone; setEmptyString();
} }
TORQUE_FORCEINLINE F64 getFloat() const TORQUE_FORCEINLINE F64 getFloat() const
{ {
AssertFatal(type == ConsoleValueType::cvNone, "Attempted to access ConsoleValue when it has no value!");
if (type == ConsoleValueType::cvFloat) if (type == ConsoleValueType::cvFloat)
return f; return f;
if (type == ConsoleValueType::cvInteger) if (type == ConsoleValueType::cvInteger)
@ -236,7 +233,6 @@ public:
TORQUE_FORCEINLINE S64 getInt() const TORQUE_FORCEINLINE S64 getInt() const
{ {
AssertFatal(type == ConsoleValueType::cvNone, "Attempted to access ConsoleValue when it has no value!");
if (type == ConsoleValueType::cvInteger) if (type == ConsoleValueType::cvInteger)
return i; return i;
if (type == ConsoleValueType::cvFloat) if (type == ConsoleValueType::cvFloat)
@ -248,7 +244,6 @@ public:
TORQUE_FORCEINLINE const char* getString() const TORQUE_FORCEINLINE const char* getString() const
{ {
AssertFatal(type == ConsoleValueType::cvNone, "Attempted to access ConsoleValue when it has no value!");
if (isStringType()) if (isStringType())
return s; return s;
if (isNumberType()) if (isNumberType())
@ -263,7 +258,6 @@ public:
TORQUE_FORCEINLINE bool getBool() const TORQUE_FORCEINLINE bool getBool() const
{ {
AssertFatal(type == ConsoleValueType::cvNone, "Attempted to access ConsoleValue when it has no value!");
if (type == ConsoleValueType::cvInteger) if (type == ConsoleValueType::cvInteger)
return (bool)i; return (bool)i;
if (type == ConsoleValueType::cvFloat) if (type == ConsoleValueType::cvFloat)
@ -275,7 +269,6 @@ public:
TORQUE_FORCEINLINE void setFloat(const F64 val) TORQUE_FORCEINLINE void setFloat(const F64 val)
{ {
AssertFatal(type == ConsoleValueType::cvNone, "Attempted to access ConsoleValue when it has no value!");
cleanupData(); cleanupData();
type = ConsoleValueType::cvFloat; type = ConsoleValueType::cvFloat;
f = val; f = val;
@ -290,11 +283,17 @@ public:
TORQUE_FORCEINLINE void setString(const char* val) TORQUE_FORCEINLINE void setString(const char* val)
{ {
setString(val, dStrlen(val)); setString(val, dStrlen(val) + 1);
} }
TORQUE_FORCEINLINE void setString(const char* val, S32 len) TORQUE_FORCEINLINE void setString(const char* val, S32 len)
{ {
if (len == 0)
{
setEmptyString();
return;
}
cleanupData(); cleanupData();
type = ConsoleValueType::cvString; type = ConsoleValueType::cvString;
@ -318,6 +317,11 @@ public:
s = const_cast<char*>(val); s = const_cast<char*>(val);
} }
TORQUE_FORCEINLINE void setEmptyString()
{
setStringTableEntry(StringTable->EmptyString());
}
TORQUE_FORCEINLINE void setConsoleData(S32 consoleType, void* dataPtr, const EnumTable* enumTable) TORQUE_FORCEINLINE void setConsoleData(S32 consoleType, void* dataPtr, const EnumTable* enumTable)
{ {
cleanupData(); cleanupData();

View file

@ -633,6 +633,10 @@ void ExprEvalState::pushFrame(StringTableEntry frameName, Namespace *ns, S32 reg
AssertFatal(!newFrame.getCount(), "ExprEvalState::pushFrame - Dictionary not empty!"); AssertFatal(!newFrame.getCount(), "ExprEvalState::pushFrame - Dictionary not empty!");
ConsoleValue* consoleValArray = new ConsoleValue[registerCount];
localStack.push_back(ConsoleValueFrame(consoleValArray, false));
currentRegisterArray = &localStack.last();
#ifdef DEBUG_SPEW #ifdef DEBUG_SPEW
validate(); validate();
#endif #endif
@ -653,6 +657,13 @@ void ExprEvalState::popFrame()
stack[mStackDepth]->reset(); stack[mStackDepth]->reset();
currentVariable = NULL; currentVariable = NULL;
const ConsoleValueFrame& frame = localStack.last();
localStack.pop_back();
if (!frame.isReference)
delete[] frame.values;
currentRegisterArray = localStack.size() ? &localStack.last() : NULL;
#ifdef DEBUG_SPEW #ifdef DEBUG_SPEW
validate(); validate();
#endif #endif
@ -1296,7 +1307,7 @@ ConsoleValue Namespace::Entry::execute(S32 argc, ConsoleValue *argv, ExprEvalSta
case StringCallbackType: case StringCallbackType:
{ {
const char* str = cb.mStringCallbackFunc(state->thisObject, argc, argv); const char* str = cb.mStringCallbackFunc(state->thisObject, argc, argv);
result.setString(str, dStrlen(str)); result.setString(str);
break; break;
} }
case IntCallbackType: case IntCallbackType:

View file

@ -372,7 +372,7 @@ public:
return; return;
} }
value.setString(newValue, dStrlen(newValue)); value.setString(newValue);
// Fire off the notification if we have one. // Fire off the notification if we have one.
if (notify) if (notify)
@ -456,6 +456,9 @@ struct ConsoleValueFrame
ConsoleValue* values; ConsoleValue* values;
bool isReference; bool isReference;
ConsoleValueFrame() : values(NULL), isReference(false)
{}
ConsoleValueFrame(ConsoleValue* vals, bool isRef) ConsoleValueFrame(ConsoleValue* vals, bool isRef)
{ {
values = vals; values = vals;

View file

@ -171,11 +171,11 @@ inline void EngineMarshallData( F32 arg, S32& argc, ConsoleValue *argv )
} }
inline void EngineMarshallData( const char* arg, S32& argc, ConsoleValue *argv ) inline void EngineMarshallData( const char* arg, S32& argc, ConsoleValue *argv )
{ {
argv[ argc++ ].setString(arg, dStrlen(arg)); argv[ argc++ ].setString(arg);
} }
inline void EngineMarshallData( char* arg, S32& argc, ConsoleValue *argv ) inline void EngineMarshallData( char* arg, S32& argc, ConsoleValue *argv )
{ {
argv[ argc++ ].setString(arg, dStrlen(arg)); argv[ argc++ ].setString(arg);
} }
template< typename T > template< typename T >
@ -1232,7 +1232,7 @@ public:
if (Con::isMainThread()) if (Con::isMainThread())
{ {
ConsoleStackFrameSaver sav; sav.save(); ConsoleStackFrameSaver sav; sav.save();
mArgv[ 0 ].setString(simCB, dStrlen(simCB)); mArgv[ 0 ].setString(simCB);
Helper::marshallEach(mArgc, mArgv, args...); Helper::marshallEach(mArgc, mArgv, args...);
@ -1243,7 +1243,7 @@ public:
SimConsoleThreadExecCallback cb; SimConsoleThreadExecCallback cb;
SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc+sizeof...(ArgTs), NULL, true, &cb); SimConsoleThreadExecEvent *evt = new SimConsoleThreadExecEvent(mArgc+sizeof...(ArgTs), NULL, true, &cb);
evt->populateArgs(mArgv); evt->populateArgs(mArgv);
mArgv[ 0 ].setString(simCB, dStrlen(simCB)); mArgv[ 0 ].setString(simCB);
Helper::marshallEach(mArgc, mArgv, args...); Helper::marshallEach(mArgc, mArgv, args...);

View file

@ -38,7 +38,7 @@ SimConsoleEvent::SimConsoleEvent(S32 argc, ConsoleValue *argv, bool onObject)
{ {
if (argv) if (argv)
{ {
mArgv->setString(argv[i].getString(), dStrlen(argv[i].getString())); mArgv->setString(argv[i].getString());
} }
} }
} }
@ -92,7 +92,7 @@ void SimConsoleEvent::populateArgs(ConsoleValue *argv)
{ {
for (U32 i=0; i<mArgc; i++) for (U32 i=0; i<mArgc; i++)
{ {
argv[i].setString(mArgv[i].getString(), dStrlen(mArgv[i].getString())); argv[i].setString(mArgv[i].getString());
} }
} }
@ -111,7 +111,7 @@ SimConsoleThreadExecCallback::~SimConsoleThreadExecCallback()
void SimConsoleThreadExecCallback::handleCallback(ConsoleValue ret) void SimConsoleThreadExecCallback::handleCallback(ConsoleValue ret)
{ {
// can we move this pls? // can we move this pls?
retVal.setString(ret.getString(), dStrlen(ret.getString())); retVal.setString(ret.getString());
sem->release(); sem->release();
} }

View file

@ -388,8 +388,6 @@ SimObject* findObject(const char* name)
SimObject* findObject(const ConsoleValue &val) SimObject* findObject(const ConsoleValue &val)
{ {
if (val.getType() == ConsoleValueType::cvNone)
return NULL;
if (val.getType() == ConsoleValueType::cvInteger) if (val.getType() == ConsoleValueType::cvInteger)
return findObject((SimObjectId)val.getInt()); return findObject((SimObjectId)val.getInt());
return findObject(val.getString()); return findObject(val.getString());
@ -397,8 +395,6 @@ SimObject* findObject(const ConsoleValue &val)
SimObject* findObject(ConsoleValue* val) SimObject* findObject(ConsoleValue* val)
{ {
if (val->getType() == ConsoleValueType::cvNone)
return NULL;
if (val->getType() == ConsoleValueType::cvInteger) if (val->getType() == ConsoleValueType::cvInteger)
return findObject((SimObjectId)val->getInt()); return findObject((SimObjectId)val->getInt());
return findObject(val->getString()); return findObject(val->getString());

View file

@ -2962,7 +2962,7 @@ DefineEngineStringlyVariadicMethod( SimObject, call, const char*, 3, 0, "( strin
"@param args Zero or more arguments for the method.\n" "@param args Zero or more arguments for the method.\n"
"@return The result of the method call." ) "@return The result of the method call." )
{ {
argv[1].setString(argv[2], dStrlen(argv[2])); argv[1].setString(argv[2]);
return Con::execute( object, argc - 1, argv + 1 ); return Con::execute( object, argc - 1, argv + 1 );
} }

View file

@ -82,7 +82,7 @@ void StringStack::setIntValue(U32 i)
void StringStack::setFloatValue(F64 v) void StringStack::setFloatValue(F64 v)
{ {
validateBufferSize(mStart + 32); validateBufferSize(mStart + 32);
dSprintf(mBuffer + mStart, 32, "%g", v); dSprintf(mBuffer + mStart, 32, "%.9g", v);
mLen = dStrlen(mBuffer + mStart); mLen = dStrlen(mBuffer + mStart);
} }

View file

@ -138,16 +138,6 @@ struct StringStack
return mBuffer + mStartOffsets[mStartStackSize-1]; return mBuffer + mStartOffsets[mStartStackSize-1];
} }
inline StringStackPtr getStringValuePtr()
{
return (getStringValue() - mBuffer);
}
inline StringStackPtr getPreviousStringValuePtr()
{
return (getPreviousStringValue() - mBuffer);
}
/// Advance the start stack, placing a zero length string on the top. /// Advance the start stack, placing a zero length string on the top.
/// ///
/// @note You should use StringStack::push, not this, if you want to /// @note You should use StringStack::push, not this, if you want to
@ -184,9 +174,6 @@ struct StringStack
void popFrame(); void popFrame();
void clearFrames(); void clearFrames();
/// Get the arguments for a function call from the stack.
void getArgcArgv(StringTableEntry name, U32 *argc, const char ***in_argv, bool popStackFrame = false);
}; };
extern StringStack STR; extern StringStack STR;