| 857 | |
| 858 | |
| 859 | LUALIB_API const char *luaL_tolstring (lua_State *L, int idx, size_t *len) { |
| 860 | if (luaL_callmeta(L, idx, "__tostring")) { /* metafield? */ |
| 861 | if (!lua_isstring(L, -1)) |
| 862 | luaL_error(L, "'__tostring' must return a string"); |
| 863 | } |
| 864 | else { |
| 865 | switch (lua_type(L, idx)) { |
| 866 | case LUA_TNUMBER: { |
| 867 | if (lua_isinteger(L, idx)) |
| 868 | lua_pushfstring(L, "%I", (LUAI_UACINT)lua_tointeger(L, idx)); |
| 869 | else |
| 870 | lua_pushfstring(L, "%f", (LUAI_UACNUMBER)lua_tonumber(L, idx)); |
| 871 | break; |
| 872 | } |
| 873 | case LUA_TSTRING: |
| 874 | lua_pushvalue(L, idx); |
| 875 | break; |
| 876 | case LUA_TBOOLEAN: |
| 877 | lua_pushstring(L, (lua_toboolean(L, idx) ? "true" : "false")); |
| 878 | break; |
| 879 | case LUA_TNIL: |
| 880 | lua_pushliteral(L, "nil"); |
| 881 | break; |
| 882 | default: { |
| 883 | int tt = luaL_getmetafield(L, idx, "__name"); /* try name */ |
| 884 | const char *kind = (tt == LUA_TSTRING) ? lua_tostring(L, -1) : |
| 885 | luaL_typename(L, idx); |
| 886 | lua_pushfstring(L, "%s: %p", kind, lua_topointer(L, idx)); |
| 887 | if (tt != LUA_TNIL) |
| 888 | lua_remove(L, -2); /* remove '__name' */ |
| 889 | break; |
| 890 | } |
| 891 | } |
| 892 | } |
| 893 | return lua_tolstring(L, -1, len); |
| 894 | } |
| 895 | |
| 896 | |
| 897 | /* |
no test coverage detected