From 164ef01a9c8c56f1e372c643628eb083eb4dc80f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Bylica?= Date: Fri, 27 Feb 2015 18:10:33 +0100 Subject: [PATCH] Free memory data, place Runtime in ExecutionEngine --- libevmjit/ExecutionEngine.cpp | 15 ++++----------- libevmjit/Runtime.cpp | 11 +++++++++++ libevmjit/Runtime.h | 4 ++-- 3 files changed, 17 insertions(+), 13 deletions(-) diff --git a/libevmjit/ExecutionEngine.cpp b/libevmjit/ExecutionEngine.cpp index e773b1a9f..c9578b4ee 100644 --- a/libevmjit/ExecutionEngine.cpp +++ b/libevmjit/ExecutionEngine.cpp @@ -117,8 +117,7 @@ ReturnCode ExecutionEngine::run(RuntimeData* _data, Env* _env) static StatsCollector statsCollector; auto mainFuncName = codeHash(_data->codeHash); - Runtime runtime; - runtime.init(_data, _env); + m_runtime.init(_data, _env); auto entryFuncPtr = (EntryFuncPtr)ee->getFunctionAddress(mainFuncName); if (!entryFuncPtr) @@ -148,23 +147,17 @@ ReturnCode ExecutionEngine::run(RuntimeData* _data, Env* _env) return ReturnCode::LLVMLinkError; listener->stateChanged(ExecState::Execution); - auto returnCode = entryFuncPtr(&runtime); + auto returnCode = entryFuncPtr(&m_runtime); listener->stateChanged(ExecState::Return); if (returnCode == ReturnCode::Return) - { - returnData = runtime.getReturnData(); // Save reference to return data - } + returnData = m_runtime.getReturnData(); // Save reference to return data + listener->stateChanged(ExecState::Finished); if (g_stats) statsCollector.stats.push_back(std::move(listener)); - if (runtime.m_memData) - { - std::cerr << "MEM: " << (size_t) runtime.m_memData << " [" << runtime.m_memSize << ", " << runtime.m_memCap << "}\n"; - } - return returnCode; } diff --git a/libevmjit/Runtime.cpp b/libevmjit/Runtime.cpp index 78454ef4f..952ee2645 100644 --- a/libevmjit/Runtime.cpp +++ b/libevmjit/Runtime.cpp @@ -1,5 +1,7 @@ #include "Runtime.h" +#include +#include #include namespace dev @@ -15,6 +17,15 @@ void Runtime::init(RuntimeData* _data, Env* _env) m_env = _env; } +Runtime::~Runtime() +{ + if (m_memData) + { + std::cerr << "MEM: " << (size_t)m_memData << " [" << m_memSize << "]\n"; + std::free(m_memData); + } +} + bytes_ref Runtime::getReturnData() const { auto data = m_data->callData; diff --git a/libevmjit/Runtime.h b/libevmjit/Runtime.h index 91f26beaa..4755a8698 100644 --- a/libevmjit/Runtime.h +++ b/libevmjit/Runtime.h @@ -14,6 +14,7 @@ class Runtime { public: void init(RuntimeData* _data, Env* _env); + EXPORT ~Runtime(); bytes_ref getReturnData() const; @@ -22,8 +23,7 @@ private: Env* m_env = nullptr; ///< Pointer to environment proxy. Expected by compiled contract. byte* m_memoryData = nullptr; i256 m_memorySize; -public: - byte* m_memData; // FIXME: Remember to free memory + byte* m_memData; uint64_t m_memSize; uint64_t m_memCap; };