diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2000-03-29 17:19:20 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2000-03-29 17:19:20 -0300 |
commit | a69356e9e0a7525b1cebadc928a0efcce8c39b46 (patch) | |
tree | c676ee2997c699d3e0b036323ecbafa7ea0d786f | |
parent | b53dc0c4853c56694dda727793e5f6188de39dd8 (diff) | |
download | lua-a69356e9e0a7525b1cebadc928a0efcce8c39b46.tar.gz lua-a69356e9e0a7525b1cebadc928a0efcce8c39b46.tar.bz2 lua-a69356e9e0a7525b1cebadc928a0efcce8c39b46.zip |
no more special cases for closures with 0 upvalues (performance is the same,
memory use a little higher, code much simpler).
-rw-r--r-- | lapi.c | 23 | ||||
-rw-r--r-- | lapi.h | 3 | ||||
-rw-r--r-- | lbuiltin.c | 8 | ||||
-rw-r--r-- | ldebug.c | 28 | ||||
-rw-r--r-- | ldo.c | 63 | ||||
-rw-r--r-- | ldo.h | 4 | ||||
-rw-r--r-- | lfunc.c | 5 | ||||
-rw-r--r-- | lgc.c | 15 | ||||
-rw-r--r-- | lobject.c | 15 | ||||
-rw-r--r-- | lobject.h | 61 | ||||
-rw-r--r-- | lparser.c | 7 | ||||
-rw-r--r-- | lref.c | 6 | ||||
-rw-r--r-- | ltable.c | 8 | ||||
-rw-r--r-- | ltm.c | 19 | ||||
-rw-r--r-- | lvm.c | 50 | ||||
-rw-r--r-- | lvm.h | 7 |
16 files changed, 128 insertions, 194 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lapi.c,v 1.75 2000/03/20 19:14:54 roberto Exp roberto $ | 2 | ** $Id: lapi.c,v 1.76 2000/03/27 20:10:21 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 | */ |
@@ -30,17 +30,6 @@ const char lua_ident[] = "$Lua: " LUA_VERSION " " LUA_COPYRIGHT " $\n" | |||
30 | 30 | ||
31 | 31 | ||
32 | 32 | ||
33 | |||
34 | const TObject *luaA_protovalue (const TObject *o) { | ||
35 | switch (ttype(o)) { | ||
36 | case TAG_CCLOSURE: case TAG_LCLOSURE: | ||
37 | return protovalue(o); | ||
38 | default: | ||
39 | return o; | ||
40 | } | ||
41 | } | ||
42 | |||
43 | |||
44 | void luaA_checkCargs (lua_State *L, int nargs) { | 33 | void luaA_checkCargs (lua_State *L, int nargs) { |
45 | if (nargs > L->top-L->Cstack.base) | 34 | if (nargs > L->top-L->Cstack.base) |
46 | luaL_verror(L, "Lua API error - " | 35 | luaL_verror(L, "Lua API error - " |
@@ -210,7 +199,8 @@ int lua_isuserdata (lua_State *L, lua_Object o) { | |||
210 | } | 199 | } |
211 | 200 | ||
212 | int lua_iscfunction (lua_State *L, lua_Object o) { | 201 | int lua_iscfunction (lua_State *L, lua_Object o) { |
213 | return (lua_tag(L, o) == TAG_CPROTO); | 202 | UNUSED(L); |
203 | return (o != LUA_NOOBJECT) && (ttype(o) == TAG_CCLOSURE); | ||
214 | } | 204 | } |
215 | 205 | ||
216 | int lua_isnumber (lua_State *L, lua_Object o) { | 206 | int lua_isnumber (lua_State *L, lua_Object o) { |
@@ -266,7 +256,7 @@ void *lua_getuserdata (lua_State *L, lua_Object obj) { | |||
266 | lua_CFunction lua_getcfunction (lua_State *L, lua_Object obj) { | 256 | lua_CFunction lua_getcfunction (lua_State *L, lua_Object obj) { |
267 | if (!lua_iscfunction(L, obj)) | 257 | if (!lua_iscfunction(L, obj)) |
268 | return NULL; | 258 | return NULL; |
269 | else return fvalue(luaA_protovalue(obj)); | 259 | else return clvalue(obj)->f.c; |
270 | } | 260 | } |
271 | 261 | ||
272 | 262 | ||
@@ -299,10 +289,7 @@ void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n) { | |||
299 | if (fn == NULL) | 289 | if (fn == NULL) |
300 | lua_error(L, "Lua API error - attempt to push a NULL Cfunction"); | 290 | lua_error(L, "Lua API error - attempt to push a NULL Cfunction"); |
301 | luaA_checkCargs(L, n); | 291 | luaA_checkCargs(L, n); |
302 | ttype(L->top) = TAG_CPROTO; | 292 | luaV_Cclosure(L, fn, n); |
303 | fvalue(L->top) = fn; | ||
304 | incr_top; | ||
305 | luaV_closure(L, n); | ||
306 | luaC_checkGC(L); | 293 | luaC_checkGC(L); |
307 | } | 294 | } |
308 | 295 | ||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lapi.h,v 1.14 2000/03/03 14:58:26 roberto Exp roberto $ | 2 | ** $Id: lapi.h,v 1.15 2000/03/10 18:37:44 roberto Exp roberto $ |
3 | ** Auxiliary functions from Lua API | 3 | ** Auxiliary functions from Lua API |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -12,7 +12,6 @@ | |||
12 | 12 | ||
13 | 13 | ||
14 | void luaA_checkCargs (lua_State *L, int nargs); | 14 | void luaA_checkCargs (lua_State *L, int nargs); |
15 | const TObject *luaA_protovalue (const TObject *o); | ||
16 | void luaA_pushobject (lua_State *L, const TObject *o); | 15 | void luaA_pushobject (lua_State *L, const TObject *o); |
17 | GlobalVar *luaA_nextvar (lua_State *L, TString *g); | 16 | GlobalVar *luaA_nextvar (lua_State *L, TString *g); |
18 | int luaA_next (lua_State *L, const Hash *t, int i); | 17 | int luaA_next (lua_State *L, const Hash *t, int i); |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lbuiltin.c,v 1.98 2000/03/27 20:08:02 roberto Exp roberto $ | 2 | ** $Id: lbuiltin.c,v 1.99 2000/03/27 20:10:21 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 | */ |
@@ -386,12 +386,6 @@ void luaB_tostring (lua_State *L) { | |||
386 | case TAG_LCLOSURE: case TAG_CCLOSURE: | 386 | case TAG_LCLOSURE: case TAG_CCLOSURE: |
387 | sprintf(buff, "function: %p", o->value.cl); | 387 | sprintf(buff, "function: %p", o->value.cl); |
388 | break; | 388 | break; |
389 | case TAG_LPROTO: | ||
390 | sprintf(buff, "function: %p", o->value.tf); | ||
391 | break; | ||
392 | case TAG_CPROTO: | ||
393 | sprintf(buff, "function: %p", o->value.f); | ||
394 | break; | ||
395 | case TAG_USERDATA: | 389 | case TAG_USERDATA: |
396 | sprintf(buff, "userdata: %p(%d)", o->value.ts->u.d.value, | 390 | sprintf(buff, "userdata: %p(%d)", o->value.ts->u.d.value, |
397 | o->value.ts->u.d.tag); | 391 | o->value.ts->u.d.tag); |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: ldebug.c,v 1.12 2000/03/20 19:14:54 roberto Exp roberto $ | 2 | ** $Id: ldebug.c,v 1.13 2000/03/27 20:10:21 roberto Exp roberto $ |
3 | ** Debug Interface | 3 | ** Debug Interface |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -24,10 +24,8 @@ | |||
24 | 24 | ||
25 | static const lua_Type normtype[] = { /* ORDER LUA_T */ | 25 | static const lua_Type normtype[] = { /* ORDER LUA_T */ |
26 | TAG_USERDATA, TAG_NUMBER, TAG_STRING, TAG_TABLE, | 26 | TAG_USERDATA, TAG_NUMBER, TAG_STRING, TAG_TABLE, |
27 | TAG_LPROTO, TAG_CPROTO, TAG_NIL, | 27 | TAG_LCLOSURE, TAG_CCLOSURE, TAG_NIL, |
28 | TAG_LCLOSURE, TAG_CCLOSURE, | 28 | TAG_LCLOSURE, TAG_CCLOSURE /* TAG_LCLMARK, TAG_CCLMARK */ |
29 | TAG_LCLOSURE, TAG_CCLOSURE, /* TAG_LCLMARK, TAG_CCLMARK */ | ||
30 | TAG_LPROTO, TAG_CPROTO /* TAG_LMARK, TAG_CMARK */ | ||
31 | }; | 29 | }; |
32 | 30 | ||
33 | 31 | ||
@@ -104,11 +102,7 @@ static int lua_currentline (lua_State *L, StkId f) { | |||
104 | 102 | ||
105 | 103 | ||
106 | static Proto *getluaproto (StkId f) { | 104 | static Proto *getluaproto (StkId f) { |
107 | if (ttype(f) == TAG_LMARK) | 105 | return (ttype(f) == TAG_LCLMARK) ? clvalue(f)->f.l : NULL; |
108 | return f->value.tf; | ||
109 | else if (ttype(f) == TAG_LCLMARK) | ||
110 | return protovalue(f)->value.tf; | ||
111 | else return NULL; | ||
112 | } | 106 | } |
113 | 107 | ||
114 | 108 | ||
@@ -141,20 +135,18 @@ int lua_setlocal (lua_State *L, const lua_Dbgactreg *ar, lua_Dbglocvar *v) { | |||
141 | static void lua_funcinfo (lua_Dbgactreg *ar) { | 135 | static void lua_funcinfo (lua_Dbgactreg *ar) { |
142 | StkId func = ar->_func; | 136 | StkId func = ar->_func; |
143 | switch (ttype(func)) { | 137 | switch (ttype(func)) { |
144 | case TAG_LPROTO: case TAG_LMARK: | ||
145 | ar->source = tfvalue(func)->source->str; | ||
146 | ar->linedefined = tfvalue(func)->lineDefined; | ||
147 | ar->what = "Lua"; | ||
148 | break; | ||
149 | case TAG_LCLOSURE: case TAG_LCLMARK: | 138 | case TAG_LCLOSURE: case TAG_LCLMARK: |
150 | ar->source = tfvalue(protovalue(func))->source->str; | 139 | ar->source = clvalue(func)->f.l->source->str; |
151 | ar->linedefined = tfvalue(protovalue(func))->lineDefined; | 140 | ar->linedefined = clvalue(func)->f.l->lineDefined; |
152 | ar->what = "Lua"; | 141 | ar->what = "Lua"; |
153 | break; | 142 | break; |
154 | default: | 143 | case TAG_CCLOSURE: case TAG_CCLMARK: |
155 | ar->source = "(C)"; | 144 | ar->source = "(C)"; |
156 | ar->linedefined = -1; | 145 | ar->linedefined = -1; |
157 | ar->what = "C"; | 146 | ar->what = "C"; |
147 | break; | ||
148 | default: | ||
149 | LUA_INTERNALERROR(L, "invalid `func' value"); | ||
158 | } | 150 | } |
159 | if (ar->linedefined == 0) | 151 | if (ar->linedefined == 0) |
160 | ar->what = "main"; | 152 | ar->what = "main"; |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: ldo.c,v 1.68 2000/03/03 14:58:26 roberto Exp roberto $ | 2 | ** $Id: ldo.c,v 1.69 2000/03/10 18:37:44 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 | */ |
@@ -119,7 +119,7 @@ void luaD_lineHook (lua_State *L, StkId func, int line) { | |||
119 | } | 119 | } |
120 | 120 | ||
121 | 121 | ||
122 | void luaD_callHook (lua_State *L, StkId func, lua_Dbghook callhook, | 122 | static void luaD_callHook (lua_State *L, StkId func, lua_Dbghook callhook, |
123 | const char *event) { | 123 | const char *event) { |
124 | if (L->allowhooks) { | 124 | if (L->allowhooks) { |
125 | lua_Dbgactreg ar; | 125 | lua_Dbgactreg ar; |
@@ -137,40 +137,31 @@ void luaD_callHook (lua_State *L, StkId func, lua_Dbghook callhook, | |||
137 | } | 137 | } |
138 | 138 | ||
139 | 139 | ||
140 | /* | 140 | static StkId callCclosure (lua_State *L, const struct Closure *cl, StkId base) { |
141 | ** Call a C function. | 141 | int nup = cl->nelems; /* number of upvalues */ |
142 | ** Cstack.num is the number of arguments; Cstack.lua2C points to the | 142 | int numarg = L->top-base; |
143 | ** first argument. Returns an index to the first result from C. | ||
144 | */ | ||
145 | static StkId callC (lua_State *L, lua_CFunction f, StkId base) { | ||
146 | struct C_Lua_Stack oldCLS = L->Cstack; | 143 | struct C_Lua_Stack oldCLS = L->Cstack; |
147 | StkId firstResult; | 144 | StkId firstResult; |
148 | int numarg = L->top - base; | 145 | if (nup > 0) { |
146 | int n = numarg; | ||
147 | luaD_checkstack(L, nup); | ||
148 | /* open space for upvalues as extra arguments */ | ||
149 | while (n--) *(base+nup+n) = *(base+n); | ||
150 | L->top += nup; | ||
151 | numarg += nup; | ||
152 | /* copy upvalues into stack */ | ||
153 | while (nup--) *(base+nup) = cl->consts[nup]; | ||
154 | } | ||
149 | L->Cstack.num = numarg; | 155 | L->Cstack.num = numarg; |
150 | L->Cstack.lua2C = base; | 156 | L->Cstack.lua2C = base; |
151 | L->Cstack.base = L->top; | 157 | L->Cstack.base = L->top; |
152 | if (L->callhook) | 158 | (*cl->f.c)(L); /* do the actual call */ |
153 | luaD_callHook(L, base-1, L->callhook, "call"); | ||
154 | (*f)(L); /* do the actual call */ | ||
155 | firstResult = L->Cstack.base; | 159 | firstResult = L->Cstack.base; |
156 | L->Cstack = oldCLS; | 160 | L->Cstack = oldCLS; |
157 | return firstResult; | 161 | return firstResult; |
158 | } | 162 | } |
159 | 163 | ||
160 | 164 | ||
161 | static StkId callCclosure (lua_State *L, const struct Closure *cl, StkId base) { | ||
162 | int nup = cl->nelems; /* number of upvalues */ | ||
163 | int n = L->top-base; /* number of arguments (to move up) */ | ||
164 | luaD_checkstack(L, nup); | ||
165 | /* open space for upvalues as extra arguments */ | ||
166 | while (n--) *(base+nup+n) = *(base+n); | ||
167 | L->top += nup; | ||
168 | /* copy upvalues into stack */ | ||
169 | while (nup--) *(base+nup) = cl->consts[nup+1]; | ||
170 | return callC(L, fvalue(cl->consts), base); | ||
171 | } | ||
172 | |||
173 | |||
174 | void luaD_callTM (lua_State *L, const TObject *f, int nParams, int nResults) { | 165 | void luaD_callTM (lua_State *L, const TObject *f, int nParams, int nResults) { |
175 | StkId base = L->top - nParams; | 166 | StkId base = L->top - nParams; |
176 | luaD_openstack(L, base); | 167 | luaD_openstack(L, base); |
@@ -191,24 +182,18 @@ void luaD_call (lua_State *L, StkId func, int nResults) { | |||
191 | lua_Dbghook callhook = L->callhook; | 182 | lua_Dbghook callhook = L->callhook; |
192 | retry: /* for `function' tag method */ | 183 | retry: /* for `function' tag method */ |
193 | switch (ttype(func)) { | 184 | switch (ttype(func)) { |
194 | case TAG_CPROTO: | ||
195 | ttype(func) = TAG_CMARK; | ||
196 | firstResult = callC(L, fvalue(func), func+1); | ||
197 | break; | ||
198 | case TAG_LPROTO: | ||
199 | ttype(func) = TAG_LMARK; | ||
200 | firstResult = luaV_execute(L, NULL, tfvalue(func), func+1); | ||
201 | break; | ||
202 | case TAG_LCLOSURE: { | 185 | case TAG_LCLOSURE: { |
203 | Closure *c = clvalue(func); | ||
204 | ttype(func) = TAG_LCLMARK; | 186 | ttype(func) = TAG_LCLMARK; |
205 | firstResult = luaV_execute(L, c, tfvalue(c->consts), func+1); | 187 | if (callhook) |
188 | luaD_callHook(L, func, callhook, "call"); | ||
189 | firstResult = luaV_execute(L, clvalue(func), func+1); | ||
206 | break; | 190 | break; |
207 | } | 191 | } |
208 | case TAG_CCLOSURE: { | 192 | case TAG_CCLOSURE: { |
209 | Closure *c = clvalue(func); | ||
210 | ttype(func) = TAG_CCLMARK; | 193 | ttype(func) = TAG_CCLMARK; |
211 | firstResult = callCclosure(L, c, func+1); | 194 | if (callhook) |
195 | luaD_callHook(L, func, callhook, "call"); | ||
196 | firstResult = callCclosure(L, clvalue(func), func+1); | ||
212 | break; | 197 | break; |
213 | } | 198 | } |
214 | default: { /* `func' is not a function; check the `function' tag method */ | 199 | default: { /* `func' is not a function; check the `function' tag method */ |
@@ -316,9 +301,7 @@ static int protectedparser (lua_State *L, ZIO *z, int bin) { | |||
316 | L->errorJmp = oldErr; | 301 | L->errorJmp = oldErr; |
317 | if (status) return 1; /* error code */ | 302 | if (status) return 1; /* error code */ |
318 | if (tf == NULL) return 2; /* `natural' end */ | 303 | if (tf == NULL) return 2; /* `natural' end */ |
319 | L->top->ttype = TAG_LPROTO; /* push new function on the stack */ | 304 | luaV_Lclosure(L, tf, 0); |
320 | L->top->value.tf = tf; | ||
321 | incr_top; | ||
322 | return 0; | 305 | return 0; |
323 | } | 306 | } |
324 | 307 | ||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: ldo.h,v 1.17 2000/01/19 12:00:45 roberto Exp roberto $ | 2 | ** $Id: ldo.h,v 1.18 2000/03/24 17:26:08 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 | */ |
@@ -22,8 +22,6 @@ | |||
22 | void luaD_init (lua_State *L, int stacksize); | 22 | void luaD_init (lua_State *L, int stacksize); |
23 | void luaD_adjusttop (lua_State *L, StkId base, int extra); | 23 | void luaD_adjusttop (lua_State *L, StkId base, int extra); |
24 | void luaD_openstack (lua_State *L, StkId pos); | 24 | void luaD_openstack (lua_State *L, StkId pos); |
25 | void luaD_callHook (lua_State *L, StkId func, lua_Dbghook callhook, | ||
26 | const char *event); | ||
27 | void luaD_lineHook (lua_State *L, StkId func, int line); | 25 | void luaD_lineHook (lua_State *L, StkId func, int line); |
28 | void luaD_call (lua_State *L, StkId func, int nResults); | 26 | void luaD_call (lua_State *L, StkId func, int nResults); |
29 | void luaD_callTM (lua_State *L, const TObject *f, int nParams, int nResults); | 27 | void luaD_callTM (lua_State *L, const TObject *f, int nParams, int nResults); |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lfunc.c,v 1.19 2000/03/03 14:58:26 roberto Exp roberto $ | 2 | ** $Id: lfunc.c,v 1.20 2000/03/10 18:37:44 roberto Exp roberto $ |
3 | ** Auxiliary functions to manipulate prototypes and closures | 3 | ** Auxiliary functions to manipulate prototypes and closures |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -19,7 +19,8 @@ | |||
19 | 19 | ||
20 | 20 | ||
21 | Closure *luaF_newclosure (lua_State *L, int nelems) { | 21 | Closure *luaF_newclosure (lua_State *L, int nelems) { |
22 | Closure *c = (Closure *)luaM_malloc(L, sizeof(Closure)+nelems*sizeof(TObject)); | 22 | Closure *c = (Closure *)luaM_malloc(L, sizeof(Closure) + |
23 | sizeof(TObject)*(nelems-1)); | ||
23 | c->next = L->rootcl; | 24 | c->next = L->rootcl; |
24 | L->rootcl = c; | 25 | L->rootcl = c; |
25 | c->marked = 0; | 26 | c->marked = 0; |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lgc.c,v 1.43 2000/03/27 20:08:02 roberto Exp roberto $ | 2 | ** $Id: lgc.c,v 1.44 2000/03/27 20:10:21 roberto Exp roberto $ |
3 | ** Garbage Collector | 3 | ** Garbage Collector |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -43,9 +43,9 @@ static void protomark (lua_State *L, Proto *f) { | |||
43 | 43 | ||
44 | static void closuremark (lua_State *L, Closure *f) { | 44 | static void closuremark (lua_State *L, Closure *f) { |
45 | if (!f->marked) { | 45 | if (!f->marked) { |
46 | int i; | 46 | int i = f->nelems; |
47 | f->marked = 1; | 47 | f->marked = 1; |
48 | for (i=f->nelems; i>=0; i--) | 48 | while (i--) |
49 | markobject(L, &f->consts[i]); | 49 | markobject(L, &f->consts[i]); |
50 | } | 50 | } |
51 | } | 51 | } |
@@ -103,13 +103,12 @@ static int markobject (lua_State *L, TObject *o) { | |||
103 | hashmark(L, avalue(o)); | 103 | hashmark(L, avalue(o)); |
104 | break; | 104 | break; |
105 | case TAG_LCLOSURE: case TAG_LCLMARK: | 105 | case TAG_LCLOSURE: case TAG_LCLMARK: |
106 | protomark(L, clvalue(o)->f.l); | ||
107 | /* go trhough */ | ||
106 | case TAG_CCLOSURE: case TAG_CCLMARK: | 108 | case TAG_CCLOSURE: case TAG_CCLMARK: |
107 | closuremark(L, o->value.cl); | 109 | closuremark(L, clvalue(o)); |
108 | break; | ||
109 | case TAG_LPROTO: case TAG_LMARK: | ||
110 | protomark(L, o->value.tf); | ||
111 | break; | 110 | break; |
112 | default: break; /* numbers, cprotos, etc */ | 111 | default: break; /* numbers, etc */ |
113 | } | 112 | } |
114 | return 0; | 113 | return 0; |
115 | } | 114 | } |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lobject.c,v 1.33 2000/03/10 18:37:44 roberto Exp roberto $ | 2 | ** $Id: lobject.c,v 1.34 2000/03/27 20:10:21 roberto Exp roberto $ |
3 | ** Some generic functions over Lua objects | 3 | ** Some generic functions over Lua objects |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -15,8 +15,7 @@ | |||
15 | 15 | ||
16 | const char *const luaO_typenames[] = { /* ORDER LUA_T */ | 16 | const char *const luaO_typenames[] = { /* ORDER LUA_T */ |
17 | "userdata", "number", "string", "table", "function", "function", "nil", | 17 | "userdata", "number", "string", "table", "function", "function", "nil", |
18 | "function", "function", "function", "function", "function", "function", | 18 | "function", "function", "line" |
19 | "line", NULL | ||
20 | }; | 19 | }; |
21 | 20 | ||
22 | 21 | ||
@@ -35,20 +34,16 @@ unsigned long luaO_power2 (unsigned long n) { | |||
35 | 34 | ||
36 | int luaO_equalval (const TObject *t1, const TObject *t2) { | 35 | int luaO_equalval (const TObject *t1, const TObject *t2) { |
37 | switch (ttype(t1)) { | 36 | switch (ttype(t1)) { |
38 | case TAG_NIL: | ||
39 | return 1; | ||
40 | case TAG_NUMBER: | 37 | case TAG_NUMBER: |
41 | return nvalue(t1) == nvalue(t2); | 38 | return nvalue(t1) == nvalue(t2); |
42 | case TAG_STRING: case TAG_USERDATA: | 39 | case TAG_STRING: case TAG_USERDATA: |
43 | return svalue(t1) == svalue(t2); | 40 | return svalue(t1) == svalue(t2); |
44 | case TAG_TABLE: | 41 | case TAG_TABLE: |
45 | return avalue(t1) == avalue(t2); | 42 | return avalue(t1) == avalue(t2); |
46 | case TAG_LPROTO: | ||
47 | return tfvalue(t1) == tfvalue(t2); | ||
48 | case TAG_CPROTO: | ||
49 | return fvalue(t1) == fvalue(t2); | ||
50 | case TAG_CCLOSURE: case TAG_LCLOSURE: | 43 | case TAG_CCLOSURE: case TAG_LCLOSURE: |
51 | return t1->value.cl == t2->value.cl; | 44 | return clvalue(t1) == clvalue(t2); |
45 | case TAG_NIL: | ||
46 | return 1; | ||
52 | default: | 47 | default: |
53 | LUA_INTERNALERROR(L, "invalid type"); | 48 | LUA_INTERNALERROR(L, "invalid type"); |
54 | return 0; /* UNREACHABLE */ | 49 | return 0; /* UNREACHABLE */ |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lobject.h,v 1.55 2000/03/24 19:49:23 roberto Exp roberto $ | 2 | ** $Id: lobject.h,v 1.56 2000/03/27 20:10:21 roberto Exp roberto $ |
3 | ** Type definitions for Lua objects | 3 | ** Type definitions for Lua objects |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -23,7 +23,12 @@ | |||
23 | #endif | 23 | #endif |
24 | 24 | ||
25 | 25 | ||
26 | #ifdef DEBUG | ||
27 | /* to avoid warnings and make sure is is really unused */ | ||
28 | #define UNUSED(x) (x=0, (void)x) | ||
29 | #else | ||
26 | #define UNUSED(x) (void)x /* to avoid warnings */ | 30 | #define UNUSED(x) (void)x /* to avoid warnings */ |
31 | #endif | ||
27 | 32 | ||
28 | 33 | ||
29 | /* | 34 | /* |
@@ -36,17 +41,12 @@ typedef enum { | |||
36 | TAG_NUMBER, /* fixed tag for numbers */ | 41 | TAG_NUMBER, /* fixed tag for numbers */ |
37 | TAG_STRING, /* fixed tag for strings */ | 42 | TAG_STRING, /* fixed tag for strings */ |
38 | TAG_TABLE, /* default tag for tables */ | 43 | TAG_TABLE, /* default tag for tables */ |
39 | TAG_LPROTO, /* fixed tag for Lua functions */ | 44 | TAG_LCLOSURE, /* fixed tag for Lua closures */ |
40 | TAG_CPROTO, /* fixed tag for C functions */ | 45 | TAG_CCLOSURE, /* fixed tag for C closures */ |
41 | TAG_NIL, /* last "pre-defined" tag */ | 46 | TAG_NIL, /* last "pre-defined" tag */ |
42 | 47 | ||
43 | TAG_LCLOSURE, /* Lua closure */ | ||
44 | TAG_CCLOSURE, /* C closure */ | ||
45 | |||
46 | TAG_LCLMARK, /* mark for Lua closures */ | 48 | TAG_LCLMARK, /* mark for Lua closures */ |
47 | TAG_CCLMARK, /* mark for C closures */ | 49 | TAG_CCLMARK, /* mark for C closures */ |
48 | TAG_LMARK, /* mark for Lua prototypes */ | ||
49 | TAG_CMARK, /* mark for C prototypes */ | ||
50 | 50 | ||
51 | TAG_LINE | 51 | TAG_LINE |
52 | } lua_Type; | 52 | } lua_Type; |
@@ -58,20 +58,27 @@ typedef enum { | |||
58 | /* | 58 | /* |
59 | ** check whether `t' is a mark | 59 | ** check whether `t' is a mark |
60 | */ | 60 | */ |
61 | #define is_T_MARK(t) (TAG_LCLMARK <= (t) && (t) <= TAG_CMARK) | 61 | #define is_T_MARK(t) ((t) == TAG_LCLMARK || (t) == TAG_CCLMARK) |
62 | 62 | ||
63 | 63 | ||
64 | typedef union { | 64 | typedef union { |
65 | lua_CFunction f; /* TAG_CPROTO, TAG_CMARK */ | 65 | struct TString *ts; /* TAG_STRING, TAG_USERDATA */ |
66 | Number n; /* TAG_NUMBER */ | 66 | struct Closure *cl; /* TAG_[CL]CLOSURE, TAG_[CL]CLMARK */ |
67 | struct TString *ts; /* TAG_STRING, TAG_USERDATA */ | 67 | struct Hash *a; /* TAG_TABLE */ |
68 | struct Proto *tf; /* TAG_LPROTO, TAG_LMARK */ | 68 | Number n; /* TAG_NUMBER */ |
69 | struct Closure *cl; /* TAG_[CL]CLOSURE, TAG_[CL]CLMARK */ | 69 | int i; /* TAG_LINE */ |
70 | struct Hash *a; /* TAG_TABLE */ | ||
71 | int i; /* TAG_LINE */ | ||
72 | } Value; | 70 | } Value; |
73 | 71 | ||
74 | 72 | ||
73 | /* Macros to access values */ | ||
74 | #define ttype(o) ((o)->ttype) | ||
75 | #define nvalue(o) ((o)->value.n) | ||
76 | #define svalue(o) ((o)->value.ts->str) | ||
77 | #define tsvalue(o) ((o)->value.ts) | ||
78 | #define clvalue(o) ((o)->value.cl) | ||
79 | #define avalue(o) ((o)->value.a) | ||
80 | |||
81 | |||
75 | typedef struct TObject { | 82 | typedef struct TObject { |
76 | lua_Type ttype; | 83 | lua_Type ttype; |
77 | Value value; | 84 | Value value; |
@@ -135,28 +142,18 @@ typedef struct LocVar { | |||
135 | } LocVar; | 142 | } LocVar; |
136 | 143 | ||
137 | 144 | ||
138 | |||
139 | /* Macros to access structure members */ | ||
140 | #define ttype(o) ((o)->ttype) | ||
141 | #define nvalue(o) ((o)->value.n) | ||
142 | #define svalue(o) ((o)->value.ts->str) | ||
143 | #define tsvalue(o) ((o)->value.ts) | ||
144 | #define clvalue(o) ((o)->value.cl) | ||
145 | #define avalue(o) ((o)->value.a) | ||
146 | #define fvalue(o) ((o)->value.f) | ||
147 | #define tfvalue(o) ((o)->value.tf) | ||
148 | |||
149 | #define protovalue(o) ((o)->value.cl->consts) | ||
150 | |||
151 | |||
152 | /* | 145 | /* |
153 | ** Closures | 146 | ** Closures |
154 | */ | 147 | */ |
155 | typedef struct Closure { | 148 | typedef struct Closure { |
156 | struct Closure *next; | 149 | struct Closure *next; |
157 | int marked; | 150 | int marked; |
158 | int nelems; /* not including the first one (always the prototype) */ | 151 | union { |
159 | TObject consts[1]; /* at least one for prototype */ | 152 | lua_CFunction c; /* C functions */ |
153 | struct Proto *l; /* Lua functions */ | ||
154 | } f; | ||
155 | int nelems; | ||
156 | TObject consts[1]; | ||
160 | } Closure; | 157 | } Closure; |
161 | 158 | ||
162 | 159 | ||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lparser.c,v 1.72 2000/03/24 12:17:53 roberto Exp roberto $ | 2 | ** $Id: lparser.c,v 1.73 2000/03/24 17:26:08 roberto Exp roberto $ |
3 | ** LL(1) Parser and code generator for Lua | 3 | ** LL(1) Parser and code generator for Lua |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -345,10 +345,6 @@ static void init_state (LexState *ls, FuncState *fs, TString *source) { | |||
345 | f->numparams = 0; /* default for main chunk */ | 345 | f->numparams = 0; /* default for main chunk */ |
346 | f->is_vararg = 0; /* default for main chunk */ | 346 | f->is_vararg = 0; /* default for main chunk */ |
347 | fs->nvars = (L->debug) ? 0 : -1; /* flag no debug information? */ | 347 | fs->nvars = (L->debug) ? 0 : -1; /* flag no debug information? */ |
348 | /* push function (to avoid GC) */ | ||
349 | tfvalue(L->top) = f; | ||
350 | ttype(L->top) = TAG_LPROTO; | ||
351 | incr_top; | ||
352 | } | 348 | } |
353 | 349 | ||
354 | 350 | ||
@@ -366,7 +362,6 @@ static void close_func (LexState *ls) { | |||
366 | luaM_reallocvector(L, f->locvars, fs->nvars, LocVar); | 362 | luaM_reallocvector(L, f->locvars, fs->nvars, LocVar); |
367 | } | 363 | } |
368 | ls->fs = fs->prev; | 364 | ls->fs = fs->prev; |
369 | L->top--; /* pop function */ | ||
370 | } | 365 | } |
371 | 366 | ||
372 | 367 | ||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lref.c,v 1.9 2000/03/10 18:37:44 roberto Exp roberto $ | 2 | ** $Id: lref.c,v 1.10 2000/03/27 20:10:21 roberto Exp roberto $ |
3 | ** reference mechanism | 3 | ** reference mechanism |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -88,9 +88,7 @@ static int ismarked (const TObject *o) { | |||
88 | return o->value.a->marked; | 88 | return o->value.a->marked; |
89 | case TAG_LCLOSURE: case TAG_CCLOSURE: | 89 | case TAG_LCLOSURE: case TAG_CCLOSURE: |
90 | return o->value.cl->marked; | 90 | return o->value.cl->marked; |
91 | case TAG_LPROTO: | 91 | default: /* number */ |
92 | return o->value.tf->marked; | ||
93 | default: /* number or cproto */ | ||
94 | return 1; | 92 | return 1; |
95 | } | 93 | } |
96 | } | 94 | } |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: ltable.c,v 1.36 2000/03/10 18:37:44 roberto Exp roberto $ | 2 | ** $Id: ltable.c,v 1.37 2000/03/27 20:10:21 roberto Exp roberto $ |
3 | ** Lua tables (hash) | 3 | ** Lua tables (hash) |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -52,12 +52,6 @@ Node *luaH_mainposition (const Hash *t, const TObject *key) { | |||
52 | case TAG_TABLE: | 52 | case TAG_TABLE: |
53 | h = IntPoint(L, avalue(key)); | 53 | h = IntPoint(L, avalue(key)); |
54 | break; | 54 | break; |
55 | case TAG_LPROTO: | ||
56 | h = IntPoint(L, tfvalue(key)); | ||
57 | break; | ||
58 | case TAG_CPROTO: | ||
59 | h = IntPoint(L, fvalue(key)); | ||
60 | break; | ||
61 | case TAG_LCLOSURE: case TAG_CCLOSURE: | 55 | case TAG_LCLOSURE: case TAG_CCLOSURE: |
62 | h = IntPoint(L, clvalue(key)); | 56 | h = IntPoint(L, clvalue(key)); |
63 | break; | 57 | break; |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: ltm.c,v 1.36 2000/03/27 20:08:02 roberto Exp roberto $ | 2 | ** $Id: ltm.c,v 1.37 2000/03/27 20:10:21 roberto Exp roberto $ |
3 | ** Tag methods | 3 | ** Tag methods |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -47,8 +47,8 @@ static const char luaT_validevents[NUM_TAGS][IM_N] = { | |||
47 | {1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1}, /* TAG_NUMBER */ | 47 | {1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1}, /* TAG_NUMBER */ |
48 | {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, /* TAG_STRING */ | 48 | {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, /* TAG_STRING */ |
49 | {0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1}, /* TAG_TABLE */ | 49 | {0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1}, /* TAG_TABLE */ |
50 | {1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0}, /* TAG_LPROTO */ | 50 | {1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0}, /* TAG_LCLOSURE */ |
51 | {1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0}, /* TAG_CPROTO */ | 51 | {1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0}, /* TAG_CCLOSURE */ |
52 | {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1} /* TAG_NIL */ | 52 | {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1} /* TAG_NIL */ |
53 | }; | 53 | }; |
54 | 54 | ||
@@ -105,19 +105,14 @@ int lua_copytagmethods (lua_State *L, int tagto, int tagfrom) { | |||
105 | 105 | ||
106 | 106 | ||
107 | int luaT_effectivetag (lua_State *L, const TObject *o) { | 107 | int luaT_effectivetag (lua_State *L, const TObject *o) { |
108 | static const int realtag[] = { /* ORDER LUA_T */ | 108 | lua_Type t = ttype(o); |
109 | TAG_USERDATA, TAG_NUMBER, TAG_STRING, TAG_TABLE, | 109 | switch (t) { |
110 | TAG_LPROTO, TAG_CPROTO, TAG_NIL, | ||
111 | TAG_LPROTO, TAG_CPROTO, /* TAG_LCLOSURE, TAG_CCLOSURE */ | ||
112 | }; | ||
113 | lua_Type t; | ||
114 | switch (t = ttype(o)) { | ||
115 | case TAG_USERDATA: { | 110 | case TAG_USERDATA: { |
116 | int tag = o->value.ts->u.d.tag; | 111 | int tag = o->value.ts->u.d.tag; |
117 | return (tag > L->last_tag) ? TAG_USERDATA : tag; /* deprecated test */ | 112 | return (tag > L->last_tag) ? TAG_USERDATA : tag; /* deprecated test */ |
118 | } | 113 | } |
119 | case TAG_TABLE: return o->value.a->htag; | 114 | case TAG_TABLE: return o->value.a->htag; |
120 | default: return realtag[t]; | 115 | default: return t; |
121 | } | 116 | } |
122 | } | 117 | } |
123 | 118 | ||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lvm.c,v 1.96 2000/03/17 13:09:12 roberto Exp roberto $ | 2 | ** $Id: lvm.c,v 1.97 2000/03/27 20:10:21 roberto Exp roberto $ |
3 | ** Lua virtual machine | 3 | ** Lua virtual machine |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -72,17 +72,27 @@ void luaV_setn (lua_State *L, Hash *t, int val) { | |||
72 | } | 72 | } |
73 | 73 | ||
74 | 74 | ||
75 | void luaV_closure (lua_State *L, int nelems) { | 75 | static Closure *luaV_closure (lua_State *L, lua_Type t, int nelems) { |
76 | if (nelems > 0) { | 76 | Closure *c = luaF_newclosure(L, nelems); |
77 | Closure *c = luaF_newclosure(L, nelems); | 77 | L->top -= nelems; |
78 | c->consts[0] = *(L->top-1); | 78 | while (nelems--) |
79 | L->top -= nelems; | 79 | c->consts[nelems] = *(L->top+nelems); |
80 | while (nelems--) | 80 | ttype(L->top) = t; |
81 | c->consts[nelems+1] = *(L->top-1+nelems); | 81 | clvalue(L->top) = c; |
82 | ttype(L->top-1) = (ttype(&c->consts[0]) == TAG_CPROTO) ? | 82 | incr_top; |
83 | TAG_CCLOSURE : TAG_LCLOSURE; | 83 | return c; |
84 | (L->top-1)->value.cl = c; | 84 | } |
85 | } | 85 | |
86 | |||
87 | void luaV_Cclosure (lua_State *L, lua_CFunction c, int nelems) { | ||
88 | Closure *cl = luaV_closure(L, TAG_CCLOSURE, nelems); | ||
89 | cl->f.c = c; | ||
90 | } | ||
91 | |||
92 | |||
93 | void luaV_Lclosure (lua_State *L, Proto *l, int nelems) { | ||
94 | Closure *cl = luaV_closure(L, TAG_LCLOSURE, nelems); | ||
95 | cl->f.l = l; | ||
86 | } | 96 | } |
87 | 97 | ||
88 | 98 | ||
@@ -317,13 +327,11 @@ static void adjust_varargs (lua_State *L, StkId base, int nfixargs) { | |||
317 | ** Executes the given Lua function. Parameters are between [base,top). | 327 | ** Executes the given Lua function. Parameters are between [base,top). |
318 | ** Returns n such that the the results are between [n,top). | 328 | ** Returns n such that the the results are between [n,top). |
319 | */ | 329 | */ |
320 | StkId luaV_execute (lua_State *L, const Closure *cl, const Proto *tf, | 330 | StkId luaV_execute (lua_State *L, const Closure *cl, register StkId base) { |
321 | register StkId base) { | 331 | const Proto *tf = cl->f.l; |
322 | register StkId top; /* keep top local, for performance */ | 332 | register StkId top; /* keep top local, for performance */ |
323 | register const Instruction *pc = tf->code; | 333 | register const Instruction *pc = tf->code; |
324 | TString **kstr = tf->kstr; | 334 | TString **kstr = tf->kstr; |
325 | if (L->callhook) | ||
326 | luaD_callHook(L, base-1, L->callhook, "call"); | ||
327 | luaD_checkstack(L, tf->maxstacksize+EXTRA_STACK); | 335 | luaD_checkstack(L, tf->maxstacksize+EXTRA_STACK); |
328 | if (tf->is_vararg) { /* varargs? */ | 336 | if (tf->is_vararg) { /* varargs? */ |
329 | adjust_varargs(L, base, tf->numparams); | 337 | adjust_varargs(L, base, tf->numparams); |
@@ -392,7 +400,7 @@ StkId luaV_execute (lua_State *L, const Closure *cl, const Proto *tf, | |||
392 | break; | 400 | break; |
393 | 401 | ||
394 | case OP_PUSHUPVALUE: | 402 | case OP_PUSHUPVALUE: |
395 | *top++ = cl->consts[GETARG_U(i)+1]; | 403 | *top++ = cl->consts[GETARG_U(i)]; |
396 | break; | 404 | break; |
397 | 405 | ||
398 | case OP_PUSHLOCAL: | 406 | case OP_PUSHLOCAL: |
@@ -604,11 +612,9 @@ StkId luaV_execute (lua_State *L, const Closure *cl, const Proto *tf, | |||
604 | break; | 612 | break; |
605 | 613 | ||
606 | case OP_CLOSURE: | 614 | case OP_CLOSURE: |
607 | ttype(top) = TAG_LPROTO; | 615 | L->top = top; |
608 | tfvalue(top) = tf->kproto[GETARG_A(i)]; | 616 | luaV_Lclosure(L, tf->kproto[GETARG_A(i)], GETARG_B(i)); |
609 | L->top = ++top; | 617 | top = L->top; |
610 | luaV_closure(L, GETARG_B(i)); | ||
611 | top -= GETARG_B(i); | ||
612 | luaC_checkGC(L); | 618 | luaC_checkGC(L); |
613 | break; | 619 | break; |
614 | 620 | ||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lvm.h,v 1.18 2000/03/09 00:19:22 roberto Exp roberto $ | 2 | ** $Id: lvm.h,v 1.19 2000/03/10 18:37:44 roberto Exp roberto $ |
3 | ** Lua virtual machine | 3 | ** Lua virtual machine |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -26,8 +26,9 @@ void luaV_settable (lua_State *L, StkId t, StkId top); | |||
26 | void luaV_rawsettable (lua_State *L, StkId t); | 26 | void luaV_rawsettable (lua_State *L, StkId t); |
27 | void luaV_getglobal (lua_State *L, GlobalVar *gv, StkId top); | 27 | void luaV_getglobal (lua_State *L, GlobalVar *gv, StkId top); |
28 | void luaV_setglobal (lua_State *L, GlobalVar *gv, StkId top); | 28 | void luaV_setglobal (lua_State *L, GlobalVar *gv, StkId top); |
29 | StkId luaV_execute (lua_State *L, const Closure *cl, const Proto *tf, StkId base); | 29 | StkId luaV_execute (lua_State *L, const Closure *cl, register StkId base); |
30 | void luaV_closure (lua_State *L, int nelems); | 30 | void luaV_Cclosure (lua_State *L, lua_CFunction c, int nelems); |
31 | void luaV_Lclosure (lua_State *L, Proto *l, int nelems); | ||
31 | int luaV_lessthan (lua_State *L, const TObject *l, const TObject *r, StkId top); | 32 | int luaV_lessthan (lua_State *L, const TObject *l, const TObject *r, StkId top); |
32 | 33 | ||
33 | #endif | 34 | #endif |