diff options
Diffstat (limited to 'liolib.c')
| -rw-r--r-- | liolib.c | 14 |
1 files changed, 7 insertions, 7 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: liolib.c,v 1.99 2001/01/18 15:59:09 roberto Exp roberto $ | 2 | ** $Id: liolib.c,v 1.100 2001/01/25 16:45:36 roberto Exp roberto $ |
| 3 | ** Standard I/O (and system) library | 3 | ** Standard I/O (and system) library |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -86,13 +86,14 @@ static int pushresult (lua_State *L, int i) { | |||
| 86 | static FILE *getopthandle (lua_State *L, int inout) { | 86 | static FILE *getopthandle (lua_State *L, int inout) { |
| 87 | FILE *p = (FILE *)lua_touserdata(L, 1); | 87 | FILE *p = (FILE *)lua_touserdata(L, 1); |
| 88 | if (p != NULL) { /* is it a userdata ? */ | 88 | if (p != NULL) { /* is it a userdata ? */ |
| 89 | if (!checkfile(L,1)) { | 89 | if (!checkfile(L, 1)) { |
| 90 | if (strcmp(lua_xtype(L, 1), "ClosedFileHandle") == 0) | 90 | if (strcmp(lua_xtype(L, 1), "ClosedFileHandle") == 0) |
| 91 | luaL_argerror(L, 1, "file is closed"); | 91 | luaL_argerror(L, 1, "file is closed"); |
| 92 | else | 92 | else |
| 93 | luaL_argerror(L, 1, "(invalid value)"); | 93 | luaL_argerror(L, 1, "(invalid value)"); |
| 94 | } | 94 | } |
| 95 | lua_remove(L, 1); /* remove it from stack */ | 95 | /* move it to stack top */ |
| 96 | lua_pushvalue(L, 1); lua_remove(L, 1); | ||
| 96 | } | 97 | } |
| 97 | else if (inout != NOFILE) { /* try global value */ | 98 | else if (inout != NOFILE) { /* try global value */ |
| 98 | lua_getglobal(L, filenames[inout]); | 99 | lua_getglobal(L, filenames[inout]); |
| @@ -100,9 +101,8 @@ static FILE *getopthandle (lua_State *L, int inout) { | |||
| 100 | luaL_verror(L, "global variable `%.10s' is not a valid file handle", | 101 | luaL_verror(L, "global variable `%.10s' is not a valid file handle", |
| 101 | filenames[inout]); | 102 | filenames[inout]); |
| 102 | p = (FILE *)lua_touserdata(L, -1); | 103 | p = (FILE *)lua_touserdata(L, -1); |
| 103 | lua_pop(L, 1); /* remove global value from stack */ | ||
| 104 | } | 104 | } |
| 105 | return p; | 105 | return p; /* leave handle at stack top to avoid GC */ |
| 106 | } | 106 | } |
| 107 | 107 | ||
| 108 | 108 | ||
| @@ -295,7 +295,7 @@ static int read_chars (lua_State *L, FILE *f, size_t n) { | |||
| 295 | 295 | ||
| 296 | static int io_read (lua_State *L) { | 296 | static int io_read (lua_State *L) { |
| 297 | FILE *f = getopthandle(L, INFILE); | 297 | FILE *f = getopthandle(L, INFILE); |
| 298 | int nargs = lua_gettop(L); | 298 | int nargs = lua_gettop(L)-1; |
| 299 | int success; | 299 | int success; |
| 300 | int n; | 300 | int n; |
| 301 | if (nargs == 0) { /* no arguments? */ | 301 | if (nargs == 0) { /* no arguments? */ |
| @@ -347,7 +347,7 @@ static int io_read (lua_State *L) { | |||
| 347 | 347 | ||
| 348 | static int io_write (lua_State *L) { | 348 | static int io_write (lua_State *L) { |
| 349 | FILE *f = getopthandle(L, OUTFILE); | 349 | FILE *f = getopthandle(L, OUTFILE); |
| 350 | int nargs = lua_gettop(L); | 350 | int nargs = lua_gettop(L)-1; |
| 351 | int arg; | 351 | int arg; |
| 352 | int status = 1; | 352 | int status = 1; |
| 353 | for (arg=1; arg<=nargs; arg++) { | 353 | for (arg=1; arg<=nargs; arg++) { |
