Lua: Use full userdata to store class binds
This commit is contained in:
parent
9092dea931
commit
e7472118a5
4 changed files with 12 additions and 18 deletions
|
@ -624,7 +624,7 @@ template<class T> struct lua_class_bind_data
|
|||
/**
|
||||
* The name of the method to pass.
|
||||
*/
|
||||
std::string fname;
|
||||
char fname[];
|
||||
};
|
||||
|
||||
template<class T> class lua_class;
|
||||
|
@ -734,22 +734,16 @@ public:
|
|||
* Parameter fn: The method to call.
|
||||
* Parameter force: If true, overwrite existing method.
|
||||
*/
|
||||
void bind(lua_state& state, const char* keyname, int (T::*fn)(lua_state& LS), bool force = false)
|
||||
void bind(lua_state& state, const char* keyname, int (T::*fn)(lua_state& LS))
|
||||
{
|
||||
load_metatable(state);
|
||||
state.pushstring(keyname);
|
||||
state.rawget(-2);
|
||||
if(!state.isnil(-1) && !force) {
|
||||
state.pop(2);
|
||||
return;
|
||||
}
|
||||
state.pop(1);
|
||||
lua_class_bind_data<T>* bdata = new lua_class_bind_data<T>;
|
||||
std::string fname = std::string("Method ") + keyname;
|
||||
void* ptr = state.newuserdata(sizeof(lua_class_bind_data<T>) + fname.length() + 1);
|
||||
lua_class_bind_data<T>* bdata = reinterpret_cast<lua_class_bind_data<T>*>(ptr);
|
||||
bdata->fn = fn;
|
||||
bdata->fname = std::string("Method ") + keyname;
|
||||
bdata->state = &state.get_master();
|
||||
state.pushstring(keyname);
|
||||
state.pushlightuserdata(bdata);
|
||||
std::copy(fname.begin(), fname.end(), bdata->fname);
|
||||
state.pushcclosure(class_bind_trampoline, 1);
|
||||
state.rawset(-3);
|
||||
state.pop(1);
|
||||
|
|
|
@ -34,8 +34,8 @@ namespace
|
|||
{
|
||||
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);
|
||||
objclass<lua_callbacks_list>().bind(L, "__index", &lua_callbacks_list::index);
|
||||
objclass<lua_callbacks_list>().bind(L, "__newindex", &lua_callbacks_list::newindex);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -476,8 +476,8 @@ 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, "__index", &lua_mmap_struct::index);
|
||||
objclass<lua_mmap_struct>().bind(L, "__newindex", &lua_mmap_struct::newindex);
|
||||
objclass<lua_mmap_struct>().bind(L, "__call", &lua_mmap_struct::map);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -138,8 +138,8 @@ namespace
|
|||
{
|
||||
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, "__index", &lua_vma_list::index);
|
||||
objclass<lua_vma_list>().bind(L, "__newindex", &lua_vma_list::newindex);
|
||||
objclass<lua_vma_list>().bind(L, "__call", &lua_vma_list::call);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue