diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2016-12-04 18:09:45 -0200 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2016-12-04 18:09:45 -0200 |
commit | beec5af2010ad0df9d95b0aaa4842ded1ac60d8a (patch) | |
tree | 58dba0d5479d898d01e1f616642d24d2914a84e2 | |
parent | 7b1fba69b7a887e37e57744309299d134e76e06e (diff) | |
download | lua-beec5af2010ad0df9d95b0aaa4842ded1ac60d8a.tar.gz lua-beec5af2010ad0df9d95b0aaa4842ded1ac60d8a.tar.bz2 lua-beec5af2010ad0df9d95b0aaa4842ded1ac60d8a.zip |
'luaL_tolstring' uses metatable's "__name" when available
-rw-r--r-- | lauxlib.c | 19 |
1 files changed, 14 insertions, 5 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lauxlib.c,v 1.285 2015/12/14 11:59:27 roberto Exp roberto $ | 2 | ** $Id: lauxlib.c,v 1.286 2016/01/08 15:33:09 roberto Exp roberto $ |
3 | ** Auxiliary functions for building Lua libraries | 3 | ** Auxiliary functions for building Lua libraries |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -809,7 +809,11 @@ LUALIB_API lua_Integer luaL_len (lua_State *L, int idx) { | |||
809 | 809 | ||
810 | 810 | ||
811 | LUALIB_API const char *luaL_tolstring (lua_State *L, int idx, size_t *len) { | 811 | LUALIB_API const char *luaL_tolstring (lua_State *L, int idx, size_t *len) { |
812 | if (!luaL_callmeta(L, idx, "__tostring")) { /* no metafield? */ | 812 | if (luaL_callmeta(L, idx, "__tostring")) { /* metafield? */ |
813 | if (!lua_isstring(L, -1)) | ||
814 | luaL_error(L, "'__tostring' must return a string"); | ||
815 | } | ||
816 | else { | ||
813 | switch (lua_type(L, idx)) { | 817 | switch (lua_type(L, idx)) { |
814 | case LUA_TNUMBER: { | 818 | case LUA_TNUMBER: { |
815 | if (lua_isinteger(L, idx)) | 819 | if (lua_isinteger(L, idx)) |
@@ -827,10 +831,15 @@ LUALIB_API const char *luaL_tolstring (lua_State *L, int idx, size_t *len) { | |||
827 | case LUA_TNIL: | 831 | case LUA_TNIL: |
828 | lua_pushliteral(L, "nil"); | 832 | lua_pushliteral(L, "nil"); |
829 | break; | 833 | break; |
830 | default: | 834 | default: { |
831 | lua_pushfstring(L, "%s: %p", luaL_typename(L, idx), | 835 | int tt = luaL_getmetafield(L, idx, "__name"); /* try name */ |
832 | lua_topointer(L, idx)); | 836 | const char *kind = (tt == LUA_TSTRING) ? lua_tostring(L, -1) : |
837 | luaL_typename(L, idx); | ||
838 | lua_pushfstring(L, "%s: %p", kind, lua_topointer(L, idx)); | ||
839 | if (tt != LUA_TNIL) | ||
840 | lua_remove(L, -2); /* remove '__name' */ | ||
833 | break; | 841 | break; |
842 | } | ||
834 | } | 843 | } |
835 | } | 844 | } |
836 | return lua_tolstring(L, -1, len); | 845 | return lua_tolstring(L, -1, len); |