changes from az

leak damn near fixed with these changes
This commit is contained in:
marauder2k7 2025-05-09 07:57:13 +01:00
parent ee0cf872a0
commit 5fc9da789b

View file

@ -37,6 +37,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" #include "core/stringTable.h"
#include <iostream>
class SimObject; class SimObject;
class Namespace; class Namespace;
@ -119,6 +120,7 @@ typedef const char *StringTableEntry;
enum ConsoleValueType enum ConsoleValueType
{ {
cvNULL = -5,
cvInteger = -4, cvInteger = -4,
cvFloat = -3, cvFloat = -3,
cvString = -2, cvString = -2,
@ -152,7 +154,7 @@ class ConsoleValue
TORQUE_FORCEINLINE bool hasAllocatedData() const TORQUE_FORCEINLINE bool hasAllocatedData() const
{ {
return (type == ConsoleValueType::cvString || isConsoleType()) && data != NULL; return (isConsoleType() && data != NULL);
} }
const char* getConsoleData() const; const char* getConsoleData() const;
@ -164,34 +166,40 @@ class ConsoleValue
dFree(data); dFree(data);
data = NULL; data = NULL;
} }
else if (type == ConsoleValueType::cvString)
{
if (s && s[0])
dFree(s);
}
type = ConsoleValueType::cvNULL;
} }
TORQUE_FORCEINLINE void _move(ConsoleValue&& ref) noexcept TORQUE_FORCEINLINE void _move(ConsoleValue&& ref) noexcept
{ {
type = ref.type; if (ref.type == ConsoleValueType::cvNULL)
{
std::cout << "Cannot Move a variable twice!";
return;
}
switch (ref.type) switch (ref.type)
{ {
case cvInteger: case cvInteger:
i = ref.i; setInt(ref.i);
break; break;
case cvFloat: case cvFloat:
f = ref.f; setFloat(ref.f);
break; break;
case cvSTEntry: case cvSTEntry:
TORQUE_CASE_FALLTHROUGH; setStringTableEntry(ref.s);
break;
case cvString: case cvString:
s = ref.s; setString(ref.s);
ref.s = const_cast<char*>(StringTable->EmptyString());
break; break;
default: default:
data = ref.data; setConsoleData(ref.ct->consoleType, ref.ct->dataPtr, ref.ct->enumTable);
break; break;
} }
ref.type = ConsoleValueType::cvSTEntry; ref.cleanupData();
ref.data = NULL;
//ref.reset();
} }
public: public:
@ -203,106 +211,109 @@ public:
ConsoleValue(ConsoleValue&& ref) noexcept ConsoleValue(ConsoleValue&& ref) noexcept
{ {
type = ref.type; if (ref.type == ConsoleValueType::cvNULL)
{
std::cout << "Cannot Move a variable twice!";
return;
}
switch (ref.type) switch (ref.type)
{ {
case cvInteger: case cvInteger:
i = ref.i; setInt(ref.i);
break; break;
case cvFloat: case cvFloat:
f = ref.f; setFloat(ref.f);
break; break;
case cvSTEntry: case cvSTEntry:
TORQUE_CASE_FALLTHROUGH; setStringTableEntry(ref.s);
break;
case cvString: case cvString:
s = ref.s; setString(ref.s);
ref.s = const_cast<char*>(StringTable->EmptyString());
break; break;
default: default:
data = ref.data; setConsoleData(ref.ct->consoleType, ref.ct->dataPtr, ref.ct->enumTable);
break; break;
} }
ref.type = ConsoleValueType::cvSTEntry; ref.cleanupData();
ref.data = NULL;
} }
TORQUE_FORCEINLINE ConsoleValue& operator=(ConsoleValue&& ref) noexcept TORQUE_FORCEINLINE ConsoleValue& operator=(ConsoleValue&& ref) noexcept
{ {
type = ref.type; if (ref.type == ConsoleValueType::cvNULL)
{
std::cout << "Cannot Move a variable twice!";
return *this;
}
switch (ref.type) switch (ref.type)
{ {
case cvInteger: case cvInteger:
i = ref.i; setInt(ref.i);
break; break;
case cvFloat: case cvFloat:
f = ref.f; setFloat(ref.f);
break; break;
case cvSTEntry: case cvSTEntry:
TORQUE_CASE_FALLTHROUGH; setStringTableEntry(ref.s);
break;
case cvString: case cvString:
s = ref.s; setString(ref.s);
ref.s = const_cast<char*>(StringTable->EmptyString());
break; break;
default: default:
data = ref.data; setConsoleData(ref.ct->consoleType, ref.ct->dataPtr, ref.ct->enumTable);
break; break;
} }
ref.type = ConsoleValueType::cvSTEntry; ref.cleanupData();
ref.data = NULL;
return *this; return *this;
} }
ConsoleValue(const ConsoleValue& ref) ConsoleValue(const ConsoleValue& ref)
{ {
type = ref.type;
switch (ref.type) switch (ref.type)
{ {
case cvNULL:
std::cout << "Ref already cleared!";
break;
case cvInteger: case cvInteger:
i = ref.i; setInt(ref.i);
break; break;
case cvFloat: case cvFloat:
f = ref.f; setFloat(ref.f);
break; break;
case cvSTEntry: case cvSTEntry:
TORQUE_CASE_FALLTHROUGH; setStringTableEntry(ref.s);
break;
case cvString: case cvString:
s = ref.s; setString(ref.s);
break; break;
default: default:
data = ref.data; setConsoleData(ref.ct->consoleType, ref.ct->dataPtr, ref.ct->enumTable);
break; break;
} }
} }
ConsoleValue& operator=(const ConsoleValue& ref) ConsoleValue& operator=(const ConsoleValue& ref)
{ {
type = ref.type;
switch (ref.type) switch (ref.type)
{ {
case cvNULL:
std::cout << "Ref already cleared!";
break;
case cvInteger: case cvInteger:
i = ref.i; setInt(ref.i);
break; break;
case cvFloat: case cvFloat:
f = ref.f; setFloat(ref.f);
break; break;
case cvSTEntry: case cvSTEntry:
TORQUE_CASE_FALLTHROUGH; setStringTableEntry(ref.s);
break;
case cvString: case cvString:
s = ref.s; setString(ref.s);
break; break;
default: default:
data = ref.data; setConsoleData(ref.ct->consoleType, ref.ct->dataPtr, ref.ct->enumTable);
break; break;
} }
return *this; return *this;
} }
@ -396,12 +407,11 @@ public:
setEmptyString(); setEmptyString();
return; return;
} }
cleanupData(); cleanupData();
type = ConsoleValueType::cvString; type = ConsoleValueType::cvString;
s = (char*)dMalloc(static_cast<dsize_t>(len) + 1); s = (char*)dMalloc(len + 1);
s[len] = '\0'; s[len] = '\0';
dStrcpy(s, val, static_cast<dsize_t>(len) + 1); dStrcpy(s, val, len + 1);
} }
TORQUE_FORCEINLINE void setStringRef(const char* ref, S32 len) TORQUE_FORCEINLINE void setStringRef(const char* ref, S32 len)
@ -420,7 +430,7 @@ public:
TORQUE_FORCEINLINE void setStringTableEntry(StringTableEntry val) TORQUE_FORCEINLINE void setStringTableEntry(StringTableEntry val)
{ {
cleanupData(); //cleanupData();
type = ConsoleValueType::cvSTEntry; type = ConsoleValueType::cvSTEntry;
s = const_cast<char*>(val); s = const_cast<char*>(val);
} }