Jeff Hutchinson 4 gadi atpakaļ
vecāks
revīzija
f776e73b04

+ 1 - 6
Engine/source/console/compiledEval.cpp

@@ -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);
 }
 }
 
 

+ 6 - 6
Engine/source/console/console.cpp

@@ -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[1].setString(reinterpret_cast<const char*>(data.data), dStrlen(reinterpret_cast<const char*>(data.data)));
+   argv[0].setString("eval");
+   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]);
    }
    }
 }
 }
 
 

+ 18 - 14
Engine/source/console/console.h

@@ -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();

+ 12 - 1
Engine/source/console/consoleInternal.cpp

@@ -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:

+ 4 - 1
Engine/source/console/consoleInternal.h

@@ -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;

+ 4 - 4
Engine/source/console/engineAPI.h

@@ -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...);
 
 

+ 3 - 3
Engine/source/console/simEvents.cpp

@@ -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();
 }
 }
 
 

+ 0 - 4
Engine/source/console/simManager.cpp

@@ -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());

+ 1 - 1
Engine/source/console/simObject.cpp

@@ -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 );
 }
 }
 
 

+ 1 - 1
Engine/source/console/stringStack.cpp

@@ -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);
 }
 }
 
 

+ 0 - 13
Engine/source/console/stringStack.h

@@ -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;