lua

A copy of the Lua development repository
Log | Files | Refs | README

commit 9f0d62ad9f7ace2c92bbdf11a8d0fb908f6feb1c
parent 64ecf2421089d1f1c83fdec99901699797bd43fb
Author: Roberto Ierusalimschy <roberto@inf.puc-rio.br>
Date:   Mon, 26 Nov 2007 14:57:10 -0200

BUG: table.remove removes last element of a table when given
an out-of-bound index

Diffstat:
Mbugs | 25+++++++++++++++++++++++++
Mltablib.c | 5+++--
2 files changed, 28 insertions(+), 2 deletions(-)

diff --git a/bugs b/bugs @@ -1570,6 +1570,31 @@ lstrlib.c: } Bug{ +what = [[table.remove removes last element of a table when given +an out-of-bound index]], +report = [[Patrick Donnelly, on 11/2007]], +since = [[at least 5.0]], +example = [[ +a = {1,2,3} +table.remove(a, 4) +print(a[3]) --> nil (should be 3) +]], +patch = [[ +ltablib.c: +@@ -118,7 +118,8 @@ + static int tremove (lua_State *L) { + int e = aux_getn(L, 1); + int pos = luaL_optint(L, 2, e); +- if (e == 0) return 0; /* table is `empty' */ ++ if (!(1 <= pos && pos <= e)) /* position is outside bounds? */ ++ return 0; /* nothing to remove */ + luaL_setn(L, 1, e - 1); /* t.n = n-1 */ + lua_rawgeti(L, 1, pos); /* result = t[pos] */ + for ( ;pos<e; pos++) { +]], +} + +Bug{ what = [[ ]], report = [[ , on ]], since = [[i ]], diff --git a/ltablib.c b/ltablib.c @@ -1,5 +1,5 @@ /* -** $Id: ltablib.c,v 1.40 2007/06/21 13:50:53 roberto Exp roberto $ +** $Id: ltablib.c,v 1.41 2007/09/12 20:53:24 roberto Exp roberto $ ** Library for Table Manipulation ** See Copyright Notice in lua.h */ @@ -110,7 +110,8 @@ static int tinsert (lua_State *L) { static int tremove (lua_State *L) { int e = aux_getn(L, 1); int pos = luaL_optint(L, 2, e); - if (e == 0) return 0; /* table is `empty' */ + if (!(1 <= pos && pos <= e)) /* position is outside bounds? */ + return 0; /* nothing to remove */ lua_rawgeti(L, 1, pos); /* result = t[pos] */ for ( ;pos<e; pos++) { lua_rawgeti(L, 1, pos+1);