LUI fixes I forgot to port

This commit is contained in:
Federico Cecchetto 2021-12-03 20:39:23 +01:00
parent 80261a1e2b
commit 0c1279658d
7 changed files with 312 additions and 254 deletions

View File

@ -1,6 +1,5 @@
#include <std_include.hpp>
#include "execution.hpp"
#include "stack_isolation.hpp"
#include "component/ui_scripting.hpp"
#include <utils/string.hpp>
@ -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);

View File

@ -1,7 +1,6 @@
#include <std_include.hpp>
#include "value_conversion.hpp"
#include "../execution.hpp"
#include "../stack_isolation.hpp"
#include "../../../component/ui_scripting.hpp"
namespace ui_scripting::lua

View File

@ -1,7 +1,6 @@
#include <std_include.hpp>
#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];

View File

@ -1,11 +0,0 @@
#include <std_include.hpp>
#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;
}
}

View File

@ -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;
};
}

View File

@ -1,205 +1,276 @@
#include <std_include.hpp>
#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);
}
}

View File

@ -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{};
};
}