aboutsummaryrefslogtreecommitdiff
path: root/liolib.c
diff options
context:
space:
mode:
Diffstat (limited to 'liolib.c')
-rw-r--r--liolib.c24
1 files changed, 16 insertions, 8 deletions
diff --git a/liolib.c b/liolib.c
index ad94e6f4..fdc5edce 100644
--- a/liolib.c
+++ b/liolib.c
@@ -73,7 +73,8 @@ static int pushresult (lua_State *L, int i) {
73static int checkfile (lua_State *L, int findex, const char *tname) { 73static int checkfile (lua_State *L, int findex, const char *tname) {
74 int res; 74 int res;
75 lua_getmetatable(L, findex); 75 lua_getmetatable(L, findex);
76 lua_getstr(L, LUA_REGISTRYINDEX, tname); 76 lua_pushstring(L, tname);
77 lua_rawget(L, LUA_REGISTRYINDEX);
77 res = lua_equal(L, -1, -2); 78 res = lua_equal(L, -1, -2);
78 lua_pop(L, 2); 79 lua_pop(L, 2);
79 return res; 80 return res;
@@ -111,7 +112,8 @@ static FILE *getopthandle (lua_State *L, int inout) {
111 112
112static void newfile (lua_State *L, FILE *f) { 113static void newfile (lua_State *L, FILE *f) {
113 lua_newuserdatabox(L, f); 114 lua_newuserdatabox(L, f);
114 lua_getstr(L, LUA_REGISTRYINDEX, FILEHANDLE); 115 lua_pushliteral(L, FILEHANDLE);
116 lua_rawget(L, LUA_REGISTRYINDEX);
115 lua_setmetatable(L, -2); 117 lua_setmetatable(L, -2);
116} 118}
117 119
@@ -147,7 +149,8 @@ static int io_close (lua_State *L) {
147 int status = 1; 149 int status = 1;
148 if (f != stdin && f != stdout && f != stderr) { 150 if (f != stdin && f != stdout && f != stderr) {
149 lua_settop(L, 1); /* make sure file is on top */ 151 lua_settop(L, 1); /* make sure file is on top */
150 lua_getstr(L, LUA_REGISTRYINDEX, CLOSEDFILEHANDLE); 152 lua_pushliteral(L, CLOSEDFILEHANDLE);
153 lua_rawget(L, LUA_REGISTRYINDEX);
151 lua_setmetatable(L, 1); 154 lua_setmetatable(L, 1);
152 status = (CLOSEFILE(L, f) == 0); 155 status = (CLOSEFILE(L, f) == 0);
153 } 156 }
@@ -467,14 +470,16 @@ static int io_clock (lua_State *L) {
467*/ 470*/
468 471
469static void setfield (lua_State *L, const char *key, int value) { 472static void setfield (lua_State *L, const char *key, int value) {
473 lua_pushstring(L, key);
470 lua_pushnumber(L, value); 474 lua_pushnumber(L, value);
471 lua_setstr(L, -2, key); 475 lua_rawset(L, -3);
472} 476}
473 477
474 478
475static int getfield (lua_State *L, const char *key, int d) { 479static int getfield (lua_State *L, const char *key, int d) {
476 int res; 480 int res;
477 lua_getstr(L, -1, key); 481 lua_pushstring(L, key);
482 lua_gettable(L, -2);
478 if (lua_isnumber(L, -1)) 483 if (lua_isnumber(L, -1))
479 res = (int)(lua_tonumber(L, -1)); 484 res = (int)(lua_tonumber(L, -1));
480 else { 485 else {
@@ -693,15 +698,18 @@ static const luaL_reg iolib[] = {
693 698
694 699
695LUALIB_API int lua_iolibopen (lua_State *L) { 700LUALIB_API int lua_iolibopen (lua_State *L) {
701 lua_pushliteral(L, FILEHANDLE);
696 lua_newtable(L); /* meta table for FILEHANDLE */ 702 lua_newtable(L); /* meta table for FILEHANDLE */
697 /* close files when collected */ 703 /* close files when collected */
704 lua_pushliteral(L, "gc");
698 lua_pushcfunction(L, file_collect); 705 lua_pushcfunction(L, file_collect);
699 lua_setstr(L, -2, "gc"); 706 lua_rawset(L, -3);
700 /* put new metatable into registry */ 707 /* put new metatable into registry */
701 lua_setstr(L, LUA_REGISTRYINDEX, FILEHANDLE); 708 lua_rawset(L, LUA_REGISTRYINDEX);
702 /* meta table for CLOSEDFILEHANDLE */ 709 /* meta table for CLOSEDFILEHANDLE */
710 lua_pushliteral(L, CLOSEDFILEHANDLE);
703 lua_newtable(L); 711 lua_newtable(L);
704 lua_setstr(L, LUA_REGISTRYINDEX, CLOSEDFILEHANDLE); 712 lua_rawset(L, LUA_REGISTRYINDEX);
705 luaL_openl(L, iolib); 713 luaL_openl(L, iolib);
706 /* predefined file handles */ 714 /* predefined file handles */
707 newfilewithname(L, stdin, basicfiles[INFILE]); 715 newfilewithname(L, stdin, basicfiles[INFILE]);