[DEV] try set it work again
This commit is contained in:
parent
aa8da54776
commit
40b8cc7825
@ -31,13 +31,12 @@
|
|||||||
*
|
*
|
||||||
* For more information see the README and the comments below
|
* For more information see the README and the comments below
|
||||||
*/
|
*/
|
||||||
#ifndef __LUA_WRAPPER_H__
|
#pragma once
|
||||||
#define __LUA_WRAPPER_H__
|
|
||||||
|
|
||||||
// If you are linking against Lua compiled in C++, define LUAW_NO_EXTERN_C
|
// If you are linking against Lua compiled in C++, define LUAW_NO_EXTERN_C
|
||||||
#include <lua/lua.h>
|
#include <lua/lua.h>
|
||||||
#include <lua/lauxlib.h>
|
#include <lua/lauxlib.h>
|
||||||
#include <memory>
|
#include <ememory/memory.hpp>
|
||||||
|
|
||||||
#define LUAW_POSTCTOR_KEY "__postctor"
|
#define LUAW_POSTCTOR_KEY "__postctor"
|
||||||
#define LUAW_EXTENDS_KEY "__extends"
|
#define LUAW_EXTENDS_KEY "__extends"
|
||||||
@ -51,7 +50,7 @@
|
|||||||
* Useful for when a parameter index needs to be adjusted
|
* Useful for when a parameter index needs to be adjusted
|
||||||
* after pushing or popping things off the stack
|
* after pushing or popping things off the stack
|
||||||
*/
|
*/
|
||||||
inline int luaW_correctindex(lua_State* _L, int _index, int _correction) {
|
inline int luaW_correctindex(lua_State* _luaState, int _index, int _correction) {
|
||||||
return _index < 0 ? _index - _correction : _index;
|
return _index < 0 ? _index - _correction : _index;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -60,8 +59,8 @@ inline int luaW_correctindex(lua_State* _L, int _index, int _correction) {
|
|||||||
* alternative option, you may select a different function when registering
|
* alternative option, you may select a different function when registering
|
||||||
* your class.
|
* your class.
|
||||||
*/
|
*/
|
||||||
template <typename T> std::shared_ptr<T> luaW_defaultallocator(lua_State* _L) {
|
template <typename T> ememory::SharedPtr<T> luaW_defaultallocator(lua_State* _luaState) {
|
||||||
return std::make_shared<T>();
|
return ememory::makeShared<T>();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -71,8 +70,8 @@ template <typename T> std::shared_ptr<T> luaW_defaultallocator(lua_State* _L) {
|
|||||||
* are using shared_ptr you would need to push the address of the object the
|
* are using shared_ptr you would need to push the address of the object the
|
||||||
* shared_ptr represents, rather than the address of the shared_ptr itself.
|
* shared_ptr represents, rather than the address of the shared_ptr itself.
|
||||||
*/
|
*/
|
||||||
template <typename T> void luaW_defaultidentifier(lua_State* _L, std::shared_ptr<T> _obj) {
|
template <typename T> void luaW_defaultidentifier(lua_State* _luaState, ememory::SharedPtr<T> _obj) {
|
||||||
lua_pushlightuserdata(_L, _obj.get());
|
lua_pushlightuserdata(_luaState, _obj.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -84,12 +83,26 @@ template <typename T> void luaW_defaultidentifier(lua_State* _L, std::shared_ptr
|
|||||||
* when and object is the type I want. This is only used internally.
|
* when and object is the type I want. This is only used internally.
|
||||||
*/
|
*/
|
||||||
struct luaW_Userdata {
|
struct luaW_Userdata {
|
||||||
luaW_Userdata(std::shared_ptr<void> vptr = NULL, luaW_Userdata (*udcast)(const luaW_Userdata&) = NULL) :
|
luaW_Userdata(ememory::SharedPtr<void> vptr = NULL, luaW_Userdata (*udcast)(const luaW_Userdata&) = NULL) :
|
||||||
data(vptr),
|
data(etk::move(vptr)),
|
||||||
cast(udcast) {
|
cast(udcast) {
|
||||||
// nothing to do ...
|
// nothing to do ...
|
||||||
}
|
}
|
||||||
std::shared_ptr<void> data;
|
luaW_Userdata(luaW_Userdata&& _obj) {
|
||||||
|
etk::swap(data, _obj.data);
|
||||||
|
}
|
||||||
|
luaW_Userdata(const luaW_Userdata& _obj) {
|
||||||
|
data = _obj.data;
|
||||||
|
}
|
||||||
|
luaW_Userdata& operator= (luaW_Userdata&& _obj) {
|
||||||
|
etk::swap(data, _obj.data);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
luaW_Userdata& operator= (const luaW_Userdata& _obj) {
|
||||||
|
data = _obj.data;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
ememory::SharedPtr<void> data;
|
||||||
luaW_Userdata (*cast)(const luaW_Userdata&);
|
luaW_Userdata (*cast)(const luaW_Userdata&);
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -100,18 +113,18 @@ struct luaW_Userdata {
|
|||||||
template <typename T> class LuaWrapper {
|
template <typename T> class LuaWrapper {
|
||||||
public:
|
public:
|
||||||
static const char* classname;
|
static const char* classname;
|
||||||
static void (*identifier)(lua_State*, std::shared_ptr<T>);
|
static void (*identifier)(lua_State*, ememory::SharedPtr<T>);
|
||||||
static std::shared_ptr<T> (*allocator)(lua_State*);
|
static ememory::SharedPtr<T> (*allocator)(lua_State*);
|
||||||
static luaW_Userdata (*cast)(const luaW_Userdata&);
|
static luaW_Userdata (*cast)(const luaW_Userdata&);
|
||||||
static void (*postconstructorrecurse)(lua_State* _L, int numargs);
|
static void (*postconstructorrecurse)(lua_State* _luaState, int numargs);
|
||||||
private:
|
private:
|
||||||
LuaWrapper();
|
LuaWrapper();
|
||||||
};
|
};
|
||||||
template <typename T> const char* LuaWrapper<T>::classname;
|
template <typename T> const char* LuaWrapper<T>::classname;
|
||||||
template <typename T> void (*LuaWrapper<T>::identifier)(lua_State*, std::shared_ptr<T>);
|
template <typename T> void (*LuaWrapper<T>::identifier)(lua_State*, ememory::SharedPtr<T>);
|
||||||
template <typename T> std::shared_ptr<T> (*LuaWrapper<T>::allocator)(lua_State*);
|
template <typename T> ememory::SharedPtr<T> (*LuaWrapper<T>::allocator)(lua_State*);
|
||||||
template <typename T> luaW_Userdata (*LuaWrapper<T>::cast)(const luaW_Userdata&);
|
template <typename T> luaW_Userdata (*LuaWrapper<T>::cast)(const luaW_Userdata&);
|
||||||
template <typename T> void (*LuaWrapper<T>::postconstructorrecurse)(lua_State* _L, int _numargs);
|
template <typename T> void (*LuaWrapper<T>::postconstructorrecurse)(lua_State* _luaState, int _numargs);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Cast from an object of type T to an object of type U. This template
|
* Cast from an object of type T to an object of type U. This template
|
||||||
@ -119,19 +132,19 @@ template <typename T> void (*LuaWrapper<T>::postconstructorrecurse)(lua_State* _
|
|||||||
* internally.
|
* internally.
|
||||||
*/
|
*/
|
||||||
template <typename T, typename U> luaW_Userdata luaW_cast(const luaW_Userdata& _obj) {
|
template <typename T, typename U> luaW_Userdata luaW_cast(const luaW_Userdata& _obj) {
|
||||||
return luaW_Userdata(static_cast<U*>(std::static_pointer_cast<T>(_obj.data)), LuaWrapper<U>::cast);
|
return luaW_Userdata(static_cast<U*>(ememory::staticPointerCast<T>(_obj.data)), LuaWrapper<U>::cast);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T, typename U> void luaW_identify(lua_State* _L, T* _obj) {
|
template <typename T, typename U> void luaW_identify(lua_State* _luaState, T* _obj) {
|
||||||
LuaWrapper<U>::identifier(_L, static_cast<U*>(_obj));
|
LuaWrapper<U>::identifier(_luaState, static_cast<U*>(_obj));
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T> inline void luaW_wrapperfield(lua_State* _L, const char* _field) {
|
template <typename T> inline void luaW_wrapperfield(lua_State* _luaState, const char* _field) {
|
||||||
lua_getfield(_L, LUA_REGISTRYINDEX, LUAW_WRAPPER_KEY); // ... LuaWrapper
|
lua_getfield(_luaState, LUA_REGISTRYINDEX, LUAW_WRAPPER_KEY); // ... LuaWrapper
|
||||||
lua_getfield(_L, -1, _field); // ... LuaWrapper LuaWrapper.field
|
lua_getfield(_luaState, -1, _field); // ... LuaWrapper LuaWrapper.field
|
||||||
lua_getfield(_L, -1, LuaWrapper<T>::classname); // ... LuaWrapper LuaWrapper.field LuaWrapper.field.class
|
lua_getfield(_luaState, -1, LuaWrapper<T>::classname); // ... LuaWrapper LuaWrapper.field LuaWrapper.field.class
|
||||||
lua_replace(_L, -3); // ... LuaWrapper.field.class LuaWrapper.field
|
lua_replace(_luaState, -3); // ... LuaWrapper.field.class LuaWrapper.field
|
||||||
lua_pop(_L, 1); // ... LuaWrapper.field.class
|
lua_pop(_luaState, 1); // ... LuaWrapper.field.class
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -140,25 +153,25 @@ template <typename T> inline void luaW_wrapperfield(lua_State* _L, const char* _
|
|||||||
* Returns 1 if the value at the given acceptable index is of type T (or if
|
* Returns 1 if the value at the given acceptable index is of type T (or if
|
||||||
* strict is false, convertable to type T) and 0 otherwise.
|
* strict is false, convertable to type T) and 0 otherwise.
|
||||||
*/
|
*/
|
||||||
template <typename T> bool luaW_is(lua_State *_L, int _index, bool _strict = false) {
|
template <typename T> bool luaW_is(lua_State *_luaState, int _index, bool _strict = false) {
|
||||||
bool equal = false;// lua_isnil(_L, index);
|
bool equal = false;// lua_isnil(_luaState, index);
|
||||||
if (!equal && lua_isuserdata(_L, _index) && lua_getmetatable(_L, _index)) {
|
if (!equal && lua_isuserdata(_luaState, _index) && lua_getmetatable(_luaState, _index)) {
|
||||||
// ... ud ... udmt
|
// ... ud ... udmt
|
||||||
luaL_getmetatable(_L, LuaWrapper<T>::classname); // ... ud ... udmt Tmt
|
luaL_getmetatable(_luaState, LuaWrapper<T>::classname); // ... ud ... udmt Tmt
|
||||||
equal = lua_rawequal(_L, -1, -2) != 0;
|
equal = lua_rawequal(_luaState, -1, -2) != 0;
|
||||||
if (!equal && !_strict) {
|
if (!equal && !_strict) {
|
||||||
lua_getfield(_L, -2, LUAW_EXTENDS_KEY); // ... ud ... udmt Tmt udmt.extends
|
lua_getfield(_luaState, -2, LUAW_EXTENDS_KEY); // ... ud ... udmt Tmt udmt.extends
|
||||||
for (lua_pushnil(_L); lua_next(_L, -2); lua_pop(_L, 1)) {
|
for (lua_pushnil(_luaState); lua_next(_luaState, -2); lua_pop(_luaState, 1)) {
|
||||||
// ... ud ... udmt Tmt udmt.extends k v
|
// ... ud ... udmt Tmt udmt.extends k v
|
||||||
equal = lua_rawequal(_L, -1, -4) != 0;
|
equal = lua_rawequal(_luaState, -1, -4) != 0;
|
||||||
if (equal) {
|
if (equal) {
|
||||||
lua_pop(_L, 2); // ... ud ... udmt Tmt udmt.extends
|
lua_pop(_luaState, 2); // ... ud ... udmt Tmt udmt.extends
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
lua_pop(_L, 1); // ... ud ... udmt Tmt
|
lua_pop(_luaState, 1); // ... ud ... udmt Tmt
|
||||||
}
|
}
|
||||||
lua_pop(_L, 2); // ... ud ...
|
lua_pop(_luaState, 2); // ... ud ...
|
||||||
}
|
}
|
||||||
return equal;
|
return equal;
|
||||||
}
|
}
|
||||||
@ -169,18 +182,18 @@ template <typename T> bool luaW_is(lua_State *_L, int _index, bool _strict = fal
|
|||||||
* Converts the given acceptable index to a T*. That value must be of (or
|
* Converts the given acceptable index to a T*. That value must be of (or
|
||||||
* convertable to) type T; otherwise, returns NULL.
|
* convertable to) type T; otherwise, returns NULL.
|
||||||
*/
|
*/
|
||||||
template <typename T> std::shared_ptr<T> luaW_to(lua_State* _L, int _index, bool _strict = false) {
|
template <typename T> ememory::SharedPtr<T> luaW_to(lua_State* _luaState, int _index, bool _strict = false) {
|
||||||
if (luaW_is<T>(_L, _index, _strict)) {
|
if (luaW_is<T>(_luaState, _index, _strict)) {
|
||||||
luaW_Userdata* pud = static_cast<luaW_Userdata*>(lua_touserdata(_L, _index));
|
luaW_Userdata* pud = static_cast<luaW_Userdata*>(lua_touserdata(_luaState, _index));
|
||||||
luaW_Userdata ud;
|
luaW_Userdata ud;
|
||||||
while ( !_strict
|
while ( !_strict
|
||||||
&& LuaWrapper<T>::cast != pud->cast) {
|
&& LuaWrapper<T>::cast != pud->cast) {
|
||||||
ud = pud->cast(*pud);
|
ud = pud->cast(*pud);
|
||||||
pud = &ud;
|
pud = &ud;
|
||||||
}
|
}
|
||||||
return std::static_pointer_cast<T>(pud->data);
|
return ememory::staticPointerCast<T>(pud->data);
|
||||||
}
|
}
|
||||||
return NULL;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -189,28 +202,28 @@ template <typename T> std::shared_ptr<T> luaW_to(lua_State* _L, int _index, bool
|
|||||||
* Converts the given acceptable index to a T*. That value must be of (or
|
* Converts the given acceptable index to a T*. That value must be of (or
|
||||||
* convertable to) type T; otherwise, an error is raised.
|
* convertable to) type T; otherwise, an error is raised.
|
||||||
*/
|
*/
|
||||||
template <typename T> std::shared_ptr<T> luaW_check(lua_State* _L, int _index, bool _strict = false) {
|
inline template <typename T> ememory::SharedPtr<T> luaW_check(lua_State* _luaState, int _index, bool _strict = false) {
|
||||||
std::shared_ptr<T> obj;
|
ememory::SharedPtr<T> obj;
|
||||||
if (luaW_is<T>(_L, _index, _strict)) {
|
if (luaW_is<T>(_luaState, _index, _strict)) {
|
||||||
luaW_Userdata* pud = static_cast<luaW_Userdata*>(lua_touserdata(_L, _index));
|
luaW_Userdata* pud = static_cast<luaW_Userdata*>(lua_touserdata(_luaState, _index));
|
||||||
luaW_Userdata ud;
|
luaW_Userdata ud;
|
||||||
while (!_strict && LuaWrapper<T>::cast != pud->cast) {
|
while (!_strict && LuaWrapper<T>::cast != pud->cast) {
|
||||||
ud = pud->cast(*pud);
|
ud = pud->cast(*pud);
|
||||||
pud = &ud;
|
pud = &ud;
|
||||||
}
|
}
|
||||||
obj = std::static_pointer_cast<T>(pud->data);
|
obj = ememory::staticPointerCast<T>(pud->data);
|
||||||
} else {
|
} else {
|
||||||
const char *msg = lua_pushfstring(_L, "%s expected, got %s", LuaWrapper<T>::classname, luaL_typename(_L, _index));
|
const char *msg = lua_pushfstring(_luaState, "%s expected, got %s", LuaWrapper<T>::classname, luaL_typename(_luaState, _index));
|
||||||
luaL_argerror(_L, _index, msg);
|
luaL_argerror(_luaState, _index, msg);
|
||||||
}
|
}
|
||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T> std::shared_ptr<T> luaW_opt(lua_State* _L, int _index, std::shared_ptr<T> _fallback = null, bool _strict = false) {
|
inline template <typename T> ememory::SharedPtr<T> luaW_opt(lua_State* _luaState, int _index, ememory::SharedPtr<T> _fallback = NULL, bool _strict = false) {
|
||||||
if (lua_isnil(_L, _index)) {
|
if (lua_isnil(_luaState, _index)) {
|
||||||
return _fallback;
|
return _fallback;
|
||||||
} else {
|
} else {
|
||||||
return luaW_check<T>(_L, _index, _strict);
|
return luaW_check<T>(_luaState, _index, _strict);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -221,31 +234,31 @@ template <typename T> std::shared_ptr<T> luaW_opt(lua_State* _L, int _index, std
|
|||||||
* the Lua environment, it will assign the existing storage table to it.
|
* the Lua environment, it will assign the existing storage table to it.
|
||||||
* Otherwise, a new storage table will be created for it.
|
* Otherwise, a new storage table will be created for it.
|
||||||
*/
|
*/
|
||||||
template <typename T> void luaW_push(lua_State* _L, std::shared_ptr<T> _obj) {
|
inline template <typename T> void luaW_push(lua_State* _luaState, ememory::SharedPtr<T> _obj) {
|
||||||
if (_obj) {
|
if (_obj != null) {
|
||||||
LuaWrapper<T>::identifier(_L, _obj); // ... id
|
LuaWrapper<T>::identifier(_luaState, _obj); // ... id
|
||||||
luaW_wrapperfield<T>(_L, LUAW_CACHE_KEY); // ... id cache
|
luaW_wrapperfield<T>(_luaState, LUAW_CACHE_KEY); // ... id cache
|
||||||
lua_pushvalue(_L, -2); // ... id cache id
|
lua_pushvalue(_luaState, -2); // ... id cache id
|
||||||
lua_gettable(_L, -2); // ... id cache obj
|
lua_gettable(_luaState, -2); // ... id cache obj
|
||||||
if (lua_isnil(_L, -1)) {
|
if (lua_isnil(_luaState, -1)) {
|
||||||
// Create the new luaW_userdata and place it in the cache
|
// Create the new luaW_userdata and place it in the cache
|
||||||
lua_pop(_L, 1); // ... id cache
|
lua_pop(_luaState, 1); // ... id cache
|
||||||
lua_insert(_L, -2); // ... cache id
|
lua_insert(_luaState, -2); // ... cache id
|
||||||
luaW_Userdata* ud = static_cast<luaW_Userdata*>(lua_newuserdata(_L, sizeof(luaW_Userdata))); // ... cache id obj
|
luaW_Userdata* ud = static_cast<luaW_Userdata*>(lua_newuserdata(_luaState, sizeof(luaW_Userdata))); // ... cache id obj
|
||||||
ud->data = _obj;
|
ud->data = _obj;
|
||||||
ud->cast = LuaWrapper<T>::cast;
|
ud->cast = LuaWrapper<T>::cast;
|
||||||
lua_pushvalue(_L, -1); // ... cache id obj obj
|
lua_pushvalue(_luaState, -1); // ... cache id obj obj
|
||||||
lua_insert(_L, -4); // ... obj cache id obj
|
lua_insert(_luaState, -4); // ... obj cache id obj
|
||||||
lua_settable(_L, -3); // ... obj cache
|
lua_settable(_luaState, -3); // ... obj cache
|
||||||
luaL_getmetatable(_L, LuaWrapper<T>::classname); // ... obj cache mt
|
luaL_getmetatable(_luaState, LuaWrapper<T>::classname); // ... obj cache mt
|
||||||
lua_setmetatable(_L, -3); // ... obj cache
|
lua_setmetatable(_luaState, -3); // ... obj cache
|
||||||
lua_pop(_L, 1); // ... obj
|
lua_pop(_luaState, 1); // ... obj
|
||||||
} else {
|
} else {
|
||||||
lua_replace(_L, -3); // ... obj cache
|
lua_replace(_luaState, -3); // ... obj cache
|
||||||
lua_pop(_L, 1); // ... obj
|
lua_pop(_luaState, 1); // ... obj
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
lua_pushnil(_L);
|
lua_pushnil(_luaState);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -257,21 +270,21 @@ template <typename T> void luaW_push(lua_State* _L, std::shared_ptr<T> _obj) {
|
|||||||
* Returns true if luaW_hold took hold of the object, and false if it was
|
* Returns true if luaW_hold took hold of the object, and false if it was
|
||||||
* already held
|
* already held
|
||||||
*/
|
*/
|
||||||
template <typename T> bool luaW_hold(lua_State* _L, std::shared_ptr<T> _obj) {
|
inline template <typename T> bool luaW_hold(lua_State* _luaState, ememory::SharedPtr<T> _obj) {
|
||||||
luaW_wrapperfield<T>(_L, LUAW_HOLDS_KEY); // ... holds
|
luaW_wrapperfield<T>(_luaState, LUAW_HOLDS_KEY); // ... holds
|
||||||
LuaWrapper<T>::identifier(_L, _obj); // ... holds id
|
LuaWrapper<T>::identifier(_luaState, _obj); // ... holds id
|
||||||
lua_pushvalue(_L, -1); // ... holds id id
|
lua_pushvalue(_luaState, -1); // ... holds id id
|
||||||
lua_gettable(_L, -3); // ... holds id hold
|
lua_gettable(_luaState, -3); // ... holds id hold
|
||||||
// If it's not held, hold it
|
// If it's not held, hold it
|
||||||
if (!lua_toboolean(_L, -1)) {
|
if (!lua_toboolean(_luaState, -1)) {
|
||||||
// Apply hold boolean
|
// Apply hold boolean
|
||||||
lua_pop(_L, 1); // ... holds id
|
lua_pop(_luaState, 1); // ... holds id
|
||||||
lua_pushboolean(_L, true); // ... holds id true
|
lua_pushboolean(_luaState, true); // ... holds id true
|
||||||
lua_settable(_L, -3); // ... holds
|
lua_settable(_luaState, -3); // ... holds
|
||||||
lua_pop(_L, 1); // ...
|
lua_pop(_luaState, 1); // ...
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
lua_pop(_L, 3); // ...
|
lua_pop(_luaState, 3); // ...
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -285,35 +298,35 @@ template <typename T> bool luaW_hold(lua_State* _L, std::shared_ptr<T> _obj) {
|
|||||||
* has already been deallocated. A wrapper is provided for when it is more
|
* has already been deallocated. A wrapper is provided for when it is more
|
||||||
* convenient to pass in the object directly.
|
* convenient to pass in the object directly.
|
||||||
*/
|
*/
|
||||||
template <typename T> void luaW_release(lua_State* _L, int _index) {
|
template <typename T> void luaW_release(lua_State* _luaState, int _index) {
|
||||||
luaW_wrapperfield<T>(_L, LUAW_HOLDS_KEY); // ... id ... holds
|
luaW_wrapperfield<T>(_luaState, LUAW_HOLDS_KEY); // ... id ... holds
|
||||||
lua_pushvalue(_L, luaW_correctindex(_L, _index, 1)); // ... id ... holds id
|
lua_pushvalue(_luaState, luaW_correctindex(_luaState, _index, 1)); // ... id ... holds id
|
||||||
lua_pushnil(_L); // ... id ... holds id nil
|
lua_pushnil(_luaState); // ... id ... holds id nil
|
||||||
lua_settable(_L, -3); // ... id ... holds
|
lua_settable(_luaState, -3); // ... id ... holds
|
||||||
lua_pop(_L, 1); // ... id ...
|
lua_pop(_luaState, 1); // ... id ...
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T> void luaW_release(lua_State* _L, T* _obj) {
|
template <typename T> void luaW_release(lua_State* _luaState, T* _obj) {
|
||||||
LuaWrapper<T>::identifier(_L, _obj); // ... id
|
LuaWrapper<T>::identifier(_luaState, _obj); // ... id
|
||||||
luaW_release<T>(_L, -1); // ... id
|
luaW_release<T>(_luaState, -1); // ... id
|
||||||
lua_pop(_L, 1); // ...
|
lua_pop(_luaState, 1); // ...
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T> void luaW_postconstructorinternal(lua_State* _L, int _numargs) {
|
template <typename T> void luaW_postconstructorinternal(lua_State* _luaState, int _numargs) {
|
||||||
// ... ud args...
|
// ... ud args...
|
||||||
if (LuaWrapper<T>::postconstructorrecurse) {
|
if (LuaWrapper<T>::postconstructorrecurse) {
|
||||||
LuaWrapper<T>::postconstructorrecurse(_L, _numargs);
|
LuaWrapper<T>::postconstructorrecurse(_luaState, _numargs);
|
||||||
}
|
}
|
||||||
luaL_getmetatable(_L, LuaWrapper<T>::classname); // ... ud args... mt
|
luaL_getmetatable(_luaState, LuaWrapper<T>::classname); // ... ud args... mt
|
||||||
lua_getfield(_L, -1, LUAW_POSTCTOR_KEY); // ... ud args... mt postctor
|
lua_getfield(_luaState, -1, LUAW_POSTCTOR_KEY); // ... ud args... mt postctor
|
||||||
if (lua_type(_L, -1) == LUA_TFUNCTION) {
|
if (lua_type(_luaState, -1) == LUA_TFUNCTION) {
|
||||||
for (int i = 0; i < _numargs + 1; i++) {
|
for (int i = 0; i < _numargs + 1; i++) {
|
||||||
lua_pushvalue(_L, -3 - _numargs); // ... ud args... mt postctor ud args...
|
lua_pushvalue(_luaState, -3 - _numargs); // ... ud args... mt postctor ud args...
|
||||||
}
|
}
|
||||||
lua_call(_L, _numargs + 1, 0); // ... ud args... mt
|
lua_call(_luaState, _numargs + 1, 0); // ... ud args... mt
|
||||||
lua_pop(_L, 1); // ... ud args...
|
lua_pop(_luaState, 1); // ... ud args...
|
||||||
} else {
|
} else {
|
||||||
lua_pop(_L, 2); // ... ud args...
|
lua_pop(_luaState, 2); // ... ud args...
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -327,10 +340,10 @@ template <typename T> void luaW_postconstructorinternal(lua_State* _L, int _numa
|
|||||||
* arguments This exists to allow types to adjust values in thier storage table,
|
* arguments This exists to allow types to adjust values in thier storage table,
|
||||||
* which can not be created until after the constructor is called.
|
* which can not be created until after the constructor is called.
|
||||||
*/
|
*/
|
||||||
template <typename T> void luaW_postconstructor(lua_State* _L, int _numargs) {
|
template <typename T> void luaW_postconstructor(lua_State* _luaState, int _numargs) {
|
||||||
// ... ud args...
|
// ... ud args...
|
||||||
luaW_postconstructorinternal<T>(_L, _numargs); // ... ud args...
|
luaW_postconstructorinternal<T>(_luaState, _numargs); // ... ud args...
|
||||||
lua_pop(_L, _numargs); // ... ud
|
lua_pop(_luaState, _numargs); // ... ud
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -339,18 +352,18 @@ template <typename T> void luaW_postconstructor(lua_State* _L, int _numargs) {
|
|||||||
* Creates an object of type T using the constructor and subsequently calls the
|
* Creates an object of type T using the constructor and subsequently calls the
|
||||||
* post-constructor on it.
|
* post-constructor on it.
|
||||||
*/
|
*/
|
||||||
template <typename T> inline int luaW_new(lua_State* _L, int _numargs) {
|
template <typename T> inline int luaW_new(lua_State* _luaState, int _numargs) {
|
||||||
// ... args...
|
// ... args...
|
||||||
std::shared_ptr<T> obj = LuaWrapper<T>::allocator(_L);
|
ememory::SharedPtr<T> obj = LuaWrapper<T>::allocator(_luaState);
|
||||||
luaW_push<T>(_L, obj); // ... args... ud
|
luaW_push<T>(_luaState, obj); // ... args... ud
|
||||||
luaW_hold<T>(_L, obj);
|
luaW_hold<T>(_luaState, obj);
|
||||||
lua_insert(_L, -1 - _numargs); // ... ud args...
|
lua_insert(_luaState, -1 - _numargs); // ... ud args...
|
||||||
luaW_postconstructor<T>(_L, _numargs); // ... ud
|
luaW_postconstructor<T>(_luaState, _numargs); // ... ud
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T> int luaW_new(lua_State* _L) {
|
template <typename T> int luaW_new(lua_State* _luaState) {
|
||||||
return luaW_new<T>(_L, lua_gettop(_L));
|
return luaW_new<T>(_luaState, lua_gettop(_luaState));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -362,24 +375,24 @@ template <typename T> int luaW_new(lua_State* _L) {
|
|||||||
* individual userdata can be treated as a table, and can hold thier own
|
* individual userdata can be treated as a table, and can hold thier own
|
||||||
* values.
|
* values.
|
||||||
*/
|
*/
|
||||||
template <typename T> int luaW_index(lua_State* _L) {
|
template <typename T> int luaW_index(lua_State* _luaState) {
|
||||||
// obj key
|
// obj key
|
||||||
std::shared_ptr<T> obj = luaW_to<T>(_L, 1);
|
ememory::SharedPtr<T> obj = luaW_to<T>(_luaState, 1);
|
||||||
luaW_wrapperfield<T>(_L, LUAW_STORAGE_KEY); // obj key storage
|
luaW_wrapperfield<T>(_luaState, LUAW_STORAGE_KEY); // obj key storage
|
||||||
LuaWrapper<T>::identifier(_L, obj); // obj key storage id
|
LuaWrapper<T>::identifier(_luaState, obj); // obj key storage id
|
||||||
lua_gettable(_L, -2); // obj key storage store
|
lua_gettable(_luaState, -2); // obj key storage store
|
||||||
// Check if storage table exists
|
// Check if storage table exists
|
||||||
if (!lua_isnil(_L, -1)) {
|
if (!lua_isnil(_luaState, -1)) {
|
||||||
lua_pushvalue(_L, -3); // obj key storage store key
|
lua_pushvalue(_luaState, -3); // obj key storage store key
|
||||||
lua_gettable(_L, -2); // obj key storage store store[k]
|
lua_gettable(_luaState, -2); // obj key storage store store[k]
|
||||||
}
|
}
|
||||||
// If either there is no storage table or the key wasn't found
|
// If either there is no storage table or the key wasn't found
|
||||||
// then fall back to the metatable
|
// then fall back to the metatable
|
||||||
if (lua_isnil(_L, -1)) {
|
if (lua_isnil(_luaState, -1)) {
|
||||||
lua_settop(_L, 2); // obj key
|
lua_settop(_luaState, 2); // obj key
|
||||||
lua_getmetatable(_L, -2); // obj key mt
|
lua_getmetatable(_luaState, -2); // obj key mt
|
||||||
lua_pushvalue(_L, -2); // obj key mt k
|
lua_pushvalue(_luaState, -2); // obj key mt k
|
||||||
lua_gettable(_L, -2); // obj key mt mt[k]
|
lua_gettable(_luaState, -2); // obj key mt mt[k]
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -393,24 +406,24 @@ template <typename T> int luaW_index(lua_State* _L) {
|
|||||||
* individual userdata can be treated as a table, and can hold thier own
|
* individual userdata can be treated as a table, and can hold thier own
|
||||||
* values.
|
* values.
|
||||||
*/
|
*/
|
||||||
template <typename T> int luaW_newindex(lua_State* _L) {
|
template <typename T> int luaW_newindex(lua_State* _luaState) {
|
||||||
// obj key value
|
// obj key value
|
||||||
std::shared_ptr<T> obj = luaW_check<T>(_L, 1);
|
ememory::SharedPtr<T> obj = luaW_check<T>(_luaState, 1);
|
||||||
luaW_wrapperfield<T>(_L, LUAW_STORAGE_KEY); // obj key value storage
|
luaW_wrapperfield<T>(_luaState, LUAW_STORAGE_KEY); // obj key value storage
|
||||||
LuaWrapper<T>::identifier(_L, obj); // obj key value storage id
|
LuaWrapper<T>::identifier(_luaState, obj); // obj key value storage id
|
||||||
lua_pushvalue(_L, -1); // obj key value storage id id
|
lua_pushvalue(_luaState, -1); // obj key value storage id id
|
||||||
lua_gettable(_L, -3); // obj key value storage id store
|
lua_gettable(_luaState, -3); // obj key value storage id store
|
||||||
// Add the storage table if there isn't one already
|
// Add the storage table if there isn't one already
|
||||||
if (lua_isnil(_L, -1)) {
|
if (lua_isnil(_luaState, -1)) {
|
||||||
lua_pop(_L, 1); // obj key value storage id
|
lua_pop(_luaState, 1); // obj key value storage id
|
||||||
lua_newtable(_L); // obj key value storage id store
|
lua_newtable(_luaState); // obj key value storage id store
|
||||||
lua_pushvalue(_L, -1); // obj key value storage id store store
|
lua_pushvalue(_luaState, -1); // obj key value storage id store store
|
||||||
lua_insert(_L, -3); // obj key value storage store id store
|
lua_insert(_luaState, -3); // obj key value storage store id store
|
||||||
lua_settable(_L, -4); // obj key value storage store
|
lua_settable(_luaState, -4); // obj key value storage store
|
||||||
}
|
}
|
||||||
lua_pushvalue(_L, 2); // obj key value ... store key
|
lua_pushvalue(_luaState, 2); // obj key value ... store key
|
||||||
lua_pushvalue(_L, 3); // obj key value ... store key value
|
lua_pushvalue(_luaState, 3); // obj key value ... store key value
|
||||||
lua_settable(_L, -3); // obj key value ... store
|
lua_settable(_luaState, -3); // obj key value ... store
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -421,21 +434,21 @@ template <typename T> int luaW_newindex(lua_State* _L) {
|
|||||||
* count is decremented and if this is the final reference to the userdata its
|
* count is decremented and if this is the final reference to the userdata its
|
||||||
* environment table is nil'd and pointer deleted with the destructor callback.
|
* environment table is nil'd and pointer deleted with the destructor callback.
|
||||||
*/
|
*/
|
||||||
template <typename T> int luaW_gc(lua_State* _L) {
|
template <typename T> int luaW_gc(lua_State* _luaState) {
|
||||||
// obj
|
// obj
|
||||||
std::shared_ptr<T> obj = luaW_to<T>(_L, 1);
|
ememory::SharedPtr<T> obj = luaW_to<T>(_luaState, 1);
|
||||||
LuaWrapper<T>::identifier(_L, obj); // obj key value storage id
|
LuaWrapper<T>::identifier(_luaState, obj); // obj key value storage id
|
||||||
luaW_wrapperfield<T>(_L, LUAW_HOLDS_KEY); // obj id counts count holds
|
luaW_wrapperfield<T>(_luaState, LUAW_HOLDS_KEY); // obj id counts count holds
|
||||||
lua_pushvalue(_L, 2); // obj id counts count holds id
|
lua_pushvalue(_luaState, 2); // obj id counts count holds id
|
||||||
lua_gettable(_L, -2); // obj id counts count holds hold
|
lua_gettable(_luaState, -2); // obj id counts count holds hold
|
||||||
if (lua_toboolean(_L, -1)) {
|
if (lua_toboolean(_luaState, -1)) {
|
||||||
obj.reset();
|
obj.reset();
|
||||||
}
|
}
|
||||||
luaW_wrapperfield<T>(_L, LUAW_STORAGE_KEY); // obj id counts count holds hold storage
|
luaW_wrapperfield<T>(_luaState, LUAW_STORAGE_KEY); // obj id counts count holds hold storage
|
||||||
lua_pushvalue(_L, 2); // obj id counts count holds hold storage id
|
lua_pushvalue(_luaState, 2); // obj id counts count holds hold storage id
|
||||||
lua_pushnil(_L); // obj id counts count holds hold storage id nil
|
lua_pushnil(_luaState); // obj id counts count holds hold storage id nil
|
||||||
lua_settable(_L, -3); // obj id counts count holds hold storage
|
lua_settable(_luaState, -3); // obj id counts count holds hold storage
|
||||||
luaW_release<T>(_L, 2);
|
luaW_release<T>(_luaState, 2);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -445,21 +458,21 @@ template <typename T> int luaW_gc(lua_State* _L) {
|
|||||||
*
|
*
|
||||||
* This function is only called from LuaWrapper internally.
|
* This function is only called from LuaWrapper internally.
|
||||||
*/
|
*/
|
||||||
inline void luaW_registerfuncs(lua_State* _L, const luaL_Reg _defaulttable[], const luaL_Reg _table[]) {
|
inline void luaW_registerfuncs(lua_State* _luaState, const luaL_Reg _defaulttable[], const luaL_Reg _table[]) {
|
||||||
// ... T
|
// ... T
|
||||||
#if LUA_VERSION_NUM == 502
|
#if LUA_VERSION_NUM == 502
|
||||||
if (_defaulttable) {
|
if (_defaulttable) {
|
||||||
luaL_setfuncs(_L, _defaulttable, 0); // ... T
|
luaL_setfuncs(_luaState, _defaulttable, 0); // ... T
|
||||||
}
|
}
|
||||||
if (_table) {
|
if (_table) {
|
||||||
luaL_setfuncs(_L, _table, 0); // ... T
|
luaL_setfuncs(_luaState, _table, 0); // ... T
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
if (_defaulttable) {
|
if (_defaulttable) {
|
||||||
luaL_register(_L, NULL, _defaulttable); // ... T
|
luaL_register(_luaState, NULL, _defaulttable); // ... T
|
||||||
}
|
}
|
||||||
if (_table) {
|
if (_table) {
|
||||||
luaL_register(_L, NULL, _table); // ... T
|
luaL_register(_luaState, NULL, _table); // ... T
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@ -469,30 +482,30 @@ inline void luaW_registerfuncs(lua_State* _L, const luaL_Reg _defaulttable[], co
|
|||||||
*
|
*
|
||||||
* This function is only called from LuaWrapper internally.
|
* This function is only called from LuaWrapper internally.
|
||||||
*/
|
*/
|
||||||
inline void luaW_initialize(lua_State* _L) {
|
inline void luaW_initialize(lua_State* _luaState) {
|
||||||
// Ensure that the LuaWrapper table is set up
|
// Ensure that the LuaWrapper table is set up
|
||||||
lua_getfield(_L, LUA_REGISTRYINDEX, LUAW_WRAPPER_KEY); // ... LuaWrapper
|
lua_getfield(_luaState, LUA_REGISTRYINDEX, LUAW_WRAPPER_KEY); // ... LuaWrapper
|
||||||
if (lua_isnil(_L, -1)) {
|
if (lua_isnil(_luaState, -1)) {
|
||||||
lua_newtable(_L); // ... nil {}
|
lua_newtable(_luaState); // ... nil {}
|
||||||
lua_pushvalue(_L, -1); // ... nil {} {}
|
lua_pushvalue(_luaState, -1); // ... nil {} {}
|
||||||
lua_setfield(_L, LUA_REGISTRYINDEX, LUAW_WRAPPER_KEY); // ... nil LuaWrapper
|
lua_setfield(_luaState, LUA_REGISTRYINDEX, LUAW_WRAPPER_KEY); // ... nil LuaWrapper
|
||||||
// Create a storage table
|
// Create a storage table
|
||||||
lua_newtable(_L); // ... LuaWrapper nil {}
|
lua_newtable(_luaState); // ... LuaWrapper nil {}
|
||||||
lua_setfield(_L, -2, LUAW_STORAGE_KEY); // ... nil LuaWrapper
|
lua_setfield(_luaState, -2, LUAW_STORAGE_KEY); // ... nil LuaWrapper
|
||||||
// Create a holds table
|
// Create a holds table
|
||||||
lua_newtable(_L); // ... LuaWrapper {}
|
lua_newtable(_luaState); // ... LuaWrapper {}
|
||||||
lua_setfield(_L, -2, LUAW_HOLDS_KEY); // ... nil LuaWrapper
|
lua_setfield(_luaState, -2, LUAW_HOLDS_KEY); // ... nil LuaWrapper
|
||||||
// Create a cache table, with weak values so that the userdata will not
|
// Create a cache table, with weak values so that the userdata will not
|
||||||
// be ref counted
|
// be ref counted
|
||||||
lua_newtable(_L); // ... nil LuaWrapper {}
|
lua_newtable(_luaState); // ... nil LuaWrapper {}
|
||||||
lua_setfield(_L, -2, LUAW_CACHE_KEY); // ... nil LuaWrapper
|
lua_setfield(_luaState, -2, LUAW_CACHE_KEY); // ... nil LuaWrapper
|
||||||
lua_newtable(_L); // ... nil LuaWrapper {}
|
lua_newtable(_luaState); // ... nil LuaWrapper {}
|
||||||
lua_pushstring(_L, "v"); // ... nil LuaWrapper {} "v"
|
lua_pushstring(_luaState, "v"); // ... nil LuaWrapper {} "v"
|
||||||
lua_setfield(_L, -2, "__mode"); // ... nil LuaWrapper {}
|
lua_setfield(_luaState, -2, "__mode"); // ... nil LuaWrapper {}
|
||||||
lua_setfield(_L, -2, LUAW_CACHE_METATABLE_KEY); // ... nil LuaWrapper
|
lua_setfield(_luaState, -2, LUAW_CACHE_METATABLE_KEY); // ... nil LuaWrapper
|
||||||
lua_pop(_L, 1); // ... nil
|
lua_pop(_luaState, 1); // ... nil
|
||||||
}
|
}
|
||||||
lua_pop(_L, 1); // ...
|
lua_pop(_luaState, 1); // ...
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -522,13 +535,13 @@ inline void luaW_initialize(lua_State* _L) {
|
|||||||
* table globally. As with luaL_register and luaL_setfuncs, both funcstions
|
* table globally. As with luaL_register and luaL_setfuncs, both funcstions
|
||||||
* leave the new table on the top of the stack.
|
* leave the new table on the top of the stack.
|
||||||
*/
|
*/
|
||||||
template <typename T> void luaW_setfuncs(lua_State* _L,
|
template <typename T> void luaW_setfuncs(lua_State* _luaState,
|
||||||
const char* _classname,
|
const char* _classname,
|
||||||
const luaL_Reg* _table,
|
const luaL_Reg* _table,
|
||||||
const luaL_Reg* _metatable,
|
const luaL_Reg* _metatable,
|
||||||
std::shared_ptr<T> (*_allocator)(lua_State*),
|
ememory::SharedPtr<T> (*_allocator)(lua_State*),
|
||||||
void (*_identifier)(lua_State*, std::shared_ptr<T>)) {
|
void (*_identifier)(lua_State*, ememory::SharedPtr<T>)) {
|
||||||
luaW_initialize(_L);
|
luaW_initialize(_luaState);
|
||||||
LuaWrapper<T>::classname = _classname;
|
LuaWrapper<T>::classname = _classname;
|
||||||
LuaWrapper<T>::identifier = _identifier;
|
LuaWrapper<T>::identifier = _identifier;
|
||||||
LuaWrapper<T>::allocator = _allocator;
|
LuaWrapper<T>::allocator = _allocator;
|
||||||
@ -543,73 +556,73 @@ template <typename T> void luaW_setfuncs(lua_State* _L,
|
|||||||
{ NULL, NULL }
|
{ NULL, NULL }
|
||||||
};
|
};
|
||||||
// Set up per-type tables
|
// Set up per-type tables
|
||||||
lua_getfield(_L, LUA_REGISTRYINDEX, LUAW_WRAPPER_KEY); // ... LuaWrapper
|
lua_getfield(_luaState, LUA_REGISTRYINDEX, LUAW_WRAPPER_KEY); // ... LuaWrapper
|
||||||
lua_getfield(_L, -1, LUAW_STORAGE_KEY); // ... LuaWrapper LuaWrapper.storage
|
lua_getfield(_luaState, -1, LUAW_STORAGE_KEY); // ... LuaWrapper LuaWrapper.storage
|
||||||
lua_newtable(_L); // ... LuaWrapper LuaWrapper.storage {}
|
lua_newtable(_luaState); // ... LuaWrapper LuaWrapper.storage {}
|
||||||
lua_setfield(_L, -2, LuaWrapper<T>::classname); // ... LuaWrapper LuaWrapper.storage
|
lua_setfield(_luaState, -2, LuaWrapper<T>::classname); // ... LuaWrapper LuaWrapper.storage
|
||||||
lua_pop(_L, 1); // ... LuaWrapper
|
lua_pop(_luaState, 1); // ... LuaWrapper
|
||||||
lua_getfield(_L, -1, LUAW_HOLDS_KEY); // ... LuaWrapper LuaWrapper.holds
|
lua_getfield(_luaState, -1, LUAW_HOLDS_KEY); // ... LuaWrapper LuaWrapper.holds
|
||||||
lua_newtable(_L); // ... LuaWrapper LuaWrapper.holds {}
|
lua_newtable(_luaState); // ... LuaWrapper LuaWrapper.holds {}
|
||||||
lua_setfield(_L, -2, LuaWrapper<T>::classname); // ... LuaWrapper LuaWrapper.holds
|
lua_setfield(_luaState, -2, LuaWrapper<T>::classname); // ... LuaWrapper LuaWrapper.holds
|
||||||
lua_pop(_L, 1); // ... LuaWrapper
|
lua_pop(_luaState, 1); // ... LuaWrapper
|
||||||
lua_getfield(_L, -1, LUAW_CACHE_KEY); // ... LuaWrapper LuaWrapper.cache
|
lua_getfield(_luaState, -1, LUAW_CACHE_KEY); // ... LuaWrapper LuaWrapper.cache
|
||||||
lua_newtable(_L); // ... LuaWrapper LuaWrapper.cache {}
|
lua_newtable(_luaState); // ... LuaWrapper LuaWrapper.cache {}
|
||||||
luaW_wrapperfield<T>(_L, LUAW_CACHE_METATABLE_KEY); // ... LuaWrapper LuaWrapper.cache {} cmt
|
luaW_wrapperfield<T>(_luaState, LUAW_CACHE_METATABLE_KEY); // ... LuaWrapper LuaWrapper.cache {} cmt
|
||||||
lua_setmetatable(_L, -2); // ... LuaWrapper LuaWrapper.cache {}
|
lua_setmetatable(_luaState, -2); // ... LuaWrapper LuaWrapper.cache {}
|
||||||
lua_setfield(_L, -2, LuaWrapper<T>::classname); // ... LuaWrapper LuaWrapper.cache
|
lua_setfield(_luaState, -2, LuaWrapper<T>::classname); // ... LuaWrapper LuaWrapper.cache
|
||||||
lua_pop(_L, 2); // ...
|
lua_pop(_luaState, 2); // ...
|
||||||
// Open table
|
// Open table
|
||||||
lua_newtable(_L); // ... T
|
lua_newtable(_luaState); // ... T
|
||||||
luaW_registerfuncs(_L, _allocator ? defaulttable : NULL, _table); // ... T
|
luaW_registerfuncs(_luaState, _allocator ? defaulttable : NULL, _table); // ... T
|
||||||
// Open metatable, set up extends table
|
// Open metatable, set up extends table
|
||||||
luaL_newmetatable(_L, _classname); // ... T mt
|
luaL_newmetatable(_luaState, _classname); // ... T mt
|
||||||
lua_newtable(_L); // ... T mt {}
|
lua_newtable(_luaState); // ... T mt {}
|
||||||
lua_setfield(_L, -2, LUAW_EXTENDS_KEY); // ... T mt
|
lua_setfield(_luaState, -2, LUAW_EXTENDS_KEY); // ... T mt
|
||||||
luaW_registerfuncs(_L, defaultmetatable, _metatable); // ... T mt
|
luaW_registerfuncs(_luaState, defaultmetatable, _metatable); // ... T mt
|
||||||
lua_setfield(_L, -2, "metatable"); // ... T
|
lua_setfield(_luaState, -2, "metatable"); // ... T
|
||||||
}
|
}
|
||||||
template <typename T> void luaW_setfuncs(lua_State* _L,
|
template <typename T> void luaW_setfuncs(lua_State* _luaState,
|
||||||
const char* _classname,
|
const char* _classname,
|
||||||
const luaL_Reg* _table,
|
const luaL_Reg* _table,
|
||||||
const luaL_Reg* _metatable,
|
const luaL_Reg* _metatable,
|
||||||
std::shared_ptr<T> (*_allocator)(lua_State*)) {
|
ememory::SharedPtr<T> (*_allocator)(lua_State*)) {
|
||||||
luaW_setfuncs(_L, _classname, _table, _metatable, _allocator, luaW_defaultidentifier<T>);
|
luaW_setfuncs(_luaState, _classname, _table, _metatable, _allocator, luaW_defaultidentifier<T>);
|
||||||
}
|
}
|
||||||
template <typename T> void luaW_setfuncs(lua_State* _L,
|
template <typename T> void luaW_setfuncs(lua_State* _luaState,
|
||||||
const char* _classname,
|
const char* _classname,
|
||||||
const luaL_Reg* _table,
|
const luaL_Reg* _table,
|
||||||
const luaL_Reg* _metatable) {
|
const luaL_Reg* _metatable) {
|
||||||
luaW_setfuncs(_L, _classname, _table, _metatable, luaW_defaultallocator<T>, luaW_defaultidentifier<T>);
|
luaW_setfuncs(_luaState, _classname, _table, _metatable, luaW_defaultallocator<T>, luaW_defaultidentifier<T>);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T> void luaW_register(lua_State* _L,
|
template <typename T> void luaW_register(lua_State* _luaState,
|
||||||
const char* _classname,
|
const char* _classname,
|
||||||
const luaL_Reg* _table,
|
const luaL_Reg* _table,
|
||||||
const luaL_Reg* _metatable,
|
const luaL_Reg* _metatable,
|
||||||
std::shared_ptr<T> (*_allocator)(lua_State*),
|
ememory::SharedPtr<T> (*_allocator)(lua_State*),
|
||||||
void (*_identifier)(lua_State*, std::shared_ptr<T>)) {
|
void (*_identifier)(lua_State*, ememory::SharedPtr<T>)) {
|
||||||
luaW_setfuncs(_L, _classname, _table, _metatable, _allocator, _identifier); // ... T
|
luaW_setfuncs(_luaState, _classname, _table, _metatable, _allocator, _identifier); // ... T
|
||||||
lua_pushvalue(_L, -1); // ... T T
|
lua_pushvalue(_luaState, -1); // ... T T
|
||||||
lua_setglobal(_L, _classname); // ... T
|
lua_setglobal(_luaState, _classname); // ... T
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T> void luaW_register(lua_State* _L,
|
template <typename T> void luaW_register(lua_State* _luaState,
|
||||||
const char* _classname,
|
const char* _classname,
|
||||||
const luaL_Reg* _table,
|
const luaL_Reg* _table,
|
||||||
const luaL_Reg* _metatable,
|
const luaL_Reg* _metatable,
|
||||||
std::shared_ptr<T> (*_allocator)(lua_State*)) {
|
ememory::SharedPtr<T> (*_allocator)(lua_State*)) {
|
||||||
luaW_setfuncs(_L, _classname, _table, _metatable, _allocator, luaW_defaultidentifier<T>);
|
luaW_setfuncs(_luaState, _classname, _table, _metatable, _allocator, luaW_defaultidentifier<T>);
|
||||||
lua_pushvalue(_L, -1); // ... T T
|
lua_pushvalue(_luaState, -1); // ... T T
|
||||||
lua_setglobal(_L, _classname); // ... T
|
lua_setglobal(_luaState, _classname); // ... T
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T> void luaW_register(lua_State* _L,
|
template <typename T> void luaW_register(lua_State* _luaState,
|
||||||
const char* _classname,
|
const char* _classname,
|
||||||
const luaL_Reg* _table,
|
const luaL_Reg* _table,
|
||||||
const luaL_Reg* _metatable) {
|
const luaL_Reg* _metatable) {
|
||||||
luaW_setfuncs(_L, _classname, _table, _metatable, luaW_defaultallocator<T>, luaW_defaultidentifier<T>); // ... T
|
luaW_setfuncs(_luaState, _classname, _table, _metatable, luaW_defaultallocator<T>, luaW_defaultidentifier<T>); // ... T
|
||||||
lua_pushvalue(_L, -1); // ... T T
|
lua_pushvalue(_luaState, -1); // ... T T
|
||||||
lua_setglobal(_L, _classname); // ... T
|
lua_setglobal(_luaState, _classname); // ... T
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -619,52 +632,50 @@ template <typename T> void luaW_register(lua_State* _L,
|
|||||||
* wins). This also allows luaW_to<T> to cast your object apropriately, as
|
* wins). This also allows luaW_to<T> to cast your object apropriately, as
|
||||||
* casts straight through a void pointer do not work.
|
* casts straight through a void pointer do not work.
|
||||||
*/
|
*/
|
||||||
template <typename T, typename U> void luaW_extend(lua_State* _L) {
|
template <typename T, typename U> void luaW_extend(lua_State* _luaState) {
|
||||||
if(!LuaWrapper<T>::classname) {
|
if(!LuaWrapper<T>::classname) {
|
||||||
luaL_error(_L, "attempting to call extend on a type that has not been registered");
|
luaL_error(_luaState, "attempting to call extend on a type that has not been registered");
|
||||||
}
|
}
|
||||||
if(!LuaWrapper<U>::classname) {
|
if(!LuaWrapper<U>::classname) {
|
||||||
luaL_error(_L, "attempting to extend %s by a type that has not been registered", LuaWrapper<T>::classname);
|
luaL_error(_luaState, "attempting to extend %s by a type that has not been registered", LuaWrapper<T>::classname);
|
||||||
}
|
}
|
||||||
LuaWrapper<T>::cast = luaW_cast<T, U>;
|
LuaWrapper<T>::cast = luaW_cast<T, U>;
|
||||||
LuaWrapper<T>::identifier = luaW_identify<T, U>;
|
LuaWrapper<T>::identifier = luaW_identify<T, U>;
|
||||||
LuaWrapper<T>::postconstructorrecurse = luaW_postconstructorinternal<U>;
|
LuaWrapper<T>::postconstructorrecurse = luaW_postconstructorinternal<U>;
|
||||||
luaL_getmetatable(_L, LuaWrapper<T>::classname); // mt
|
luaL_getmetatable(_luaState, LuaWrapper<T>::classname); // mt
|
||||||
luaL_getmetatable(_L, LuaWrapper<U>::classname); // mt emt
|
luaL_getmetatable(_luaState, LuaWrapper<U>::classname); // mt emt
|
||||||
// Point T's metatable __index at U's metatable for inheritance
|
// Point T's metatable __index at U's metatable for inheritance
|
||||||
lua_newtable(_L); // mt emt {}
|
lua_newtable(_luaState); // mt emt {}
|
||||||
lua_pushvalue(_L, -2); // mt emt {} emt
|
lua_pushvalue(_luaState, -2); // mt emt {} emt
|
||||||
lua_setfield(_L, -2, "__index"); // mt emt {}
|
lua_setfield(_luaState, -2, "__index"); // mt emt {}
|
||||||
lua_setmetatable(_L, -3); // mt emt
|
lua_setmetatable(_luaState, -3); // mt emt
|
||||||
// Set up per-type tables to point at parent type
|
// Set up per-type tables to point at parent type
|
||||||
lua_getfield(_L, LUA_REGISTRYINDEX, LUAW_WRAPPER_KEY); // ... LuaWrapper
|
lua_getfield(_luaState, LUA_REGISTRYINDEX, LUAW_WRAPPER_KEY); // ... LuaWrapper
|
||||||
lua_getfield(_L, -1, LUAW_STORAGE_KEY); // ... LuaWrapper LuaWrapper.storage
|
lua_getfield(_luaState, -1, LUAW_STORAGE_KEY); // ... LuaWrapper LuaWrapper.storage
|
||||||
lua_getfield(_L, -1, LuaWrapper<U>::classname); // ... LuaWrapper LuaWrapper.storage U
|
lua_getfield(_luaState, -1, LuaWrapper<U>::classname); // ... LuaWrapper LuaWrapper.storage U
|
||||||
lua_setfield(_L, -2, LuaWrapper<T>::classname); // ... LuaWrapper LuaWrapper.storage
|
lua_setfield(_luaState, -2, LuaWrapper<T>::classname); // ... LuaWrapper LuaWrapper.storage
|
||||||
lua_pop(_L, 1); // ... LuaWrapper
|
lua_pop(_luaState, 1); // ... LuaWrapper
|
||||||
lua_getfield(_L, -1, LUAW_HOLDS_KEY); // ... LuaWrapper LuaWrapper.holds
|
lua_getfield(_luaState, -1, LUAW_HOLDS_KEY); // ... LuaWrapper LuaWrapper.holds
|
||||||
lua_getfield(_L, -1, LuaWrapper<U>::classname); // ... LuaWrapper LuaWrapper.holds U
|
lua_getfield(_luaState, -1, LuaWrapper<U>::classname); // ... LuaWrapper LuaWrapper.holds U
|
||||||
lua_setfield(_L, -2, LuaWrapper<T>::classname); // ... LuaWrapper LuaWrapper.holds
|
lua_setfield(_luaState, -2, LuaWrapper<T>::classname); // ... LuaWrapper LuaWrapper.holds
|
||||||
lua_pop(_L, 1); // ... LuaWrapper
|
lua_pop(_luaState, 1); // ... LuaWrapper
|
||||||
lua_getfield(_L, -1, LUAW_CACHE_KEY); // ... LuaWrapper LuaWrapper.cache
|
lua_getfield(_luaState, -1, LUAW_CACHE_KEY); // ... LuaWrapper LuaWrapper.cache
|
||||||
lua_getfield(_L, -1, LuaWrapper<U>::classname); // ... LuaWrapper LuaWrapper.cache U
|
lua_getfield(_luaState, -1, LuaWrapper<U>::classname); // ... LuaWrapper LuaWrapper.cache U
|
||||||
lua_setfield(_L, -2, LuaWrapper<T>::classname); // ... LuaWrapper LuaWrapper.cache
|
lua_setfield(_luaState, -2, LuaWrapper<T>::classname); // ... LuaWrapper LuaWrapper.cache
|
||||||
lua_pop(_L, 2); // ...
|
lua_pop(_luaState, 2); // ...
|
||||||
// Make a list of all types that inherit from U, for type checking
|
// Make a list of all types that inherit from U, for type checking
|
||||||
lua_getfield(_L, -2, LUAW_EXTENDS_KEY); // mt emt mt.extends
|
lua_getfield(_luaState, -2, LUAW_EXTENDS_KEY); // mt emt mt.extends
|
||||||
lua_pushvalue(_L, -2); // mt emt mt.extends emt
|
lua_pushvalue(_luaState, -2); // mt emt mt.extends emt
|
||||||
lua_setfield(_L, -2, LuaWrapper<U>::classname); // mt emt mt.extends
|
lua_setfield(_luaState, -2, LuaWrapper<U>::classname); // mt emt mt.extends
|
||||||
lua_getfield(_L, -2, LUAW_EXTENDS_KEY); // mt emt mt.extends emt.extends
|
lua_getfield(_luaState, -2, LUAW_EXTENDS_KEY); // mt emt mt.extends emt.extends
|
||||||
for (lua_pushnil(_L); lua_next(_L, -2); lua_pop(_L, 1)) {
|
for (lua_pushnil(_luaState); lua_next(_luaState, -2); lua_pop(_luaState, 1)) {
|
||||||
// mt emt mt.extends emt.extends k v
|
// mt emt mt.extends emt.extends k v
|
||||||
lua_pushvalue(_L, -2); // mt emt mt.extends emt.extends k v k
|
lua_pushvalue(_luaState, -2); // mt emt mt.extends emt.extends k v k
|
||||||
lua_pushvalue(_L, -2); // mt emt mt.extends emt.extends k v k
|
lua_pushvalue(_luaState, -2); // mt emt mt.extends emt.extends k v k
|
||||||
lua_rawset(_L, -6); // mt emt mt.extends emt.extends k v
|
lua_rawset(_luaState, -6); // mt emt mt.extends emt.extends k v
|
||||||
}
|
}
|
||||||
lua_pop(_L, 4); // mt emt
|
lua_pop(_luaState, 4); // mt emt
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <luaWrapper/luaWrapperUtil.hpp>
|
#include <luaWrapper/luaWrapperUtil.hpp>
|
||||||
//#include <luaWrapper/luaWrapperStd.hpp>
|
//#include <luaWrapper/luaWrapperStd.hpp>
|
||||||
|
@ -14,8 +14,7 @@
|
|||||||
* This file contains the additional functions that I've added but that do
|
* This file contains the additional functions that I've added but that do
|
||||||
* not really belong in the core API.
|
* not really belong in the core API.
|
||||||
*/
|
*/
|
||||||
#ifndef __LUA__WRAPPER__UTILS_HPP__
|
#pragma once
|
||||||
#define __LUA__WRAPPER__UTILS_HPP__
|
|
||||||
|
|
||||||
#include <luaWrapper/luaWrapper.hpp>
|
#include <luaWrapper/luaWrapper.hpp>
|
||||||
|
|
||||||
@ -624,17 +623,20 @@ template <typename T> int luaU_build(lua_State* _L) {
|
|||||||
* }
|
* }
|
||||||
*/
|
*/
|
||||||
template <typename T> void luaU_store(lua_State* _L, int _index, const char* _storagetable, const char* _key = NULL) {
|
template <typename T> void luaU_store(lua_State* _L, int _index, const char* _storagetable, const char* _key = NULL) {
|
||||||
// ... store ... obj
|
// ... store ... obj store.storagetable
|
||||||
lua_getfield(_L, _index, _storagetable); // ... store ... obj store.storagetable
|
lua_getfield(_L, _index, _storagetable);
|
||||||
if (_key) {
|
if (_key) {
|
||||||
lua_pushstring(_L, _key); // ... store ... obj store.storagetable key
|
// ... store ... obj store.storagetable key
|
||||||
|
lua_pushstring(_L, _key);
|
||||||
} else {
|
} else {
|
||||||
LuaWrapper<T>::identifier(_L, luaW_to<T>(_L, -2)); // ... store ... obj store.storagetable key
|
// ... store ... obj store.storagetable key
|
||||||
|
LuaWrapper<T>::identifier(_L, luaW_to<T>(_L, -2));
|
||||||
}
|
}
|
||||||
lua_pushvalue(_L, -3); // ... store ... obj store.storagetable key obj
|
// ... store ... obj store.storagetable key obj
|
||||||
lua_settable(_L, -3); // ... store ... obj store.storagetable
|
lua_pushvalue(_L, -3);
|
||||||
lua_pop(_L, 1); // ... store ... obj
|
// ... store ... obj store.storagetable
|
||||||
|
lua_settable(_L, -3);
|
||||||
|
// ... store ... obj
|
||||||
|
lua_pop(_L, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
@ -31,14 +31,17 @@ def get_version():
|
|||||||
|
|
||||||
def configure(target, my_module):
|
def configure(target, my_module):
|
||||||
my_module.add_extra_flags()
|
my_module.add_extra_flags()
|
||||||
my_module.add_depend('lua')
|
my_module.add_depend([
|
||||||
|
'lua',
|
||||||
|
'ememory'
|
||||||
|
])
|
||||||
my_module.add_src_file([
|
my_module.add_src_file([
|
||||||
'luaWrapper/luaWrapperStd.cpp'
|
'luaWrapper/luaWrapperEtk.cpp',
|
||||||
])
|
])
|
||||||
my_module.add_header_file([
|
my_module.add_header_file([
|
||||||
'luaWrapper/luaWrapper.hpp'
|
'luaWrapper/luaWrapper.hpp',
|
||||||
'luaWrapper/luaWrapperUtils.hpp'
|
'luaWrapper/luaWrapperUtil.hpp',
|
||||||
])
|
])
|
||||||
return my_module
|
return my_module
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,26 +0,0 @@
|
|||||||
#!/usr/bin/python
|
|
||||||
import lutinModule as module
|
|
||||||
import lutinTools as tools
|
|
||||||
|
|
||||||
def get_desc():
|
|
||||||
return "luaWrapper example 1 : simple lua wrapper"
|
|
||||||
|
|
||||||
def create(target):
|
|
||||||
# module name is 'edn' and type binary.
|
|
||||||
myModule = module.Module(__file__, 'luaWrapperExample1', 'BINARY')
|
|
||||||
# add extra compilation flags :
|
|
||||||
myModule.add_extra_compile_flags()
|
|
||||||
# add the file to compile:
|
|
||||||
myModule.add_src_file([
|
|
||||||
'BankAccount.cpp',
|
|
||||||
'LuaBankAccount.cpp',
|
|
||||||
'main.cpp'])
|
|
||||||
|
|
||||||
# name of the dependency
|
|
||||||
myModule.add_module_depend('luaWrapper')
|
|
||||||
|
|
||||||
|
|
||||||
# add the currrent module at the
|
|
||||||
return myModule
|
|
||||||
|
|
||||||
|
|
@ -1,26 +0,0 @@
|
|||||||
#!/usr/bin/python
|
|
||||||
import lutinModule as module
|
|
||||||
import lutinTools as tools
|
|
||||||
|
|
||||||
def get_desc():
|
|
||||||
return "luaWrapper example 2 : simple lua wrapper"
|
|
||||||
|
|
||||||
def create(target):
|
|
||||||
# module name is 'edn' and type binary.
|
|
||||||
myModule = module.Module(__file__, 'luaWrapperExample2', 'BINARY')
|
|
||||||
# add extra compilation flags :
|
|
||||||
myModule.add_extra_compile_flags()
|
|
||||||
# add the file to compile:
|
|
||||||
myModule.add_src_file([
|
|
||||||
'Example.cpp',
|
|
||||||
'LuaExample.cpp',
|
|
||||||
'main.cpp'])
|
|
||||||
|
|
||||||
# name of the dependency
|
|
||||||
myModule.add_module_depend('luaWrapper')
|
|
||||||
|
|
||||||
|
|
||||||
# add the currrent module at the
|
|
||||||
return myModule
|
|
||||||
|
|
||||||
|
|
@ -15,11 +15,10 @@ using namespace std;
|
|||||||
* Types that do not have a default contructor require you to write an allocator function.
|
* Types that do not have a default contructor require you to write an allocator function.
|
||||||
* This function is passed to luaW_register.
|
* This function is passed to luaW_register.
|
||||||
*/
|
*/
|
||||||
|
ememory::SharedPtr<BankAccount> BankAccount_new(lua_State *_L) {
|
||||||
BankAccount* BankAccount_new(lua_State *_L) {
|
|
||||||
const char* owner = luaL_checkstring(_L, 1);
|
const char* owner = luaL_checkstring(_L, 1);
|
||||||
float balance = luaL_checknumber(_L, 2);
|
float balance = luaL_checknumber(_L, 2);
|
||||||
return new BankAccount(owner, balance);
|
return ememory::makeShared<BankAccount>(owner, balance);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -42,27 +41,27 @@ int BankAccount_checkTotalMoneyInBank(lua_State *_L) {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
int BankAccount_getOwnerName(lua_State *_L) {
|
int BankAccount_getOwnerName(lua_State *_L) {
|
||||||
BankAccount* account = luaW_check<BankAccount>(_L, 1);
|
auto account = luaW_check<BankAccount>(_L, 1);
|
||||||
lua_pushstring(_L, account->getOwnerName());
|
lua_pushstring(_L, account->getOwnerName());
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int BankAccount_deposit(lua_State* _L) {
|
int BankAccount_deposit(lua_State* _L) {
|
||||||
BankAccount* account = luaW_check<BankAccount>(_L, 1);
|
auto account = luaW_check<BankAccount>(_L, 1);
|
||||||
float amount = luaL_checknumber(_L, 2);
|
float amount = luaL_checknumber(_L, 2);
|
||||||
account->deposit(amount);
|
account->deposit(amount);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int BankAccount_withdraw(lua_State* _L) {
|
int BankAccount_withdraw(lua_State* _L) {
|
||||||
BankAccount* account = luaW_check<BankAccount>(_L, 1);
|
auto account = luaW_check<BankAccount>(_L, 1);
|
||||||
float amount = luaL_checknumber(_L, 2);
|
float amount = luaL_checknumber(_L, 2);
|
||||||
account->withdraw(amount);
|
account->withdraw(amount);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int BankAccount_checkBalance(lua_State* _L) {
|
int BankAccount_checkBalance(lua_State* _L) {
|
||||||
BankAccount* account = luaW_check<BankAccount>(_L, 1);
|
auto account = luaW_check<BankAccount>(_L, 1);
|
||||||
lua_pushnumber(_L, account->checkBalance());
|
lua_pushnumber(_L, account->checkBalance());
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
Loading…
x
Reference in New Issue
Block a user