diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2002-04-02 17:42:20 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2002-04-02 17:42:20 -0300 |
| commit | 2cbbf7e95a229cce3033f68807cf3e82021879f8 (patch) | |
| tree | b7d17cc8d7abbebf47967cb4dc6ac63b9e3670ae | |
| parent | e5919be1a7a76bc782a66ac19ff1367ede11f4b9 (diff) | |
| download | lua-2cbbf7e95a229cce3033f68807cf3e82021879f8.tar.gz lua-2cbbf7e95a229cce3033f68807cf3e82021879f8.tar.bz2 lua-2cbbf7e95a229cce3033f68807cf3e82021879f8.zip | |
`tostring' uses `__tostring' when available
| -rw-r--r-- | lbaselib.c | 29 |
1 files changed, 13 insertions, 16 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lbaselib.c,v 1.61 2002/03/27 12:49:53 roberto Exp roberto $ | 2 | ** $Id: lbaselib.c,v 1.62 2002/03/27 15:30:41 roberto Exp roberto $ |
| 3 | ** Basic library | 3 | ** Basic library |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -122,7 +122,9 @@ static int luaB_error (lua_State *L) { | |||
| 122 | static int luaB_metatable (lua_State *L) { | 122 | static int luaB_metatable (lua_State *L) { |
| 123 | luaL_check_any(L, 1); | 123 | luaL_check_any(L, 1); |
| 124 | if (lua_isnone(L, 2)) { | 124 | if (lua_isnone(L, 2)) { |
| 125 | if (lua_getmetatable(L, 1)) { | 125 | if (!lua_getmetatable(L, 1)) |
| 126 | return 0; /* no metatable */ | ||
| 127 | else { | ||
| 126 | lua_pushliteral(L, "__metatable"); | 128 | lua_pushliteral(L, "__metatable"); |
| 127 | lua_rawget(L, -2); | 129 | lua_rawget(L, -2); |
| 128 | if (lua_isnil(L, -1)) | 130 | if (lua_isnil(L, -1)) |
| @@ -361,6 +363,9 @@ static int luaB_call (lua_State *L) { | |||
| 361 | 363 | ||
| 362 | static int luaB_tostring (lua_State *L) { | 364 | static int luaB_tostring (lua_State *L) { |
| 363 | char buff[64]; | 365 | char buff[64]; |
| 366 | luaL_checkany(L, 1); | ||
| 367 | if (luaL_callmeta(L, 1, "__tostring")) /* is there a metafield? */ | ||
| 368 | return 1; /* use its value */ | ||
| 364 | switch (lua_type(L, 1)) { | 369 | switch (lua_type(L, 1)) { |
| 365 | case LUA_TNUMBER: | 370 | case LUA_TNUMBER: |
| 366 | lua_pushstring(L, lua_tostring(L, 1)); | 371 | lua_pushstring(L, lua_tostring(L, 1)); |
| @@ -372,25 +377,17 @@ static int luaB_tostring (lua_State *L) { | |||
| 372 | lua_pushstring(L, (lua_toboolean(L, 1) ? "true" : "false")); | 377 | lua_pushstring(L, (lua_toboolean(L, 1) ? "true" : "false")); |
| 373 | return 1; | 378 | return 1; |
| 374 | case LUA_TTABLE: | 379 | case LUA_TTABLE: |
| 375 | sprintf(buff, "%.40s: %p", lua_typename(L, lua_type(L, 1)), | 380 | sprintf(buff, "table: %p", lua_topointer(L, 1)); |
| 376 | lua_topointer(L, 1)); | ||
| 377 | break; | 381 | break; |
| 378 | case LUA_TFUNCTION: | 382 | case LUA_TFUNCTION: |
| 379 | sprintf(buff, "function: %p", lua_topointer(L, 1)); | 383 | sprintf(buff, "function: %p", lua_topointer(L, 1)); |
| 380 | break; | 384 | break; |
| 381 | case LUA_TUSERDATA: { | 385 | case LUA_TUSERDATA: |
| 382 | const char *t = lua_typename(L, lua_type(L, 1)); | 386 | sprintf(buff, "userdata: %p", lua_touserdata(L, 1)); |
| 383 | if (strcmp(t, "userdata") == 0) | ||
| 384 | sprintf(buff, "userdata: %p", lua_touserdata(L, 1)); | ||
| 385 | else | ||
| 386 | sprintf(buff, "%.40s: %p", t, lua_touserdata(L, 1)); | ||
| 387 | break; | 387 | break; |
| 388 | } | ||
| 389 | case LUA_TNIL: | 388 | case LUA_TNIL: |
| 390 | lua_pushliteral(L, "nil"); | 389 | lua_pushliteral(L, "nil"); |
| 391 | return 1; | 390 | return 1; |
| 392 | default: | ||
| 393 | luaL_argerror(L, 1, "value expected"); | ||
| 394 | } | 391 | } |
| 395 | lua_pushstring(L, buff); | 392 | lua_pushstring(L, buff); |
| 396 | return 1; | 393 | return 1; |
| @@ -426,7 +423,7 @@ static const luaL_reg base_funcs[] = { | |||
| 426 | static void base_open (lua_State *L) { | 423 | static void base_open (lua_State *L) { |
| 427 | lua_pushliteral(L, "_G"); | 424 | lua_pushliteral(L, "_G"); |
| 428 | lua_pushvalue(L, LUA_GLOBALSINDEX); | 425 | lua_pushvalue(L, LUA_GLOBALSINDEX); |
| 429 | luaL_openlib(L, base_funcs); /* open lib into global table */ | 426 | luaL_openlib(L, base_funcs, 0); /* open lib into global table */ |
| 430 | lua_pushliteral(L, "_VERSION"); | 427 | lua_pushliteral(L, "_VERSION"); |
| 431 | lua_pushliteral(L, LUA_VERSION); | 428 | lua_pushliteral(L, LUA_VERSION); |
| 432 | lua_settable(L, -3); /* set global _VERSION */ | 429 | lua_settable(L, -3); /* set global _VERSION */ |
| @@ -495,7 +492,7 @@ static const luaL_reg co_funcs[] = { | |||
| 495 | 492 | ||
| 496 | 493 | ||
| 497 | static void co_open (lua_State *L) { | 494 | static void co_open (lua_State *L) { |
| 498 | luaL_opennamedlib(L, "co", co_funcs); | 495 | luaL_opennamedlib(L, "co", co_funcs, 0); |
| 499 | /* create metatable for coroutines */ | 496 | /* create metatable for coroutines */ |
| 500 | lua_pushliteral(L, "Coroutine"); | 497 | lua_pushliteral(L, "Coroutine"); |
| 501 | lua_newtable(L); | 498 | lua_newtable(L); |
| @@ -728,7 +725,7 @@ static const luaL_reg array_funcs[] = { | |||
| 728 | LUALIB_API int lua_baselibopen (lua_State *L) { | 725 | LUALIB_API int lua_baselibopen (lua_State *L) { |
| 729 | base_open(L); | 726 | base_open(L); |
| 730 | co_open(L); | 727 | co_open(L); |
| 731 | luaL_opennamedlib(L, "A", array_funcs); | 728 | luaL_opennamedlib(L, "tab", array_funcs, 0); |
| 732 | /* `require' needs an empty table as upvalue */ | 729 | /* `require' needs an empty table as upvalue */ |
| 733 | lua_newtable(L); | 730 | lua_newtable(L); |
| 734 | lua_pushcclosure(L, luaB_require, 1); | 731 | lua_pushcclosure(L, luaB_require, 1); |
