Lua: Automatically pass Lua state to lua class ctors

This commit is contained in:
Ilari Liusvaara 2013-08-21 23:19:20 +03:00
parent 17f8603ec5
commit 9092dea931
13 changed files with 107 additions and 99 deletions

View file

@ -645,7 +645,7 @@ template<class T> class lua_class
load_metatable(state);
state.setmetatable(-2);
T* _obj = reinterpret_cast<T*>(obj);
new(_obj) T(args...);
new(_obj) T(state, args...);
return _obj;
}

View file

@ -5,12 +5,13 @@
#include <string>
#include <cstdint>
#include "core/window.hpp"
#include "library/luabase.hpp"
#include "library/framebuffer.hpp"
#include "library/threadtypes.hpp"
struct lua_bitmap
{
lua_bitmap(uint32_t w, uint32_t h);
lua_bitmap(lua_state& L, uint32_t w, uint32_t h);
~lua_bitmap();
size_t width;
size_t height;
@ -19,7 +20,7 @@ struct lua_bitmap
struct lua_dbitmap
{
lua_dbitmap(uint32_t w, uint32_t h);
lua_dbitmap(lua_state& L, uint32_t w, uint32_t h);
~lua_dbitmap();
size_t width;
size_t height;
@ -29,7 +30,7 @@ struct lua_dbitmap
struct lua_palette
{
std::vector<premultiplied_color> colors;
lua_palette();
lua_palette(lua_state& L);
~lua_palette();
mutex_class palette_mutex;
};

View file

@ -1,8 +1,11 @@
#ifndef _lua__unsaferewind__hpp__included__
#define _lua__unsaferewind__hpp__included__
#include "library/luabase.hpp"
struct lua_unsaferewind
{
lua_unsaferewind(lua_state& L);
std::vector<char> state;
uint64_t frame;
uint64_t lag;

View file

@ -7,7 +7,7 @@ namespace
class lua_callbacks_list
{
public:
lua_callbacks_list(lua_state* L);
lua_callbacks_list(lua_state& L);
int index(lua_state& L);
int newindex(lua_state& L);
};
@ -15,7 +15,7 @@ namespace
class lua_callback_obj
{
public:
lua_callback_obj(lua_state* L, const std::string& name);
lua_callback_obj(lua_state& L, const std::string& name);
int _register(lua_state& L);
int _unregister(lua_state& L);
int _call(lua_state& L);
@ -30,19 +30,19 @@ DECLARE_LUACLASS(lua_callback_obj, "CALLBACK_OBJ");
namespace
{
lua_callbacks_list::lua_callbacks_list(lua_state* L)
lua_callbacks_list::lua_callbacks_list(lua_state& L)
{
static char doonce_key;
if(L->do_once(&doonce_key)) {
objclass<lua_callbacks_list>().bind(*L, "__index", &lua_callbacks_list::index, true);
objclass<lua_callbacks_list>().bind(*L, "__newindex", &lua_callbacks_list::newindex, true);
if(L.do_once(&doonce_key)) {
objclass<lua_callbacks_list>().bind(L, "__index", &lua_callbacks_list::index, true);
objclass<lua_callbacks_list>().bind(L, "__newindex", &lua_callbacks_list::newindex, true);
}
}
int lua_callbacks_list::index(lua_state& L)
{
std::string name = L.get_string(2, "CALLBACKS_LIST::__index");
lua_class<lua_callback_obj>::create(L, &L, name);
lua_class<lua_callback_obj>::create(L, name);
return 1;
}
@ -51,17 +51,17 @@ namespace
throw std::runtime_error("Writing is not allowed");
}
lua_callback_obj::lua_callback_obj(lua_state* L, const std::string& name)
lua_callback_obj::lua_callback_obj(lua_state& L, const std::string& name)
{
static char doonce_key;
if(L->do_once(&doonce_key)) {
objclass<lua_callback_obj>().bind(*L, "register", &lua_callback_obj::_register);
objclass<lua_callback_obj>().bind(*L, "unregister", &lua_callback_obj::_unregister);
objclass<lua_callback_obj>().bind(*L, "__call", &lua_callback_obj::_call);
if(L.do_once(&doonce_key)) {
objclass<lua_callback_obj>().bind(L, "register", &lua_callback_obj::_register);
objclass<lua_callback_obj>().bind(L, "unregister", &lua_callback_obj::_unregister);
objclass<lua_callback_obj>().bind(L, "__call", &lua_callback_obj::_call);
}
callback = NULL;
special = 0;
for(auto i : L->get_callbacks())
for(auto i : L.get_callbacks())
if(i->get_name() == name)
callback = i;
if(name == "register") {
@ -129,7 +129,7 @@ namespace
function_ptr_luafun callback(lua_func_callback, "callback", [](lua_state& L, const std::string& fname)
-> int {
lua_class<lua_callbacks_list>::create(L, &L);
lua_class<lua_callbacks_list>::create(L);
return 1;
});
}

View file

@ -9,7 +9,7 @@
#include <vector>
#include <sstream>
lua_bitmap::lua_bitmap(uint32_t w, uint32_t h)
lua_bitmap::lua_bitmap(lua_state& L, uint32_t w, uint32_t h)
{
width = w;
height = h;
@ -22,7 +22,7 @@ lua_bitmap::~lua_bitmap()
render_kill_request(this);
}
lua_dbitmap::lua_dbitmap(uint32_t w, uint32_t h)
lua_dbitmap::lua_dbitmap(lua_state& L, uint32_t w, uint32_t h)
{
width = w;
height = h;
@ -34,7 +34,7 @@ lua_dbitmap::~lua_dbitmap()
render_kill_request(this);
}
lua_palette::lua_palette()
lua_palette::lua_palette(lua_state& L)
{
}

View file

@ -10,15 +10,15 @@ namespace
struct render_queue_obj
{
render_queue_obj(uint32_t width, uint32_t height) throw()
render_queue_obj(lua_state& L, uint32_t width, uint32_t height) throw()
{
lctx.left_gap = std::numeric_limits<uint32_t>::max();
lctx.right_gap = std::numeric_limits<uint32_t>::max();
lctx.bottom_gap = std::numeric_limits<uint32_t>::max();
lctx.top_gap = std::numeric_limits<uint32_t>::max();
lctx.queue = &rqueue;
lctx.width = 512;
lctx.height = 448;
lctx.width = width;
lctx.height = height;
}
~render_queue_obj() throw() {}
lua_render_context* get() { return &lctx; }

View file

@ -12,7 +12,7 @@ namespace
struct lua_customfont
{
public:
lua_customfont(lua_state* L, const std::string& filename);
lua_customfont(lua_state& L, const std::string& filename);
~lua_customfont() throw();
int draw(lua_state& L);
const custom_font& get_font() { return font; }
@ -85,12 +85,12 @@ namespace
lua_obj_pin<lua_customfont> font;
};
lua_customfont::lua_customfont(lua_state* L, const std::string& filename)
lua_customfont::lua_customfont(lua_state& L, const std::string& filename)
: font(filename)
{
static char done_key;
if(L->do_once(&done_key)) {
objclass<lua_customfont>().bind(*L, "__call", &lua_customfont::draw);
if(L.do_once(&done_key)) {
objclass<lua_customfont>().bind(L, "__call", &lua_customfont::draw);
}
}
@ -125,7 +125,7 @@ namespace
-> int {
std::string filename = L.get_string(1, fname.c_str());
try {
lua_class<lua_customfont>::create(L, &L, filename);
lua_class<lua_customfont>::create(L, filename);
return 1;
} catch(std::exception& e) {
L.pushstring(e.what());

View file

@ -6,7 +6,7 @@
class lua_inverse_bind
{
public:
lua_inverse_bind(const std::string& name, const std::string& cmd);
lua_inverse_bind(lua_state& L, const std::string& name, const std::string& cmd);
private:
inverse_bind ikey;
};
@ -47,25 +47,25 @@ private:
class lua_command_bind
{
public:
lua_command_bind(lua_state* L, const std::string& cmd, int idx1, int idx2);
lua_command_bind(lua_state& L, const std::string& cmd, int idx1, int idx2);
~lua_command_bind();
private:
lua_command_binding* a;
lua_command_binding* b;
};
lua_inverse_bind::lua_inverse_bind(const std::string& name, const std::string& cmd)
lua_inverse_bind::lua_inverse_bind(lua_state& L, const std::string& name, const std::string& cmd)
: ikey(lsnes_mapper, cmd, "Lua‣" + name)
{
}
lua_command_bind::lua_command_bind(lua_state* L, const std::string& cmd, int idx1, int idx2)
lua_command_bind::lua_command_bind(lua_state& L, const std::string& cmd, int idx1, int idx2)
{
if(L->type(idx2) == LUA_TFUNCTION) {
a = new lua_command_binding(*L, "+" + cmd, idx1);
b = new lua_command_binding(*L, "-" + cmd, idx2);
if(L.type(idx2) == LUA_TFUNCTION) {
a = new lua_command_binding(L, "+" + cmd, idx1);
b = new lua_command_binding(L, "-" + cmd, idx2);
} else {
a = new lua_command_binding(*L, cmd, idx1);
a = new lua_command_binding(L, cmd, idx1);
b = NULL;
}
}
@ -145,7 +145,7 @@ namespace
if(L.type(3) != LUA_TFUNCTION && L.type(3) != LUA_TNIL && L.type(3) != LUA_TNONE)
throw std::runtime_error("Argument 2 of create_command must be function or nil");
std::string name = L.get_string(1, fname.c_str());
lua_command_bind* b = lua_class<lua_command_bind>::create(L, &L, name, 2, 3);
lua_command_bind* b = lua_class<lua_command_bind>::create(L, name, 2, 3);
return 1;
});

View file

@ -15,7 +15,7 @@ namespace
{
friend class lua_inputmovie;
public:
lua_inputframe(lua_state* L, controller_frame _f);
lua_inputframe(lua_state& L, controller_frame _f);
int get_button(lua_state& L)
{
unsigned port = L.get_numeric_argument<unsigned>(2, "INPUTFRAME::get_button");
@ -141,7 +141,7 @@ namespace
int ptr = 1;
controller_frame_vector& v = framevector(L, ptr, fname);
lua_inputmovie* m = lua_class<lua_inputmovie>::create(L, &L, v);
lua_inputmovie* m = lua_class<lua_inputmovie>::create(L, v);
return 1;
}
@ -154,7 +154,7 @@ namespace
if(n >= v.size())
throw std::runtime_error("Requested frame outside movie");
controller_frame _f = v[n];
lua_inputframe* f = lua_class<lua_inputframe>::create(L, &L, _f);
lua_inputframe* f = lua_class<lua_inputframe>::create(L, _f);
return 1;
}
@ -234,7 +234,7 @@ namespace
controller_frame_vector& v = framevector(L, ptr, fname);
controller_frame _f = v.blank_frame(true);
lua_inputframe* f = lua_class<lua_inputframe>::create(L, &L, _f);
lua_inputframe* f = lua_class<lua_inputframe>::create(L, _f);
return 1;
}
@ -410,8 +410,8 @@ namespace
class lua_inputmovie
{
public:
lua_inputmovie(lua_state* L, const controller_frame_vector& _v);
lua_inputmovie(lua_state* L, controller_frame& _f);
lua_inputmovie(lua_state& L, const controller_frame_vector& _v);
lua_inputmovie(lua_state& L, controller_frame& _f);
int copy_movie(lua_state& L)
{
return _copy_movie(L, "INPUTMOVIE::copy_movie");
@ -560,7 +560,7 @@ namespace
std::ifstream file(filename, binary ? std::ios_base::binary : std::ios_base::in);
if(!file)
throw std::runtime_error("Can't open file to read input from");
lua_inputmovie* m = lua_class<lua_inputmovie>::create(L, &L, f->get_frame());
lua_inputmovie* m = lua_class<lua_inputmovie>::create(L, f->get_frame());
controller_frame_vector& v = *m->get_frame_vector();
if(binary) {
uint64_t stride = v.get_stride();
@ -608,18 +608,18 @@ DECLARE_LUACLASS(lua_inputframe, "INPUTFRAME");
namespace
{
lua_inputframe::lua_inputframe(lua_state* L, controller_frame _f)
lua_inputframe::lua_inputframe(lua_state& L, controller_frame _f)
{
f = _f;
static char done_key;
if(L->do_once(&done_key)) {
objclass<lua_inputframe>().bind(*L, "get_button", &lua_inputframe::get_button);
objclass<lua_inputframe>().bind(*L, "get_axis", &lua_inputframe::get_axis);
objclass<lua_inputframe>().bind(*L, "set_axis", &lua_inputframe::set_axis);
objclass<lua_inputframe>().bind(*L, "set_button", &lua_inputframe::set_axis);
objclass<lua_inputframe>().bind(*L, "serialize", &lua_inputframe::serialize);
objclass<lua_inputframe>().bind(*L, "unserialize", &lua_inputframe::unserialize);
objclass<lua_inputframe>().bind(*L, "get_stride", &lua_inputframe::get_stride);
if(L.do_once(&done_key)) {
objclass<lua_inputframe>().bind(L, "get_button", &lua_inputframe::get_button);
objclass<lua_inputframe>().bind(L, "get_axis", &lua_inputframe::get_axis);
objclass<lua_inputframe>().bind(L, "set_axis", &lua_inputframe::set_axis);
objclass<lua_inputframe>().bind(L, "set_button", &lua_inputframe::set_axis);
objclass<lua_inputframe>().bind(L, "serialize", &lua_inputframe::serialize);
objclass<lua_inputframe>().bind(L, "unserialize", &lua_inputframe::unserialize);
objclass<lua_inputframe>().bind(L, "get_stride", &lua_inputframe::get_stride);
}
}
@ -644,15 +644,15 @@ namespace
}
}
lua_inputmovie::lua_inputmovie(lua_state* L, const controller_frame_vector& _v)
lua_inputmovie::lua_inputmovie(lua_state& L, const controller_frame_vector& _v)
{
v = _v;
common_init(*L);
common_init(L);
}
lua_inputmovie::lua_inputmovie(lua_state* L, controller_frame& f)
lua_inputmovie::lua_inputmovie(lua_state& L, controller_frame& f)
{
v.clear(f.porttypes());
common_init(*L);
common_init(L);
}
}

View file

@ -149,7 +149,7 @@ namespace
class lua_file_reader
{
public:
lua_file_reader(lua_state* L, std::istream* strm);
lua_file_reader(lua_state& L, std::istream* strm);
~lua_file_reader()
{
delete &s;
@ -303,7 +303,7 @@ namespace
file2 = L.get_string(2, fname.c_str());
std::istream& s = open_file_relative(file1, file2);
try {
lua_class<lua_file_reader>::create(L, &L, &s);
lua_class<lua_file_reader>::create(L, &s);
return 1;
} catch(...) {
delete &s;
@ -317,13 +317,13 @@ DECLARE_LUACLASS(lua_file_reader, "FILEREADER");
namespace
{
lua_file_reader::lua_file_reader(lua_state* L, std::istream* strm)
lua_file_reader::lua_file_reader(lua_state& L, std::istream* strm)
: s(*strm)
{
static char doonce_key;
if(L->do_once(&doonce_key)) {
objclass<lua_file_reader>().bind(*L, "__call", &lua_file_reader::read);
objclass<lua_file_reader>().bind(*L, "lines", &lua_file_reader::lines);
if(L.do_once(&doonce_key)) {
objclass<lua_file_reader>().bind(L, "__call", &lua_file_reader::read);
objclass<lua_file_reader>().bind(L, "lines", &lua_file_reader::lines);
}
}
}

View file

@ -507,3 +507,7 @@ bool lua_requests_repaint = false;
bool lua_requests_subframe_paint = false;
DECLARE_LUACLASS(lua_unsaferewind, "UNSAFEREWIND");
lua_unsaferewind::lua_unsaferewind(lua_state& L)
{
}

View file

@ -88,7 +88,7 @@ namespace
class lua_mmap_struct
{
public:
lua_mmap_struct(lua_state* L);
lua_mmap_struct(lua_state& L);
~lua_mmap_struct()
{
@ -381,7 +381,7 @@ namespace
function_ptr_luafun gui_cbitmap(lua_func_misc, "memory.map_structure", [](lua_state& L,
const std::string& fname) -> int {
lua_class<lua_mmap_struct>::create(L, &L);
lua_class<lua_mmap_struct>::create(L);
return 1;
});
@ -472,12 +472,12 @@ int lua_mmap_struct::map(lua_state& L)
DECLARE_LUACLASS(lua_mmap_struct, "MMAP_STRUCT");
lua_mmap_struct::lua_mmap_struct(lua_state* L)
lua_mmap_struct::lua_mmap_struct(lua_state& L)
{
static char done_key;
if(L->do_once(&done_key)) {
objclass<lua_mmap_struct>().bind(*L, "__index", &lua_mmap_struct::index, true);
objclass<lua_mmap_struct>().bind(*L, "__newindex", &lua_mmap_struct::newindex, true);
objclass<lua_mmap_struct>().bind(*L, "__call", &lua_mmap_struct::map);
if(L.do_once(&done_key)) {
objclass<lua_mmap_struct>().bind(L, "__index", &lua_mmap_struct::index, true);
objclass<lua_mmap_struct>().bind(L, "__newindex", &lua_mmap_struct::newindex, true);
objclass<lua_mmap_struct>().bind(L, "__call", &lua_mmap_struct::map);
}
}

View file

@ -50,7 +50,7 @@ namespace
class lua_vma
{
public:
lua_vma(lua_state* L, memory_region* r);
lua_vma(lua_state& L, memory_region* r);
int info(lua_state& L);
template<class T, bool _bswap> int rw(lua_state& L);
private:
@ -63,7 +63,7 @@ namespace
class lua_vma_list
{
public:
lua_vma_list(lua_state* L);
lua_vma_list(lua_state& L);
int index(lua_state& L);
int newindex(lua_state& L);
int call(lua_state& L);
@ -75,27 +75,27 @@ DECLARE_LUACLASS(lua_vma_list, "VMALIST");
namespace
{
lua_vma::lua_vma(lua_state* L, memory_region* r)
lua_vma::lua_vma(lua_state& L, memory_region* r)
{
static char doonce_key;
if(L->do_once(&doonce_key)) {
objclass<lua_vma>().bind(*L, "info", &lua_vma::info);
objclass<lua_vma>().bind(*L, "sbyte", &lua_vma::rw<int8_t, false>);
objclass<lua_vma>().bind(*L, "byte", &lua_vma::rw<uint8_t, false>);
objclass<lua_vma>().bind(*L, "sword", &lua_vma::rw<int16_t, false>);
objclass<lua_vma>().bind(*L, "word", &lua_vma::rw<uint16_t, false>);
objclass<lua_vma>().bind(*L, "sdword", &lua_vma::rw<int32_t, false>);
objclass<lua_vma>().bind(*L, "dword", &lua_vma::rw<uint32_t, false>);
objclass<lua_vma>().bind(*L, "sqword", &lua_vma::rw<int64_t, false>);
objclass<lua_vma>().bind(*L, "qword", &lua_vma::rw<uint64_t, false>);
objclass<lua_vma>().bind(*L, "isbyte", &lua_vma::rw<int8_t, true>);
objclass<lua_vma>().bind(*L, "ibyte", &lua_vma::rw<uint8_t, true>);
objclass<lua_vma>().bind(*L, "isword", &lua_vma::rw<int16_t, true>);
objclass<lua_vma>().bind(*L, "iword", &lua_vma::rw<uint16_t, true>);
objclass<lua_vma>().bind(*L, "isdword", &lua_vma::rw<int32_t, true>);
objclass<lua_vma>().bind(*L, "idword", &lua_vma::rw<uint32_t, true>);
objclass<lua_vma>().bind(*L, "isqword", &lua_vma::rw<int64_t, true>);
objclass<lua_vma>().bind(*L, "iqword", &lua_vma::rw<uint64_t, true>);
if(L.do_once(&doonce_key)) {
objclass<lua_vma>().bind(L, "info", &lua_vma::info);
objclass<lua_vma>().bind(L, "sbyte", &lua_vma::rw<int8_t, false>);
objclass<lua_vma>().bind(L, "byte", &lua_vma::rw<uint8_t, false>);
objclass<lua_vma>().bind(L, "sword", &lua_vma::rw<int16_t, false>);
objclass<lua_vma>().bind(L, "word", &lua_vma::rw<uint16_t, false>);
objclass<lua_vma>().bind(L, "sdword", &lua_vma::rw<int32_t, false>);
objclass<lua_vma>().bind(L, "dword", &lua_vma::rw<uint32_t, false>);
objclass<lua_vma>().bind(L, "sqword", &lua_vma::rw<int64_t, false>);
objclass<lua_vma>().bind(L, "qword", &lua_vma::rw<uint64_t, false>);
objclass<lua_vma>().bind(L, "isbyte", &lua_vma::rw<int8_t, true>);
objclass<lua_vma>().bind(L, "ibyte", &lua_vma::rw<uint8_t, true>);
objclass<lua_vma>().bind(L, "isword", &lua_vma::rw<int16_t, true>);
objclass<lua_vma>().bind(L, "iword", &lua_vma::rw<uint16_t, true>);
objclass<lua_vma>().bind(L, "isdword", &lua_vma::rw<int32_t, true>);
objclass<lua_vma>().bind(L, "idword", &lua_vma::rw<uint32_t, true>);
objclass<lua_vma>().bind(L, "isqword", &lua_vma::rw<int64_t, true>);
objclass<lua_vma>().bind(L, "iqword", &lua_vma::rw<uint64_t, true>);
}
vmabase = r->base;
vmasize = r->size;
@ -134,13 +134,13 @@ namespace
throw std::runtime_error("VMA::rw<T>: Parameter #3 must be integer if present");
}
lua_vma_list::lua_vma_list(lua_state* L)
lua_vma_list::lua_vma_list(lua_state& L)
{
static char doonce_key;
if(L->do_once(&doonce_key)) {
objclass<lua_vma_list>().bind(*L, "__index", &lua_vma_list::index, true);
objclass<lua_vma_list>().bind(*L, "__newindex", &lua_vma_list::newindex, true);
objclass<lua_vma_list>().bind(*L, "__call", &lua_vma_list::call);
if(L.do_once(&doonce_key)) {
objclass<lua_vma_list>().bind(L, "__index", &lua_vma_list::index, true);
objclass<lua_vma_list>().bind(L, "__newindex", &lua_vma_list::newindex, true);
objclass<lua_vma_list>().bind(L, "__call", &lua_vma_list::call);
}
}
@ -164,7 +164,7 @@ namespace
std::list<memory_region*>::iterator i;
for(i = l.begin(), j = 0; i != l.end(); i++, j++)
if((*i)->name == vma) {
lua_class<lua_vma>::create(L, &L, *i);
lua_class<lua_vma>::create(L, *i);
return 1;
}
throw std::runtime_error("VMALIST::__index: No such VMA");
@ -177,7 +177,7 @@ namespace
function_ptr_luafun memory2(lua_func_misc, "memory2", [](lua_state& L, const std::string& fname) ->
int {
lua_class<lua_vma_list>::create(L, &L);
lua_class<lua_vma_list>::create(L);
return 1;
});
}