From 6af005ec20323defd2a5ead01e2d389462884d04 Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Fri, 22 Dec 2000 15:32:28 -0200 Subject: bug: when `read' fails it must return nil (and not no value) --- bugs | 5 +++++ liolib.c | 21 +++++++++++---------- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/bugs b/bugs index 1aff4595..a1391524 100644 --- a/bugs +++ b/bugs @@ -245,3 +245,8 @@ Wed Nov 29 09:51:44 EDT 2000 >> parser does not accept a `;' after a `return' (by lhf; since 4.0b) +** liolib.c +Fri Dec 22 15:30:42 EDT 2000 +>> when `read' fails it must return nil (and not no value) +(by cassino; since at least 3.1) + diff --git a/liolib.c b/liolib.c index 6cb555af..354dc849 100644 --- a/liolib.c +++ b/liolib.c @@ -1,5 +1,5 @@ /* -** $Id: liolib.c,v 1.94 2000/12/18 13:42:19 roberto Exp roberto $ +** $Id: liolib.c,v 1.95 2000/12/22 16:57:13 roberto Exp roberto $ ** Standard I/O (and system) library ** See Copyright Notice in lua.h */ @@ -318,6 +318,7 @@ static int io_read (lua_State *L) { IOCtrl *ctrl = (IOCtrl *)lua_touserdata(L, -1); int lastarg = lua_gettop(L) - 1; int firstarg = 1; + int success; FILE *f = gethandle(L, ctrl, firstarg); int n; if (f) firstarg++; @@ -330,8 +331,8 @@ static int io_read (lua_State *L) { } else /* ensure stack space for all results and for auxlib's buffer */ luaL_checkstack(L, lastarg-firstarg+1+LUA_MINSTACK, "too many arguments"); - for (n = firstarg; n<=lastarg; n++) { - int success; + success = 1; + for (n = firstarg; n<=lastarg && success; n++) { if (lua_isnumber(L, n)) success = read_chars(L, f, (size_t)lua_tonumber(L, n)); else { @@ -343,8 +344,8 @@ static int io_read (lua_State *L) { else { switch (p[1]) { case 'n': /* number */ - if (!read_number(L, f)) goto endloop; /* read fails */ - continue; /* number is already pushed; avoid the "pushstring" */ + success = read_number(L, f); + break; case 'l': /* line */ success = read_line(L, f); break; @@ -361,11 +362,11 @@ static int io_read (lua_State *L) { } } } - if (!success) { - lua_pop(L, 1); /* remove last result */ - break; /* read fails */ - } - } endloop: + } + if (!success) { + lua_pop(L, 1); /* remove last result */ + lua_pushnil(L); /* push nil instead */ + } return n - firstarg; } -- cgit v1.2.3-55-g6feb