diff --git a/src/client/game/ui_scripting/execution.cpp b/src/client/game/ui_scripting/execution.cpp index b03604a4..84efbce8 100644 --- a/src/client/game/ui_scripting/execution.cpp +++ b/src/client/game/ui_scripting/execution.cpp @@ -1,6 +1,5 @@ #include #include "execution.hpp" -#include "stack_isolation.hpp" #include "component/ui_scripting.hpp" #include @@ -41,8 +40,8 @@ namespace ui_scripting arguments call_script_function(const function& function, const arguments& arguments) { const auto state = *game::hks::lua_state; + state->m_apistack.top = state->m_apistack.base; - stack_isolation _; push_value(function); for (auto i = arguments.begin(); i != arguments.end(); ++i) { @@ -67,8 +66,8 @@ namespace ui_scripting script_value get_field(const userdata& self, const script_value& key) { const auto state = *game::hks::lua_state; + state->m_apistack.top = state->m_apistack.base; - stack_isolation _; push_value(key); const auto _1 = gsl::finally(&disable_error_hook); @@ -93,8 +92,8 @@ namespace ui_scripting script_value get_field(const table& self, const script_value& key) { const auto state = *game::hks::lua_state; + state->m_apistack.top = state->m_apistack.base; - stack_isolation _; push_value(key); const auto _1 = gsl::finally(&disable_error_hook); @@ -119,8 +118,7 @@ namespace ui_scripting void set_field(const userdata& self, const script_value& key, const script_value& value) { const auto state = *game::hks::lua_state; - - stack_isolation _; + state->m_apistack.top = state->m_apistack.base; const auto _1 = gsl::finally(&disable_error_hook); enable_error_hook(); @@ -142,8 +140,7 @@ namespace ui_scripting void set_field(const table& self, const script_value& key, const script_value& value) { const auto state = *game::hks::lua_state; - - stack_isolation _; + state->m_apistack.top = state->m_apistack.base; const auto _1 = gsl::finally(&disable_error_hook); enable_error_hook(); @@ -170,7 +167,9 @@ namespace ui_scripting throw std::runtime_error("Function " + name + " not found"); } - stack_isolation _; + const auto state = *game::hks::lua_state; + state->m_apistack.top = state->m_apistack.base; + push_value(self); for (auto i = arguments.begin(); i != arguments.end(); ++i) { @@ -202,7 +201,9 @@ namespace ui_scripting throw std::runtime_error("Function " + name + " not found"); } - stack_isolation _; + const auto state = *game::hks::lua_state; + state->m_apistack.top = state->m_apistack.base; + for (auto i = arguments.begin(); i != arguments.end(); ++i) { push_value(*i); diff --git a/src/client/game/ui_scripting/lua/value_conversion.cpp b/src/client/game/ui_scripting/lua/value_conversion.cpp index 48392552..38376cdf 100644 --- a/src/client/game/ui_scripting/lua/value_conversion.cpp +++ b/src/client/game/ui_scripting/lua/value_conversion.cpp @@ -1,7 +1,6 @@ #include #include "value_conversion.hpp" #include "../execution.hpp" -#include "../stack_isolation.hpp" #include "../../../component/ui_scripting.hpp" namespace ui_scripting::lua diff --git a/src/client/game/ui_scripting/script_value.cpp b/src/client/game/ui_scripting/script_value.cpp index 88edfa0e..4f37c84b 100644 --- a/src/client/game/ui_scripting/script_value.cpp +++ b/src/client/game/ui_scripting/script_value.cpp @@ -1,7 +1,6 @@ #include #include "execution.hpp" #include "types.hpp" -#include "stack_isolation.hpp" #include "script_value.hpp" namespace ui_scripting @@ -59,9 +58,10 @@ namespace ui_scripting script_value::script_value(const char* value) { game::hks::HksObject obj{}; - stack_isolation _; const auto state = *game::hks::lua_state; + state->m_apistack.top = state->m_apistack.base; + game::hks::hksi_lua_pushlstring(state, value, (unsigned int)strlen(value)); obj = state->m_apistack.top[-1]; diff --git a/src/client/game/ui_scripting/stack_isolation.cpp b/src/client/game/ui_scripting/stack_isolation.cpp deleted file mode 100644 index d50dd355..00000000 --- a/src/client/game/ui_scripting/stack_isolation.cpp +++ /dev/null @@ -1,11 +0,0 @@ -#include -#include "stack_isolation.hpp" - -namespace ui_scripting -{ - stack_isolation::stack_isolation() - { - const auto state = *game::hks::lua_state; - state->m_apistack.top = state->m_apistack.base; - } -} diff --git a/src/client/game/ui_scripting/stack_isolation.hpp b/src/client/game/ui_scripting/stack_isolation.hpp deleted file mode 100644 index f13a7129..00000000 --- a/src/client/game/ui_scripting/stack_isolation.hpp +++ /dev/null @@ -1,16 +0,0 @@ -#pragma once -#include "game/game.hpp" - -namespace ui_scripting -{ - class stack_isolation final - { - public: - stack_isolation(); - stack_isolation(stack_isolation&&) = delete; - stack_isolation(const stack_isolation&) = delete; - stack_isolation& operator=(stack_isolation&&) = delete; - stack_isolation& operator=(const stack_isolation&) = delete; - - }; -} diff --git a/src/client/game/ui_scripting/types.cpp b/src/client/game/ui_scripting/types.cpp index daaf0010..732c978a 100644 --- a/src/client/game/ui_scripting/types.cpp +++ b/src/client/game/ui_scripting/types.cpp @@ -1,205 +1,276 @@ #include #include "types.hpp" #include "execution.hpp" -#include "stack_isolation.hpp" namespace ui_scripting { - /*************************************************************** - * Lightuserdata - **************************************************************/ + /*************************************************************** + * Lightuserdata + **************************************************************/ - lightuserdata::lightuserdata(void* ptr_) - : ptr(ptr_) - { - } + lightuserdata::lightuserdata(void* ptr_) + : ptr(ptr_) + { + } - /*************************************************************** - * Userdata - **************************************************************/ + /*************************************************************** + * Userdata + **************************************************************/ - userdata::userdata(void* ptr_) - : ptr(ptr_) - { - } + userdata::userdata(void* ptr_) + : ptr(ptr_) + { + this->add(); + } - void userdata::set(const script_value& key, const script_value& value) const - { - set_field(*this, key, value); - } + userdata::userdata(const userdata& other) + { + this->operator=(other); + } - script_value userdata::get(const script_value& key) const - { - return get_field(*this, key); - } + userdata::userdata(userdata&& other) noexcept + { + this->ptr = other.ptr; + this->ref = other.ref; + other.ref = 0; + } - /*************************************************************** - * Table - **************************************************************/ + userdata::~userdata() + { + this->release(); + } - table::table() - { - const auto state = *game::hks::lua_state; - this->ptr = game::hks::Hashtable_Create(state, 0, 0); - this->add(); - } + userdata& userdata::operator=(const userdata& other) + { + if (&other != this) + { + this->release(); + this->ptr = other.ptr; + this->ref = other.ref; + this->add(); + } - table::table(game::hks::HashTable* ptr_) - : ptr(ptr_) - { - this->add(); - } + return *this; + } - table::table(const table& other) : table(other.ptr) - { - } + userdata& userdata::operator=(userdata&& other) noexcept + { + if (&other != this) + { + this->release(); + this->ptr = other.ptr; + this->ref = other.ref; + other.ref = 0; + } - table::table(table&& other) noexcept - { - this->ptr = other.ptr; - this->ref = other.ref; - other.ref = 0; - } + return *this; + } - table::~table() - { - this->release(); - } + void userdata::add() + { + game::hks::HksObject value{}; + value.v.ptr = this->ptr; + value.t = game::hks::TUSERDATA; - table& table::operator=(const table& other) - { - if (&other != this) - { - this->release(); - this->ptr = other.ptr; - this->ref = other.ref; - this->add(); - } + const auto state = *game::hks::lua_state; + state->m_apistack.top = state->m_apistack.base; - return *this; - } + push_value(value); - table& table::operator=(table&& other) noexcept - { - if (&other != this) - { - this->release(); - this->ptr = other.ptr; - this->ref = other.ref; - other.ref = 0; - } + this->ref = game::hks::hksi_luaL_ref(*game::hks::lua_state, -10000); + } - return *this; - } + void userdata::release() + { + if (this->ref) + { + game::hks::hksi_luaL_unref(*game::hks::lua_state, -10000, this->ref); + } + } - void table::add() - { - game::hks::HksObject value{}; - value.v.table = this->ptr; - value.t = game::hks::TTABLE; + void userdata::set(const script_value& key, const script_value& value) const + { + set_field(*this, key, value); + } - stack_isolation _; - push_value(value); + script_value userdata::get(const script_value& key) const + { + return get_field(*this, key); + } - this->ref = game::hks::hksi_luaL_ref(*game::hks::lua_state, -10000); - } + /*************************************************************** + * Table + **************************************************************/ - void table::release() - { - if (this->ref) - { - game::hks::hksi_luaL_unref(*game::hks::lua_state, -10000, this->ref); - } - } + table::table() + { + const auto state = *game::hks::lua_state; + this->ptr = game::hks::Hashtable_Create(state, 0, 0); + this->add(); + } - void table::set(const script_value& key, const script_value& value) const - { - set_field(*this, key, value); - } + table::table(game::hks::HashTable* ptr_) + : ptr(ptr_) + { + this->add(); + } - script_value table::get(const script_value& key) const - { - return get_field(*this, key); - } + table::table(const table& other) + { + this->operator=(other); + } - /*************************************************************** - * Function - **************************************************************/ + table::table(table&& other) noexcept + { + this->ptr = other.ptr; + this->ref = other.ref; + other.ref = 0; + } - function::function(game::hks::cclosure* ptr_, game::hks::HksObjectType type_) - : ptr(ptr_) - , type(type_) - { - this->add(); - } + table::~table() + { + this->release(); + } - function::function(const function& other) : function(other.ptr, other.type) - { - } + table& table::operator=(const table& other) + { + if (&other != this) + { + this->release(); + this->ptr = other.ptr; + this->ref = other.ref; + this->add(); + } - function::function(function&& other) noexcept - { - this->ptr = other.ptr; - this->type = other.type; - this->ref = other.ref; - other.ref = 0; - } + return *this; + } - function::~function() - { - this->release(); - } + table& table::operator=(table&& other) noexcept + { + if (&other != this) + { + this->release(); + this->ptr = other.ptr; + this->ref = other.ref; + other.ref = 0; + } - function& function::operator=(const function& other) - { - if (&other != this) - { - this->release(); - this->ptr = other.ptr; - this->type = other.type; - this->ref = other.ref; - this->add(); - } + return *this; + } - return *this; - } + void table::add() + { + game::hks::HksObject value{}; + value.v.table = this->ptr; + value.t = game::hks::TTABLE; - function& function::operator=(function&& other) noexcept - { - if (&other != this) - { - this->release(); - this->ptr = other.ptr; - this->type = other.type; - this->ref = other.ref; - other.ref = 0; - } + const auto state = *game::hks::lua_state; + state->m_apistack.top = state->m_apistack.base; - return *this; - } + push_value(value); - void function::add() - { - game::hks::HksObject value{}; - value.v.cClosure = this->ptr; - value.t = this->type; + this->ref = game::hks::hksi_luaL_ref(*game::hks::lua_state, -10000); + } - stack_isolation _; - push_value(value); + void table::release() + { + if (this->ref) + { + game::hks::hksi_luaL_unref(*game::hks::lua_state, -10000, this->ref); + } + } - this->ref = game::hks::hksi_luaL_ref(*game::hks::lua_state, -10000); - } + void table::set(const script_value& key, const script_value& value) const + { + set_field(*this, key, value); + } - void function::release() - { - if (this->ref) - { - game::hks::hksi_luaL_unref(*game::hks::lua_state, -10000, this->ref); - } - } + script_value table::get(const script_value& key) const + { + return get_field(*this, key); + } - arguments function::call(const arguments& arguments) const - { - return call_script_function(*this, arguments); - } -} + /*************************************************************** + * Function + **************************************************************/ + + function::function(game::hks::cclosure* ptr_, game::hks::HksObjectType type_) + : ptr(ptr_) + , type(type_) + { + this->add(); + } + + function::function(const function& other) + { + this->operator=(other); + } + + function::function(function&& other) noexcept + { + this->ptr = other.ptr; + this->type = other.type; + this->ref = other.ref; + other.ref = 0; + } + + function::~function() + { + this->release(); + } + + function& function::operator=(const function& other) + { + if (&other != this) + { + this->release(); + this->ptr = other.ptr; + this->type = other.type; + this->ref = other.ref; + this->add(); + } + + return *this; + } + + function& function::operator=(function&& other) noexcept + { + if (&other != this) + { + this->release(); + this->ptr = other.ptr; + this->type = other.type; + this->ref = other.ref; + other.ref = 0; + } + + return *this; + } + + void function::add() + { + game::hks::HksObject value{}; + value.v.cClosure = this->ptr; + value.t = this->type; + + const auto state = *game::hks::lua_state; + state->m_apistack.top = state->m_apistack.base; + + push_value(value); + + this->ref = game::hks::hksi_luaL_ref(*game::hks::lua_state, -10000); + } + + void function::release() + { + if (this->ref) + { + game::hks::hksi_luaL_unref(*game::hks::lua_state, -10000, this->ref); + } + } + + arguments function::call(const arguments& arguments) const + { + return call_script_function(*this, arguments); + } +} \ No newline at end of file diff --git a/src/client/game/ui_scripting/types.hpp b/src/client/game/ui_scripting/types.hpp index 330c0be6..10f452f8 100644 --- a/src/client/game/ui_scripting/types.hpp +++ b/src/client/game/ui_scripting/types.hpp @@ -4,72 +4,86 @@ namespace ui_scripting { - class lightuserdata - { - public: - lightuserdata(void*); - void* ptr; - }; + class lightuserdata + { + public: + lightuserdata(void*); + void* ptr; + }; - class userdata - { - public: - userdata(void*); + class userdata + { + public: + userdata(void*); - script_value get(const script_value& key) const; - void set(const script_value& key, const script_value& value) const; + userdata(const userdata& other); + userdata(userdata&& other) noexcept; - void* ptr; - }; + ~userdata(); - class table - { - public: - table(); - table(game::hks::HashTable* ptr_); + userdata& operator=(const userdata& other); + userdata& operator=(userdata&& other) noexcept; - table(const table& other); - table(table&& other) noexcept; + script_value get(const script_value& key) const; + void set(const script_value& key, const script_value& value) const; - ~table(); + void* ptr; - table& operator=(const table& other); - table& operator=(table&& other) noexcept; + private: + void add(); + void release(); - script_value get(const script_value& key) const; - void set(const script_value& key, const script_value& value) const; + int ref{}; + }; - game::hks::HashTable* ptr; + class table + { + public: + table(); + table(game::hks::HashTable* ptr_); - private: - void add(); - void release(); + table(const table& other); + table(table&& other) noexcept; - int ref; - }; + ~table(); - class function - { - public: - function(game::hks::cclosure*, game::hks::HksObjectType); + table& operator=(const table& other); + table& operator=(table&& other) noexcept; - function(const function& other); - function(function&& other) noexcept; + script_value get(const script_value& key) const; + void set(const script_value& key, const script_value& value) const; - ~function(); + game::hks::HashTable* ptr; - function& operator=(const function& other); - function& operator=(function&& other) noexcept; + private: + void add(); + void release(); - arguments call(const arguments& arguments) const; + int ref{}; + }; - game::hks::cclosure* ptr; - game::hks::HksObjectType type; + class function + { + public: + function(game::hks::cclosure*, game::hks::HksObjectType); - private: - void add(); - void release(); + function(const function& other); + function(function&& other) noexcept; - int ref; - }; -} + ~function(); + + function& operator=(const function& other); + function& operator=(function&& other) noexcept; + + arguments call(const arguments& arguments) const; + + game::hks::cclosure* ptr; + game::hks::HksObjectType type; + + private: + void add(); + void release(); + + int ref{}; + }; +} \ No newline at end of file