Changed how userdata is handled
This commit is contained in:
@@ -360,20 +360,6 @@ private:
|
||||
// original stack top, and number of declared return values.
|
||||
void check_nret(int xnret, int otop, int nret) const;
|
||||
|
||||
// Tagged pointers: we expect all userdata to be tagged pointers.
|
||||
// This starts with a void pointer, then a type tag that identifies the
|
||||
// underlying C++ type, then a deleter function. In addition, there will
|
||||
// be a metatable that contains the type name as a string and a collect
|
||||
// function.
|
||||
struct TaggedPointer {
|
||||
void *ptr;
|
||||
LuaTypeTag tag;
|
||||
LuaDeleterFn del;
|
||||
};
|
||||
static int collect_tagged_pointer(lua_State *L);
|
||||
void make_tagged_pointer(LuaSlot target, void *ptr, LuaTypeTag tag, LuaDeleterFn del);
|
||||
void clear_tagged_pointer(LuaSlot target);
|
||||
|
||||
template<typename T>
|
||||
static void delete_pointer(void *p) { delete (T*)p; }
|
||||
static void do_not_delete(void *p) { }
|
||||
@@ -418,7 +404,7 @@ public:
|
||||
double cknumber(LuaSlot s) const { return luaL_cknumber(L_, s); }
|
||||
std::string ckstring(LuaSlot s) const;
|
||||
lua_State *ckthread(LuaSlot s) const { return luaL_ckthread(L_, s); }
|
||||
|
||||
|
||||
void clearmetatable(LuaSlot tab) const;
|
||||
void setmetatable(LuaSlot tab, LuaSlot mt) const;
|
||||
void getmetatable(LuaSlot mt, LuaSlot tab) const;
|
||||
@@ -431,31 +417,6 @@ public:
|
||||
|
||||
void setlightuserdata(LuaSlot target, void *p) const;
|
||||
|
||||
template <typename T>
|
||||
void newpointer(LuaSlot target, T *ptr, bool autodel) {
|
||||
make_tagged_pointer(target, ptr, LuaTypeTagValue<T>, autodel ? delete_pointer<T> : do_not_delete);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
T *touserdata(LuaSlot target) {
|
||||
TaggedPointer *tp = (TaggedPointer*)lua_touserdata(L_, target);
|
||||
LuaTypeTag tag = LuaTypeTagValue<T>;
|
||||
if ((tp == 0) || (tp->tag != tag)) return 0;
|
||||
return (T*)(tp->ptr);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
T *ckuserdata(LuaSlot target) {
|
||||
TaggedPointer *tp = (TaggedPointer*)lua_touserdata(L_, target);
|
||||
LuaTypeTag tag = LuaTypeTagValue<T>;
|
||||
if ((tp == 0) || (tp->tag != tag) || (tp->ptr==0)) {
|
||||
luaL_error(L_, "wrong userdata type");
|
||||
}
|
||||
return (T*)(tp->ptr);
|
||||
}
|
||||
|
||||
void clearuserdata(LuaSlot target) { clear_tagged_pointer(target); }
|
||||
|
||||
int next(LuaSlot tab, LuaSlot key, LuaSlot value) const;
|
||||
|
||||
void makeclass(LuaSlot tab, LuaSlot name) const;
|
||||
@@ -524,8 +485,6 @@ public:
|
||||
void call(T&... args) {
|
||||
call_cfunction<0>(lua_gettop(L_), args...);
|
||||
}
|
||||
|
||||
static void register_all_userdata(lua_State *L);
|
||||
};
|
||||
|
||||
|
||||
@@ -555,9 +514,6 @@ public:
|
||||
LuaFunctionReg reg_##name(mode, #name, name); \
|
||||
int name(lua_State *L)
|
||||
|
||||
#define LuaDefineType(name) \
|
||||
LuaFunctionReg regt_##name("t", #name, LuaTypeTagValue<name>)
|
||||
|
||||
|
||||
#define LuaStringify(x) #x
|
||||
#define LuaAssert(L, x) if (!(x)) { luaL_error((L), "Assert failed: %s (file %s line %d)", LuaStringify(x), __FILE__, __LINE__); }
|
||||
|
||||
Reference in New Issue
Block a user