seqlua
changeset 57:da4b9d6a5b7e tip
Fixed bug due to problem combining luaL_buffinit with seqlua_iterinit
author | jbe |
---|---|
date | Tue Jan 05 04:26:49 2016 +0100 (2016-01-05) |
parents | c3976eacc6ab |
children | |
files | seqlua.c seqlualib.c |
line diff
1.1 --- a/seqlua.c Wed Aug 27 00:31:43 2014 +0200 1.2 +++ b/seqlua.c Tue Jan 05 04:26:49 2016 +0100 1.3 @@ -71,19 +71,25 @@ 1.4 static int seqlua_concat(lua_State *L) { 1.5 const char *sep; 1.6 size_t seplen; 1.7 - luaL_Buffer buf; 1.8 seqlua_Iterator iter; 1.9 + // NOTE: the following implementation is inefficient (Lua buffer would 1.10 + // prohibit use of stack by seqlua_iterloop) 1.11 sep = luaL_checklstring(L, 1, &seplen); 1.12 luaL_checkany(L, 2); 1.13 - lua_settop(L, 3); 1.14 - luaL_buffinit(L, &buf); 1.15 + lua_settop(L, 2); 1.16 + lua_pushliteral(L, ""); 1.17 seqlua_iterloop(L, &iter, 2) { 1.18 - lua_replace(L, 3); 1.19 - if (seqlua_itercount(&iter) > 1) luaL_addlstring(&buf, sep, seplen); 1.20 - luaL_tolstring(L, 3, NULL); 1.21 - luaL_addvalue(&buf); 1.22 + if (seqlua_itercount(&iter) > 1) { 1.23 + lua_pushvalue(L, 3); 1.24 + lua_pushlstring(L, sep, seplen); 1.25 + lua_pushvalue(L, -3); 1.26 + lua_concat(L, 3); 1.27 + lua_replace(L, 3); 1.28 + lua_pop(L, 1); 1.29 + } else { 1.30 + lua_replace(L, 3); 1.31 + } 1.32 } 1.33 - luaL_pushresult(&buf); 1.34 return 1; 1.35 } 1.36
2.1 --- a/seqlualib.c Wed Aug 27 00:31:43 2014 +0200 2.2 +++ b/seqlualib.c Tue Jan 05 04:26:49 2016 +0100 2.3 @@ -8,6 +8,8 @@ 2.4 #define SEQLUA_ITERTYPE_INDEX 3 2.5 #define SEQLUA_ITERTYPE_RAW 4 2.6 2.7 +// TODO: allow combining luaL_buffinit with seqlua_iterinit somehow 2.8 + 2.9 void seqlua_iterinit(lua_State *L, seqlua_Iterator *iter, int idx) { 2.10 if (luaL_getmetafield(L, idx, "__ipairs")) { 2.11 lua_pushvalue(L, idx);