diff --git a/core/HalfLife2.cpp b/core/HalfLife2.cpp index 7a091d24..906226c3 100644 --- a/core/HalfLife2.cpp +++ b/core/HalfLife2.cpp @@ -212,7 +212,7 @@ void CHalfLife2::InitCommandLine() return; } - ILibrary *lib = g_LibSys.OpenLibrary(path, error, sizeof(error)); + ke::AutoPtr lib(g_LibSys.OpenLibrary(path, error, sizeof(error))); m_pGetCommandLine = lib->GetSymbolAddress("CommandLine_Tier0"); /* '_Tier0' dropped on Alien Swarm version */ @@ -224,7 +224,6 @@ void CHalfLife2::InitCommandLine() if (m_pGetCommandLine == NULL) { /* We probably have a Ship engine. */ - lib->CloseLibrary(); g_SourceMod.BuildPath(Path_Game, path, sizeof(path), "../bin/" VSTDLIB_NAME); if (!g_LibSys.IsPathFile(path)) { @@ -244,8 +243,6 @@ void CHalfLife2::InitCommandLine() { g_Logger.LogError("Could not locate any command line functionality"); } - - lib->CloseLibrary(); } } diff --git a/core/logic/ExtensionSys.cpp b/core/logic/ExtensionSys.cpp index 9b6a3d3a..87f3c5e6 100644 --- a/core/logic/ExtensionSys.cpp +++ b/core/logic/ExtensionSys.cpp @@ -35,6 +35,7 @@ #include #include "common_logic.h" #include "PluginSys.h" +#include CExtensionManager g_Extensions; IdentityType_t g_ExtType; @@ -537,11 +538,9 @@ void CExtensionManager::TryAutoload() g_pSM->BuildPath(Path_SM, path, sizeof(path), "extensions"); - IDirectory *pDir = libsys->OpenDirectory(path); + ke::AutoPtr pDir(libsys->OpenDirectory(path)); if (!pDir) - { return; - } const char *lfile; size_t len; diff --git a/core/logic_bridge.cpp b/core/logic_bridge.cpp index 7f50a57b..3af4c93f 100644 --- a/core/logic_bridge.cpp +++ b/core/logic_bridge.cpp @@ -186,6 +186,7 @@ static bool get_game_name(char *buffer, size_t maxlength) if ((str = pGameInfo->GetString("game", NULL)) != NULL) { strncopy(buffer, str, maxlength); + pGameInfo->deleteThis(); return true; } } diff --git a/extensions/topmenus/TopMenu.cpp b/extensions/topmenus/TopMenu.cpp index 8c14f7b9..f7430424 100644 --- a/extensions/topmenus/TopMenu.cpp +++ b/extensions/topmenus/TopMenu.cpp @@ -84,7 +84,7 @@ TopMenu::~TopMenu() { TearDownClient(&m_clients[i]); } - delete [] m_clients; + free(m_clients); } unsigned int TopMenu::CalcMemUsage() diff --git a/public/amtl/am-utility.h b/public/amtl/am-utility.h index 3d2c6c4a..2936d3b6 100644 --- a/public/amtl/am-utility.h +++ b/public/amtl/am-utility.h @@ -37,6 +37,7 @@ #if defined(_MSC_VER) # include #endif +#include #define KE_32BIT @@ -62,6 +63,18 @@ ReturnAndVoid(T &t) return saved; } +#if __cplusplus >= 201103L +# define KE_CXX11 +#endif + +#if defined(KE_CXX11) +# define KE_DELETE = delete +# define KE_OVERRIDE = override +#else +# define KE_DELETE +# define KE_OVERRIDE +#endif + // Wrapper that automatically deletes its contents. The pointer can be taken // to avoid destruction. template @@ -74,10 +87,15 @@ class AutoPtr : t_(NULL) { } - explicit AutoPtr(T *t) + AutoPtr(T *t) : t_(t) { } + AutoPtr(Moveable > &other) + { + t_ = other->t_; + other->t_ = NULL; + } ~AutoPtr() { delete t_; } @@ -93,13 +111,24 @@ class AutoPtr operator T *() const { return t_; } - void operator =(T *t) { + T *operator =(T *t) { delete t_; t_ = t; + return t_; + } + T *operator =(Moveable > &other) { + delete t_; + t_ = other->t_; + other->t_ = NULL; + return t_; } bool operator !() const { return !t_; } + + private: + AutoPtr(const AutoPtr &other) KE_DELETE; + AutoPtr &operator =(const AutoPtr &other) KE_DELETE; }; // Wrapper that automatically deletes its contents. The pointer can be taken @@ -298,18 +327,6 @@ class StorageBuffer }; }; -#if __cplusplus >= 201103L -# define KE_CXX11 -#endif - -#if defined(KE_CXX11) -# define KE_DELETE delete -# define KE_OVERRIDE override -#else -# define KE_DELETE -# define KE_OVERRIDE -#endif - #if defined(_MSC_VER) # define KE_SIZET_FMT "%Iu" #elif defined(__GNUC__) diff --git a/sourcepawn/jit/interpreter.cpp b/sourcepawn/jit/interpreter.cpp index 75b4e238..e998e554 100644 --- a/sourcepawn/jit/interpreter.cpp +++ b/sourcepawn/jit/interpreter.cpp @@ -256,7 +256,7 @@ Interpret(BaseRuntime *rt, uint32_t aCodeStart, cell_t *rval) break; case OP_ZERO_S: - Write(plugin, *cip++, 0); + Write(plugin, ctx->frm + *cip++, 0); break; case OP_PUSH_PRI: