diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2006-03-21 16:31:09 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2006-03-21 16:31:09 -0300 |
commit | 0238a0b01e042fad472a60138162209431b8e703 (patch) | |
tree | 0aa20cde6a556c25c985cc7aa9ec20d56a4a76c4 /bugs | |
parent | 1ae0b6c0bf9c389bcf9bdf266591cb1e17e80a15 (diff) | |
download | lua-github-0238a0b01e042fad472a60138162209431b8e703.tar.gz |
BUG: luaL_checkudata may show wrong error message
Diffstat (limited to 'bugs')
-rw-r--r-- | bugs | 38 |
1 files changed, 38 insertions, 0 deletions
@@ -839,3 +839,41 @@ patch = [[ } + +Bug{ +what = [[luaL_checkudata may produce wrong error message]], + +report = [[Greg Falcon, 21/03/2006]], + +example = [[ +getmetatable(io.stdin).__gc() + --> bad argument #1 to '__gc' (FILE* expected, got table) +]], + +patch = [[ +* lauxlib.c: +@@ -123,11 +123,17 @@ + + LUALIB_API void *luaL_checkudata (lua_State *L, int ud, const char *tname) { + void *p = lua_touserdata(L, ud); +- lua_getfield(L, LUA_REGISTRYINDEX, tname); /* get correct metatable */ +- if (p == NULL || !lua_getmetatable(L, ud) || !lua_rawequal(L, -1, -2)) +- luaL_typerror(L, ud, tname); +- lua_pop(L, 2); /* remove both metatables */ +- return p; ++ if (p != NULL) { /* value is a userdata? */ ++ if (lua_getmetatable(L, ud)) { /* does it have a metatable? */ ++ lua_getfield(L, LUA_REGISTRYINDEX, tname); /* get correct metatable */ ++ if (lua_rawequal(L, -1, -2)) { /* does it have the correct mt? */ ++ lua_pop(L, 2); /* remove both metatables */ ++ return p; ++ } ++ } ++ } ++ luaL_typerror(L, ud, tname); /* else error */ ++ return NULL; /* to avoid warnings */ + } +]] + +} + |