diff options
-rw-r--r-- | src/FbTk/Luamm.cc | 31 | ||||
-rw-r--r-- | src/FbTk/Luamm.hh | 12 |
2 files changed, 43 insertions, 0 deletions
diff --git a/src/FbTk/Luamm.cc b/src/FbTk/Luamm.cc index 1ef751f..80d0926 100644 --- a/src/FbTk/Luamm.cc +++ b/src/FbTk/Luamm.cc | |||
@@ -24,6 +24,8 @@ | |||
24 | 24 | ||
25 | #include "Luamm.hh" | 25 | #include "Luamm.hh" |
26 | 26 | ||
27 | #include <sstream> | ||
28 | |||
27 | namespace lua { | 29 | namespace lua { |
28 | namespace { | 30 | namespace { |
29 | // keys for storing values in lua registry | 31 | // keys for storing values in lua registry |
@@ -274,6 +276,35 @@ namespace lua { | |||
274 | throw lua::exception(this); | 276 | throw lua::exception(this); |
275 | } | 277 | } |
276 | 278 | ||
279 | void state::checkargno(int argno) throw(lua::check_error) | ||
280 | { | ||
281 | if(gettop() != argno) { | ||
282 | std::ostringstream str; | ||
283 | str << "Wrong number of arguments: expected " << argno << ", got " << gettop(); | ||
284 | throw lua::check_error(str.str()); | ||
285 | } | ||
286 | } | ||
287 | |||
288 | void *state::checkudata(int narg, const char *tname) throw(lua::check_error, std::bad_alloc) | ||
289 | { | ||
290 | checkstack(2); | ||
291 | stack_sentry s(*this); | ||
292 | |||
293 | void *p = touserdata(narg); | ||
294 | if(p != NULL) { | ||
295 | if(getmetatable(narg)) { | ||
296 | rawgetfield(REGISTRYINDEX, tname); | ||
297 | if(rawequal(-1, -2)) | ||
298 | return p; | ||
299 | pop(2); | ||
300 | } | ||
301 | } | ||
302 | std::ostringstream str; | ||
303 | str << "Invalid argument #" << narg << ": expected " << type_name(TUSERDATA) | ||
304 | << ", got " << type_name(type(narg)); | ||
305 | throw lua::check_error(str.str()); | ||
306 | } | ||
307 | |||
277 | void state::checkstack(int extra) throw(std::bad_alloc) | 308 | void state::checkstack(int extra) throw(std::bad_alloc) |
278 | { | 309 | { |
279 | if(not lua_checkstack(cobj, extra)) | 310 | if(not lua_checkstack(cobj, extra)) |
diff --git a/src/FbTk/Luamm.hh b/src/FbTk/Luamm.hh index 110ac97..b75fb12 100644 --- a/src/FbTk/Luamm.hh +++ b/src/FbTk/Luamm.hh | |||
@@ -131,6 +131,14 @@ namespace lua { | |||
131 | {} | 131 | {} |
132 | }; | 132 | }; |
133 | 133 | ||
134 | // thrown by check* functions when they detect an invalid argument | ||
135 | class check_error: public std::runtime_error { | ||
136 | public: | ||
137 | check_error(const std::string &msg) | ||
138 | : std::runtime_error(msg) | ||
139 | {} | ||
140 | }; | ||
141 | |||
134 | // a fancy wrapper around lua_State | 142 | // a fancy wrapper around lua_State |
135 | class state { | 143 | class state { |
136 | lua_State *cobj; | 144 | lua_State *cobj; |
@@ -264,6 +272,10 @@ namespace lua { | |||
264 | // type c, throw everything but the kitchen sink | 272 | // type c, throw everything but the kitchen sink |
265 | // call() is a protected mode call, we don't allow unprotected calls | 273 | // call() is a protected mode call, we don't allow unprotected calls |
266 | void call(int nargs, int nresults, int errfunc = 0); | 274 | void call(int nargs, int nresults, int errfunc = 0); |
275 | void checkargno(int argno) throw(lua::check_error); | ||
276 | void *checkudata(int narg, const char *tname) throw(lua::check_error, std::bad_alloc); | ||
277 | template<typename T> | ||
278 | T *checkudata(int narg, const char *tname) throw(lua::check_error, std::bad_alloc) { return static_cast<T *>(checkudata(narg, tname)); } | ||
267 | void concat(int n); | 279 | void concat(int n); |
268 | bool equal(int index1, int index2); | 280 | bool equal(int index1, int index2); |
269 | int gc(int what, int data); | 281 | int gc(int what, int data); |