diff options
| -rw-r--r-- | lapi.c | 11 | ||||
| -rw-r--r-- | lbuiltin.c | 3 | ||||
| -rw-r--r-- | ldo.c | 18 | ||||
| -rw-r--r-- | liolib.c | 21 | ||||
| -rw-r--r-- | lua.h | 3 |
5 files changed, 27 insertions, 29 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lapi.c,v 1.13 1997/12/11 14:48:46 roberto Exp roberto $ | 2 | ** $Id: lapi.c,v 1.14 1997/12/15 16:17:20 roberto Exp roberto $ |
| 3 | ** Lua API | 3 | ** Lua API |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -124,6 +124,15 @@ lua_Object lua_lua2C (int number) | |||
| 124 | } | 124 | } |
| 125 | 125 | ||
| 126 | 126 | ||
| 127 | lua_Object lua_upvalue (int n) | ||
| 128 | { | ||
| 129 | TObject *f = L->stack.stack+L->Cstack.lua2C-1; | ||
| 130 | if (ttype(f) != LUA_T_CLMARK || n <= 0 || n > clvalue(f)->nelems) | ||
| 131 | return LUA_NOOBJECT; | ||
| 132 | return put_luaObject(&clvalue(f)->consts[n]); | ||
| 133 | } | ||
| 134 | |||
| 135 | |||
| 127 | int lua_callfunction (lua_Object function) | 136 | int lua_callfunction (lua_Object function) |
| 128 | { | 137 | { |
| 129 | if (function == LUA_NOOBJECT) | 138 | if (function == LUA_NOOBJECT) |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lbuiltin.c,v 1.17 1997/12/15 16:17:20 roberto Exp roberto $ | 2 | ** $Id: lbuiltin.c,v 1.18 1997/12/17 20:48:58 roberto Exp roberto $ |
| 3 | ** Built-in functions | 3 | ** Built-in functions |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -427,6 +427,7 @@ static void testC (void) | |||
| 427 | case 'r': { int n=getnum(s); reg[n]=lua_getref(locks[getnum(s)]); break; } | 427 | case 'r': { int n=getnum(s); reg[n]=lua_getref(locks[getnum(s)]); break; } |
| 428 | case 'u': lua_unref(locks[getnum(s)]); break; | 428 | case 'u': lua_unref(locks[getnum(s)]); break; |
| 429 | case 'p': { int n = getnum(s); reg[n] = lua_getparam(getnum(s)); break; } | 429 | case 'p': { int n = getnum(s); reg[n] = lua_getparam(getnum(s)); break; } |
| 430 | case 'U': { int n = getnum(s); reg[n] = lua_upvalue(getnum(s)); break; } | ||
| 430 | case '=': lua_setglobal(getname(s)); break; | 431 | case '=': lua_setglobal(getname(s)); break; |
| 431 | case 's': lua_pushstring(getname(s)); break; | 432 | case 's': lua_pushstring(getname(s)); break; |
| 432 | case 'o': lua_pushobject(reg[getnum(s)]); break; | 433 | case 'o': lua_pushobject(reg[getnum(s)]); break; |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: ldo.c,v 1.15 1997/12/15 16:17:20 roberto Exp roberto $ | 2 | ** $Id: ldo.c,v 1.16 1997/12/17 20:57:20 roberto Exp roberto $ |
| 3 | ** Stack and Call structure of Lua | 3 | ** Stack and Call structure of Lua |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -140,22 +140,12 @@ void luaD_callHook (StkId base, TProtoFunc *tf, int isreturn) | |||
| 140 | ** Cstack.num is the number of arguments; Cstack.lua2C points to the | 140 | ** Cstack.num is the number of arguments; Cstack.lua2C points to the |
| 141 | ** first argument. Returns an index to the first result from C. | 141 | ** first argument. Returns an index to the first result from C. |
| 142 | */ | 142 | */ |
| 143 | static StkId callC (struct Closure *cl, lua_CFunction f, StkId base) | 143 | static StkId callC (lua_CFunction f, StkId base) |
| 144 | { | 144 | { |
| 145 | struct C_Lua_Stack *CS = &L->Cstack; | 145 | struct C_Lua_Stack *CS = &L->Cstack; |
| 146 | struct C_Lua_Stack oldCLS = *CS; | 146 | struct C_Lua_Stack oldCLS = *CS; |
| 147 | StkId firstResult; | 147 | StkId firstResult; |
| 148 | int numarg = (L->stack.top-L->stack.stack) - base; | 148 | int numarg = (L->stack.top-L->stack.stack) - base; |
| 149 | if (cl) { /* are there upvalues? */ | ||
| 150 | int i; | ||
| 151 | luaD_checkstack(cl->nelems); | ||
| 152 | for (i=1; i<=numarg; i++) /* open space */ | ||
| 153 | *(L->stack.top+cl->nelems-i) = *(L->stack.top-i); | ||
| 154 | /* copy upvalues to stack */ | ||
| 155 | memcpy(L->stack.top-numarg, cl->consts+1, cl->nelems*sizeof(TObject)); | ||
| 156 | L->stack.top += cl->nelems; | ||
| 157 | numarg += cl->nelems; | ||
| 158 | } | ||
| 159 | CS->num = numarg; | 149 | CS->num = numarg; |
| 160 | CS->lua2C = base; | 150 | CS->lua2C = base; |
| 161 | CS->base = base+numarg; /* == top-stack */ | 151 | CS->base = base+numarg; /* == top-stack */ |
| @@ -192,7 +182,7 @@ void luaD_call (StkId base, int nResults) | |||
| 192 | switch (ttype(func)) { | 182 | switch (ttype(func)) { |
| 193 | case LUA_T_CPROTO: | 183 | case LUA_T_CPROTO: |
| 194 | ttype(func) = LUA_T_CMARK; | 184 | ttype(func) = LUA_T_CMARK; |
| 195 | firstResult = callC(NULL, fvalue(func), base); | 185 | firstResult = callC(fvalue(func), base); |
| 196 | break; | 186 | break; |
| 197 | case LUA_T_PROTO: | 187 | case LUA_T_PROTO: |
| 198 | ttype(func) = LUA_T_PMARK; | 188 | ttype(func) = LUA_T_PMARK; |
| @@ -203,7 +193,7 @@ void luaD_call (StkId base, int nResults) | |||
| 203 | TObject *proto = &(c->consts[0]); | 193 | TObject *proto = &(c->consts[0]); |
| 204 | ttype(func) = LUA_T_CLMARK; | 194 | ttype(func) = LUA_T_CLMARK; |
| 205 | firstResult = (ttype(proto) == LUA_T_CPROTO) ? | 195 | firstResult = (ttype(proto) == LUA_T_CPROTO) ? |
| 206 | callC(c, fvalue(proto), base) : | 196 | callC(fvalue(proto), base) : |
| 207 | luaV_execute(c, tfvalue(proto), base); | 197 | luaV_execute(c, tfvalue(proto), base); |
| 208 | break; | 198 | break; |
| 209 | } | 199 | } |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: liolib.c,v 1.9 1997/12/09 13:50:08 roberto Exp roberto $ | 2 | ** $Id: liolib.c,v 1.10 1997/12/17 20:48:58 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 | */ |
| @@ -39,9 +39,6 @@ | |||
| 39 | #define FOUTPUT "_OUTPUT" | 39 | #define FOUTPUT "_OUTPUT" |
| 40 | 40 | ||
| 41 | 41 | ||
| 42 | #define FIRSTARG 3 /* 1st and 2nd are upvalues */ | ||
| 43 | |||
| 44 | |||
| 45 | #ifdef POPEN | 42 | #ifdef POPEN |
| 46 | FILE *popen(); | 43 | FILE *popen(); |
| 47 | int pclose(); | 44 | int pclose(); |
| @@ -53,7 +50,7 @@ int pclose(); | |||
| 53 | 50 | ||
| 54 | static int gettag (int i) | 51 | static int gettag (int i) |
| 55 | { | 52 | { |
| 56 | return lua_getnumber(lua_getparam(i)); | 53 | return lua_getnumber(lua_upvalue(i)); |
| 57 | } | 54 | } |
| 58 | 55 | ||
| 59 | 56 | ||
| @@ -128,7 +125,7 @@ static void setreturn (FILE *f, char *name) | |||
| 128 | static void io_readfrom (void) | 125 | static void io_readfrom (void) |
| 129 | { | 126 | { |
| 130 | FILE *current; | 127 | FILE *current; |
| 131 | lua_Object f = lua_getparam(FIRSTARG); | 128 | lua_Object f = lua_getparam(1); |
| 132 | if (f == LUA_NOOBJECT) { | 129 | if (f == LUA_NOOBJECT) { |
| 133 | closefile(FINPUT); | 130 | closefile(FINPUT); |
| 134 | current = stdin; | 131 | current = stdin; |
| @@ -136,7 +133,7 @@ static void io_readfrom (void) | |||
| 136 | else if (lua_tag(f) == gettag(IOTAG)) | 133 | else if (lua_tag(f) == gettag(IOTAG)) |
| 137 | current = lua_getuserdata(f); | 134 | current = lua_getuserdata(f); |
| 138 | else { | 135 | else { |
| 139 | char *s = luaL_check_string(FIRSTARG); | 136 | char *s = luaL_check_string(1); |
| 140 | current = (*s == '|') ? popen(s+1, "r") : fopen(s, "r"); | 137 | current = (*s == '|') ? popen(s+1, "r") : fopen(s, "r"); |
| 141 | if (current == NULL) { | 138 | if (current == NULL) { |
| 142 | pushresult(0); | 139 | pushresult(0); |
| @@ -150,7 +147,7 @@ static void io_readfrom (void) | |||
| 150 | static void io_writeto (void) | 147 | static void io_writeto (void) |
| 151 | { | 148 | { |
| 152 | FILE *current; | 149 | FILE *current; |
| 153 | lua_Object f = lua_getparam(FIRSTARG); | 150 | lua_Object f = lua_getparam(1); |
| 154 | if (f == LUA_NOOBJECT) { | 151 | if (f == LUA_NOOBJECT) { |
| 155 | closefile(FOUTPUT); | 152 | closefile(FOUTPUT); |
| 156 | current = stdout; | 153 | current = stdout; |
| @@ -158,7 +155,7 @@ static void io_writeto (void) | |||
| 158 | else if (lua_tag(f) == gettag(IOTAG)) | 155 | else if (lua_tag(f) == gettag(IOTAG)) |
| 159 | current = lua_getuserdata(f); | 156 | current = lua_getuserdata(f); |
| 160 | else { | 157 | else { |
| 161 | char *s = luaL_check_string(FIRSTARG); | 158 | char *s = luaL_check_string(1); |
| 162 | current = (*s == '|') ? popen(s+1,"w") : fopen(s,"w"); | 159 | current = (*s == '|') ? popen(s+1,"w") : fopen(s,"w"); |
| 163 | if (current == NULL) { | 160 | if (current == NULL) { |
| 164 | pushresult(0); | 161 | pushresult(0); |
| @@ -171,7 +168,7 @@ static void io_writeto (void) | |||
| 171 | 168 | ||
| 172 | static void io_appendto (void) | 169 | static void io_appendto (void) |
| 173 | { | 170 | { |
| 174 | char *s = luaL_check_string(FIRSTARG); | 171 | char *s = luaL_check_string(1); |
| 175 | FILE *fp = fopen (s, "a"); | 172 | FILE *fp = fopen (s, "a"); |
| 176 | if (fp != NULL) | 173 | if (fp != NULL) |
| 177 | setreturn(fp, FOUTPUT); | 174 | setreturn(fp, FOUTPUT); |
| @@ -184,7 +181,7 @@ static void io_appendto (void) | |||
| 184 | 181 | ||
| 185 | static void io_read (void) | 182 | static void io_read (void) |
| 186 | { | 183 | { |
| 187 | int arg = FIRSTARG; | 184 | int arg = 1; |
| 188 | FILE *f = getfileparam(FINPUT, &arg); | 185 | FILE *f = getfileparam(FINPUT, &arg); |
| 189 | char *buff; | 186 | char *buff; |
| 190 | char *p = luaL_opt_string(arg, "[^\n]*{\n}"); | 187 | char *p = luaL_opt_string(arg, "[^\n]*{\n}"); |
| @@ -236,7 +233,7 @@ static void io_read (void) | |||
| 236 | 233 | ||
| 237 | static void io_write (void) | 234 | static void io_write (void) |
| 238 | { | 235 | { |
| 239 | int arg = FIRSTARG; | 236 | int arg = 1; |
| 240 | FILE *f = getfileparam(FOUTPUT, &arg); | 237 | FILE *f = getfileparam(FOUTPUT, &arg); |
| 241 | int status = 1; | 238 | int status = 1; |
| 242 | char *s; | 239 | char *s; |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lua.h,v 1.10 1997/12/11 17:21:11 roberto Exp roberto $ | 2 | ** $Id: lua.h,v 1.11 1997/12/15 17:47:55 roberto Exp roberto $ |
| 3 | ** Lua - An Extensible Extension Language | 3 | ** Lua - An Extensible Extension Language |
| 4 | ** TeCGraf: Grupo de Tecnologia em Computacao Grafica, PUC-Rio, Brazil | 4 | ** TeCGraf: Grupo de Tecnologia em Computacao Grafica, PUC-Rio, Brazil |
| 5 | ** e-mail: lua@tecgraf.puc-rio.br | 5 | ** e-mail: lua@tecgraf.puc-rio.br |
| @@ -77,6 +77,7 @@ void lua_beginblock (void); | |||
| 77 | void lua_endblock (void); | 77 | void lua_endblock (void); |
| 78 | 78 | ||
| 79 | lua_Object lua_lua2C (int number); | 79 | lua_Object lua_lua2C (int number); |
| 80 | lua_Object lua_upvalue (int n); | ||
| 80 | #define lua_getparam(_) lua_lua2C(_) | 81 | #define lua_getparam(_) lua_lua2C(_) |
| 81 | #define lua_getresult(_) lua_lua2C(_) | 82 | #define lua_getresult(_) lua_lua2C(_) |
| 82 | 83 | ||
