diff --git a/meson.build b/meson.build index 4a6c828..c10a6b3 100644 --- a/meson.build +++ b/meson.build @@ -44,6 +44,7 @@ executable(meson.project_name(), 'src/wren/def_configuration.cpp', 'src/wren/dynafunc_maker.cpp', 'src/dynafunc_' + arch + '_' + os + '.S', + 'src/wren/handle.cpp', dependencies: [wren_dep], install: true, ) diff --git a/src/wren/handle.cpp b/src/wren/handle.cpp new file mode 100644 index 0000000..eb09d6a --- /dev/null +++ b/src/wren/handle.cpp @@ -0,0 +1,14 @@ +#include "handle.hpp" +#include "vm.hpp" +#include + +namespace wren { + Handle::~Handle() noexcept { + release(); + } + + void Handle::release() noexcept { + assert(m_vm); + m_vm->release(*this); + } +} //namespace wren diff --git a/src/wren/handle.hpp b/src/wren/handle.hpp new file mode 100644 index 0000000..325844e --- /dev/null +++ b/src/wren/handle.hpp @@ -0,0 +1,26 @@ +#pragma once + +typedef struct WrenHandle WrenHandle; + +namespace wren { + class VM; + + class Handle { + public: + explicit Handle (VM* vm, WrenHandle* handle) noexcept : + m_handle(handle), + m_vm(vm) + { + } + + ~Handle() noexcept; + void release() noexcept; + + operator WrenHandle*() { return m_handle; } + operator bool() const { return nullptr != m_handle; } + + private: + WrenHandle* m_handle; + VM* m_vm; + }; +} //namespace wren diff --git a/src/wren/vm.cpp b/src/wren/vm.cpp index 595e360..e8bb3d5 100644 --- a/src/wren/vm.cpp +++ b/src/wren/vm.cpp @@ -164,6 +164,11 @@ namespace wren { return interpret(module_name.c_str(), script.c_str()); } + void VM::release (Handle& handle) noexcept { + if (handle) + wrenReleaseHandle(m_local->wvm, handle); + } + template T VM::slot (int slot_num) { return slot_specialized(m_local->wvm, slot_num); diff --git a/src/wren/vm.hpp b/src/wren/vm.hpp index b0dee6e..17af447 100644 --- a/src/wren/vm.hpp +++ b/src/wren/vm.hpp @@ -2,6 +2,7 @@ #include "has_method.hpp" #include "error_type.hpp" +#include "handle.hpp" #include #include #include @@ -14,6 +15,7 @@ namespace wren { class Configuration; class VM; class DynafuncMaker; + class Handle; typedef void(*foreign_method_t)(VM*); typedef void(*finalizer_t)(void*); @@ -54,6 +56,7 @@ namespace wren { void interpret (const char* module_name, const char* script); void interpret (const std::string& module_name, const std::string& script); + void release (Handle& handle) noexcept; template T slot (int slot_num); #if __cpp_concepts >= 201907