| 896 | |
| 897 | |
| 898 | LUALIB_API const char *luaL_tolstring (lua_State *L, int idx, size_t *len) { |
| 899 | idx = lua_absindex(L,idx); |
| 900 | if (luaL_callmeta(L, idx, "__tostring")) { /* metafield? */ |
| 901 | if (!lua_isstring(L, -1)) |
| 902 | luaL_error(L, "'__tostring' must return a string"); |
| 903 | } |
| 904 | else { |
| 905 | switch (lua_type(L, idx)) { |
| 906 | case LUA_TNUMBER: { |
| 907 | if (lua_isinteger(L, idx)) |
| 908 | lua_pushfstring(L, "%I", (LUAI_UACINT)lua_tointeger(L, idx)); |
| 909 | else |
| 910 | lua_pushfstring(L, "%f", (LUAI_UACNUMBER)lua_tonumber(L, idx)); |
| 911 | break; |
| 912 | } |
| 913 | case LUA_TSTRING: |
| 914 | lua_pushvalue(L, idx); |
| 915 | break; |
| 916 | case LUA_TBOOLEAN: |
| 917 | lua_pushstring(L, (lua_toboolean(L, idx) ? "true" : "false")); |
| 918 | break; |
| 919 | case LUA_TNIL: |
| 920 | lua_pushliteral(L, "nil"); |
| 921 | break; |
| 922 | default: { |
| 923 | int tt = luaL_getmetafield(L, idx, "__name"); /* try name */ |
| 924 | const char *kind = (tt == LUA_TSTRING) ? lua_tostring(L, -1) : |
| 925 | luaL_typename(L, idx); |
| 926 | lua_pushfstring(L, "%s: %p", kind, lua_topointer(L, idx)); |
| 927 | if (tt != LUA_TNIL) |
| 928 | lua_remove(L, -2); /* remove '__name' */ |
| 929 | break; |
| 930 | } |
| 931 | } |
| 932 | } |
| 933 | return lua_tolstring(L, -1, len); |
| 934 | } |
| 935 | |
| 936 | |
| 937 | /* |
no test coverage detected