diff options
Diffstat (limited to 'lauxlib.c')
-rw-r--r-- | lauxlib.c | 19 |
1 files changed, 15 insertions, 4 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lauxlib.c,v 1.193 2009/10/05 16:44:33 roberto Exp roberto $ | 2 | ** $Id: lauxlib.c,v 1.194 2009/11/25 15:27:51 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 | */ |
@@ -370,9 +370,9 @@ static void adjuststack (luaL_Buffer *B) { | |||
370 | if (B->lvl > 1) { | 370 | if (B->lvl > 1) { |
371 | lua_State *L = B->L; | 371 | lua_State *L = B->L; |
372 | int toget = 1; /* number of levels to concat */ | 372 | int toget = 1; /* number of levels to concat */ |
373 | size_t toplen = lua_objlen(L, -1); | 373 | size_t toplen = lua_rawlen(L, -1); |
374 | do { | 374 | do { |
375 | size_t l = lua_objlen(L, -(toget+1)); | 375 | size_t l = lua_rawlen(L, -(toget+1)); |
376 | if (B->lvl - toget + 1 >= LIMIT || toplen > l) { | 376 | if (B->lvl - toget + 1 >= LIMIT || toplen > l) { |
377 | toplen += l; | 377 | toplen += l; |
378 | toget++; | 378 | toget++; |
@@ -463,7 +463,7 @@ LUALIB_API int luaL_ref (lua_State *L, int t) { | |||
463 | lua_rawseti(L, t, FREELIST_REF); /* (t[FREELIST_REF] = t[ref]) */ | 463 | lua_rawseti(L, t, FREELIST_REF); /* (t[FREELIST_REF] = t[ref]) */ |
464 | } | 464 | } |
465 | else { /* no free elements */ | 465 | else { /* no free elements */ |
466 | ref = (int)lua_objlen(L, t) + 1; /* get a new reference */ | 466 | ref = (int)lua_rawlen(L, t) + 1; /* get a new reference */ |
467 | if (ref == FREELIST_REF) { /* FREELIST_REF not initialized? */ | 467 | if (ref == FREELIST_REF) { /* FREELIST_REF not initialized? */ |
468 | lua_pushinteger(L, 0); | 468 | lua_pushinteger(L, 0); |
469 | lua_rawseti(L, t, FREELIST_REF); | 469 | lua_rawseti(L, t, FREELIST_REF); |
@@ -627,6 +627,17 @@ LUALIB_API int luaL_callmeta (lua_State *L, int obj, const char *event) { | |||
627 | } | 627 | } |
628 | 628 | ||
629 | 629 | ||
630 | LUALIB_API int luaL_len (lua_State *L, int idx) { | ||
631 | int l; | ||
632 | lua_len(L, idx); | ||
633 | l = lua_tointeger(L, -1); | ||
634 | if (l == 0 && !lua_isnumber(L, -1)) | ||
635 | luaL_error(L, "object length is not a number"); | ||
636 | lua_pop(L, 1); /* remove object */ | ||
637 | return l; | ||
638 | } | ||
639 | |||
640 | |||
630 | LUALIB_API const char *luaL_tolstring (lua_State *L, int idx, size_t *len) { | 641 | LUALIB_API const char *luaL_tolstring (lua_State *L, int idx, size_t *len) { |
631 | if (!luaL_callmeta(L, idx, "__tostring")) { /* no metafield? */ | 642 | if (!luaL_callmeta(L, idx, "__tostring")) { /* no metafield? */ |
632 | switch (lua_type(L, idx)) { | 643 | switch (lua_type(L, idx)) { |