diff options
Diffstat (limited to 'liolib.c')
| -rw-r--r-- | liolib.c | 30 |
1 files changed, 9 insertions, 21 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: liolib.c,v 1.86 2000/10/02 20:10:55 roberto Exp roberto $ | 2 | ** $Id: liolib.c,v 1.87 2000/10/20 16:39:03 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 | */ |
| @@ -159,18 +159,9 @@ static int io_close (lua_State *L) { | |||
| 159 | 159 | ||
| 160 | static int file_collect (lua_State *L) { | 160 | static int file_collect (lua_State *L) { |
| 161 | IOCtrl *ctrl = (IOCtrl *)lua_touserdata(L, -1); | 161 | IOCtrl *ctrl = (IOCtrl *)lua_touserdata(L, -1); |
| 162 | lua_pop(L, 1); /* remove upvalue */ | 162 | FILE *f = getnonullfile(L, ctrl, 1); |
| 163 | if (ctrl == (IOCtrl *)lua_touserdata(L, 1)) { | 163 | if (f != stdin && f != stdout && f != stderr) |
| 164 | /* collecting `ctrl' itself */ | 164 | CLOSEFILE(L, f); |
| 165 | lua_unref(L, ctrl->ref[INFILE]); | ||
| 166 | lua_unref(L, ctrl->ref[OUTFILE]); | ||
| 167 | free(ctrl); | ||
| 168 | } | ||
| 169 | else { /* collecting a file: Close it */ | ||
| 170 | FILE *f = getnonullfile(L, ctrl, 1); | ||
| 171 | if (f != stdin && f != stdout && f != stderr) | ||
| 172 | CLOSEFILE(L, f); | ||
| 173 | } | ||
| 174 | return 0; | 165 | return 0; |
| 175 | } | 166 | } |
| 176 | 167 | ||
| @@ -690,14 +681,13 @@ static const struct luaL_reg iolibtag[] = { | |||
| 690 | 681 | ||
| 691 | 682 | ||
| 692 | static void openwithcontrol (lua_State *L) { | 683 | static void openwithcontrol (lua_State *L) { |
| 693 | IOCtrl *ctrl = (IOCtrl *)malloc(sizeof(IOCtrl)); | 684 | IOCtrl *ctrl = (IOCtrl *)lua_newuserdata(L, sizeof(IOCtrl)); |
| 694 | unsigned int i; | 685 | unsigned int i; |
| 695 | int ctrltag = lua_newtag(L); | ||
| 696 | ctrl->iotag = lua_newtag(L); | 686 | ctrl->iotag = lua_newtag(L); |
| 697 | ctrl->closedtag = lua_newtag(L); | 687 | ctrl->closedtag = lua_newtag(L); |
| 698 | for (i=0; i<sizeof(iolibtag)/sizeof(iolibtag[0]); i++) { | 688 | for (i=0; i<sizeof(iolibtag)/sizeof(iolibtag[0]); i++) { |
| 699 | /* put `ctrl' as upvalue for these functions */ | 689 | /* put `ctrl' as upvalue for these functions */ |
| 700 | lua_pushusertag(L, ctrl, ctrltag); | 690 | lua_pushvalue(L, -1); |
| 701 | lua_pushcclosure(L, iolibtag[i].func, 1); | 691 | lua_pushcclosure(L, iolibtag[i].func, 1); |
| 702 | lua_setglobal(L, iolibtag[i].name); | 692 | lua_setglobal(L, iolibtag[i].name); |
| 703 | } | 693 | } |
| @@ -712,12 +702,10 @@ static void openwithcontrol (lua_State *L) { | |||
| 712 | setfilebyname(L, ctrl, stdin, "_STDIN"); | 702 | setfilebyname(L, ctrl, stdin, "_STDIN"); |
| 713 | setfilebyname(L, ctrl, stdout, "_STDOUT"); | 703 | setfilebyname(L, ctrl, stdout, "_STDOUT"); |
| 714 | setfilebyname(L, ctrl, stderr, "_STDERR"); | 704 | setfilebyname(L, ctrl, stderr, "_STDERR"); |
| 715 | /* delete `ctrl' when collected */ | ||
| 716 | lua_pushusertag(L, ctrl, ctrltag); | ||
| 717 | lua_pushcclosure(L, file_collect, 1); | ||
| 718 | lua_settagmethod(L, ctrltag, "gc"); | ||
| 719 | /* close files when collected */ | 705 | /* close files when collected */ |
| 720 | lua_copytagmethods(L, ctrl->iotag, ctrltag); | 706 | lua_pushcclosure(L, file_collect, 1); /* pops `ctrl' from stack */ |
| 707 | lua_settagmethod(L, ctrl->iotag, "gc"); | ||
| 708 | lua_pop(L, 1); /* remove tag method returned by previous call */ | ||
| 721 | } | 709 | } |
| 722 | 710 | ||
| 723 | 711 | ||
