aboutsummaryrefslogtreecommitdiff
path: root/lauxlib.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2018-11-26 14:16:17 -0200
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2018-11-26 14:16:17 -0200
commit7696c6474fe51ed59fee324e78c1233af74febdd (patch)
treed5e674cf214a14df38ca39b02177f5cea75b581c /lauxlib.c
parent7e63d3da0240325db4011f5d2f2e8abfb5d60288 (diff)
downloadlua-7696c6474fe51ed59fee324e78c1233af74febdd.tar.gz
lua-7696c6474fe51ed59fee324e78c1233af74febdd.tar.bz2
lua-7696c6474fe51ed59fee324e78c1233af74febdd.zip
Auxiliary buffer cannot close box with 'lua_remove'
To remove a to-be-closed variable from the stack in the C API a function must use 'lua_settop' or 'lua_pop'. Previous implementation of 'luaL_pushresult' was not closing the box. (This commit also added tests to check that box is being closed "as soon as possible".)
Diffstat (limited to 'lauxlib.c')
-rw-r--r--lauxlib.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/lauxlib.c b/lauxlib.c
index 6069ed1b..fd4acbd1 100644
--- a/lauxlib.c
+++ b/lauxlib.c
@@ -524,8 +524,8 @@ static size_t newbuffsize (luaL_Buffer *B, size_t sz) {
524 524
525/* 525/*
526** Returns a pointer to a free area with at least 'sz' bytes in buffer 526** Returns a pointer to a free area with at least 'sz' bytes in buffer
527** 'B'. 'boxidx' is the position in the stack where the buffer's box is 527** 'B'. 'boxidx' is the relative position in the stack where the
528** or should be. 528** buffer's box is or should be.
529*/ 529*/
530static char *prepbuffsize (luaL_Buffer *B, size_t sz, int boxidx) { 530static char *prepbuffsize (luaL_Buffer *B, size_t sz, int boxidx) {
531 if (B->size - B->n >= sz) /* enough space? */ 531 if (B->size - B->n >= sz) /* enough space? */
@@ -538,8 +538,10 @@ static char *prepbuffsize (luaL_Buffer *B, size_t sz, int boxidx) {
538 if (buffonstack(B)) /* buffer already has a box? */ 538 if (buffonstack(B)) /* buffer already has a box? */
539 newbuff = (char *)resizebox(L, boxidx, newsize); /* resize it */ 539 newbuff = (char *)resizebox(L, boxidx, newsize); /* resize it */
540 else { /* no box yet */ 540 else { /* no box yet */
541 lua_pushnil(L); /* reserve slot for final result */
541 newbox(L); /* create a new box */ 542 newbox(L); /* create a new box */
542 lua_insert(L, boxidx); /* move box to its intended position */ 543 /* move box (and slot) to its intended position */
544 lua_rotate(L, boxidx - 1, 2);
543 lua_toclose(L, boxidx); 545 lua_toclose(L, boxidx);
544 newbuff = (char *)resizebox(L, boxidx, newsize); 546 newbuff = (char *)resizebox(L, boxidx, newsize);
545 memcpy(newbuff, B->b, B->n * sizeof(char)); /* copy original content */ 547 memcpy(newbuff, B->b, B->n * sizeof(char)); /* copy original content */
@@ -576,8 +578,8 @@ LUALIB_API void luaL_pushresult (luaL_Buffer *B) {
576 lua_State *L = B->L; 578 lua_State *L = B->L;
577 lua_pushlstring(L, B->b, B->n); 579 lua_pushlstring(L, B->b, B->n);
578 if (buffonstack(B)) { 580 if (buffonstack(B)) {
579 resizebox(L, -2, 0); /* delete old buffer */ 581 lua_copy(L, -1, -3); /* move string to reserved slot */
580 lua_remove(L, -2); /* remove its header from the stack */ 582 lua_pop(L, 2); /* pop string and box (closing the box) */
581 } 583 }
582} 584}
583 585