lua

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

commit 6af005ec20323defd2a5ead01e2d389462884d04
parent f8a0fd268e1d23ec180f3af463b21019ce12c29c
Author: Roberto Ierusalimschy <roberto@inf.puc-rio.br>
Date:   Fri, 22 Dec 2000 15:32:06 -0200

bug: when `read' fails it must return nil (and not no value)

Diffstat:
Mbugs | 5+++++
Mliolib.c | 21+++++++++++----------
2 files changed, 16 insertions(+), 10 deletions(-)

diff --git 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 @@ -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; }