| 881 | |
| 882 | |
| 883 | LUALIB_API const char *luaL_tolstring (lua_State *L, int idx, size_t *len) { |
| 884 | if (luaL_callmeta(L, idx, "__tostring")) { /* metafield? */ |
| 885 | if (!lua_isstring(L, -1)) |
| 886 | luaL_error(L, "'__tostring' must return a string"); |
| 887 | } |
| 888 | else { |
| 889 | switch (lua_type(L, idx)) { |
| 890 | case LUA_TNUMBER: { |
| 891 | if (lua_isinteger(L, idx)) |
| 892 | lua_pushfstring(L, "%I", (LUAI_UACINT)lua_tointeger(L, idx)); |
| 893 | else |
| 894 | lua_pushfstring(L, "%f", (LUAI_UACNUMBER)lua_tonumber(L, idx)); |
| 895 | break; |
| 896 | } |
| 897 | case LUA_TSTRING: |
| 898 | lua_pushvalue(L, idx); |
| 899 | break; |
| 900 | case LUA_TBOOLEAN: |
| 901 | lua_pushstring(L, (lua_toboolean(L, idx) ? "true" : "false")); |
| 902 | break; |
| 903 | case LUA_TNIL: |
| 904 | lua_pushliteral(L, "nil"); |
| 905 | break; |
| 906 | default: { |
| 907 | int tt = luaL_getmetafield(L, idx, "__name"); /* try name */ |
| 908 | const char *kind = (tt == LUA_TSTRING) ? lua_tostring(L, -1) : |
| 909 | luaL_typename(L, idx); |
| 910 | lua_pushfstring(L, "%s: %p", kind, lua_topointer(L, idx)); |
| 911 | if (tt != LUA_TNIL) |
| 912 | lua_remove(L, -2); /* remove '__name' */ |
| 913 | break; |
| 914 | } |
| 915 | } |
| 916 | } |
| 917 | return lua_tolstring(L, -1, len); |
| 918 | } |
| 919 | |
| 920 | |
| 921 | /* |
no test coverage detected