summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lapi.c81
-rw-r--r--lapi.h8
-rw-r--r--lbuiltin.c6
-rw-r--r--ldebug.c23
-rw-r--r--ldo.c71
-rw-r--r--lgc.c7
-rw-r--r--lobject.c28
-rw-r--r--lobject.h28
-rw-r--r--lparser.c6
-rw-r--r--lref.c11
-rw-r--r--ltable.c6
-rw-r--r--ltests.c13
-rw-r--r--ltm.c26
-rw-r--r--lundump.c4
-rw-r--r--lvm.c9
15 files changed, 180 insertions, 147 deletions
diff --git a/lapi.c b/lapi.c
index caeb6318..029f98e5 100644
--- a/lapi.c
+++ b/lapi.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lapi.c,v 1.63 1999/12/06 12:03:45 roberto Exp roberto $ 2** $Id: lapi.c,v 1.64 1999/12/14 18:31: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*/
@@ -30,19 +30,13 @@ const char lua_ident[] = "$Lua: " LUA_VERSION " " LUA_COPYRIGHT " $\n"
30 30
31 31
32 32
33lua_Type luaA_normalizedtype (const TObject *o) { 33const lua_Type luaA_normtype[] = { /* ORDER LUA_T */
34 int t = ttype(o); 34 LUA_T_USERDATA, LUA_T_NUMBER, LUA_T_STRING, LUA_T_ARRAY,
35 switch (t) { 35 LUA_T_LPROTO, LUA_T_CPROTO, LUA_T_NIL,
36 case LUA_T_PMARK: 36 LUA_T_LCLOSURE, LUA_T_CCLOSURE,
37 return LUA_T_PROTO; 37 LUA_T_LCLOSURE, LUA_T_CCLOSURE, /* LUA_T_LCLMARK, LUA_T_CCLMARK */
38 case LUA_T_CMARK: 38 LUA_T_LPROTO, LUA_T_CPROTO /* LUA_T_LMARK, LUA_T_CMARK */
39 return LUA_T_CPROTO; 39};
40 case LUA_T_CLMARK:
41 return LUA_T_CLOSURE;
42 default:
43 return t;
44 }
45}
46 40
47 41
48void luaA_setnormalized (TObject *d, const TObject *s) { 42void luaA_setnormalized (TObject *d, const TObject *s) {
@@ -52,7 +46,15 @@ void luaA_setnormalized (TObject *d, const TObject *s) {
52 46
53 47
54const TObject *luaA_protovalue (const TObject *o) { 48const TObject *luaA_protovalue (const TObject *o) {
55 return (luaA_normalizedtype(o) == LUA_T_CLOSURE) ? protovalue(o) : o; 49 switch (luaA_normalizedtype(o)) {
50 case LUA_T_CCLOSURE: case LUA_T_LCLOSURE:
51 return protovalue(o);
52 default:
53 LUA_ASSERT(L, luaA_normalizedtype(o) == LUA_T_LPROTO ||
54 luaA_normalizedtype(o) == LUA_T_CPROTO,
55 "invalid `function'");
56 return o;
57 }
56} 58}
57 59
58 60
@@ -228,26 +230,32 @@ int lua_isnumber (lua_State *L, lua_Object o) {
228} 230}
229 231
230int lua_isstring (lua_State *L, lua_Object o) { 232int lua_isstring (lua_State *L, lua_Object o) {
231 int t = lua_tag(L, o); 233 UNUSED(L);
232 return (t == LUA_T_STRING) || (t == LUA_T_NUMBER); 234 return (o != LUA_NOOBJECT && (ttype(o) == LUA_T_STRING ||
235 ttype(o) == LUA_T_NUMBER));
233} 236}
234 237
235int lua_isfunction (lua_State *L, lua_Object o) { 238int lua_isfunction (lua_State *L, lua_Object o) {
236 int t = lua_tag(L, o); 239 return *lua_type(L, o) == 'f';
237 return (t == LUA_T_PROTO) || (t == LUA_T_CPROTO);
238} 240}
239 241
240int lua_equal(lua_State *L, lua_Object o1, lua_Object o2) { 242int lua_equal(lua_State *L, lua_Object o1, lua_Object o2) {
241 UNUSED(L); 243 UNUSED(L);
242 if (o1 == LUA_NOOBJECT || o2 == LUA_NOOBJECT) return (o1 == o2); 244 if (o1 == LUA_NOOBJECT || o2 == LUA_NOOBJECT)
243 else return luaO_equalObj(o1, o2); 245 return (o1 == o2);
246 else {
247 TObject obj1, obj2;
248 luaA_setnormalized(&obj1, o1);
249 luaA_setnormalized(&obj2, o2);
250 return luaO_equalObj(&obj1, &obj2);
251 }
244} 252}
245 253
246 254
247double lua_getnumber (lua_State *L, lua_Object obj) { 255double lua_getnumber (lua_State *L, lua_Object obj) {
248 UNUSED(L); 256 UNUSED(L);
249 if (obj == LUA_NOOBJECT) return 0.0; 257 if (obj == LUA_NOOBJECT || tonumber(obj))
250 if (tonumber(obj)) return 0.0; 258 return 0.0;
251 else return (nvalue(obj)); 259 else return (nvalue(obj));
252} 260}
253 261
@@ -339,28 +347,11 @@ void lua_pushobject (lua_State *L, lua_Object o) {
339int lua_tag (lua_State *L, lua_Object o) { 347int lua_tag (lua_State *L, lua_Object o) {
340 UNUSED(L); 348 UNUSED(L);
341 if (o == LUA_NOOBJECT) 349 if (o == LUA_NOOBJECT)
342 return LUA_T_NIL; 350 return LUA_T_NIL;
343 else { 351 else if (ttype(o) == LUA_T_USERDATA) /* to allow `old' tags (deprecated) */
344 int t; 352 return o->value.ts->u.d.tag;
345 switch (t = ttype(o)) { 353 else
346 case LUA_T_USERDATA: 354 return luaT_effectivetag(o);
347 return o->value.ts->u.d.tag;
348 case LUA_T_ARRAY:
349 return o->value.a->htag;
350 case LUA_T_PMARK:
351 return LUA_T_PROTO;
352 case LUA_T_CMARK:
353 return LUA_T_CPROTO;
354 case LUA_T_CLOSURE: case LUA_T_CLMARK:
355 return o->value.cl->consts[0].ttype;
356#ifdef DEBUG
357 case LUA_T_LINE:
358 LUA_INTERNALERROR(L, "invalid type");
359#endif
360 default:
361 return t;
362 }
363 }
364} 355}
365 356
366 357
diff --git a/lapi.h b/lapi.h
index 6a69dd15..9dc630e9 100644
--- a/lapi.h
+++ b/lapi.h
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lapi.h,v 1.10 1999/12/02 16:24:45 roberto Exp roberto $ 2** $Id: lapi.h,v 1.11 1999/12/14 18:33:29 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*/
@@ -11,7 +11,11 @@
11#include "lobject.h" 11#include "lobject.h"
12 12
13 13
14lua_Type luaA_normalizedtype (const TObject *o); 14extern const lua_Type luaA_normtype[];
15
16#define luaA_normalizedtype(o) (luaA_normtype[-ttype(o)])
17
18
15void luaA_setnormalized (TObject *d, const TObject *s); 19void luaA_setnormalized (TObject *d, const TObject *s);
16void luaA_checkCparams (lua_State *L, int nParams); 20void luaA_checkCparams (lua_State *L, int nParams);
17const TObject *luaA_protovalue (const TObject *o); 21const TObject *luaA_protovalue (const TObject *o);
diff --git a/lbuiltin.c b/lbuiltin.c
index 48e8065b..bd8647e8 100644
--- a/lbuiltin.c
+++ b/lbuiltin.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lbuiltin.c,v 1.85 1999/12/14 18:42:57 roberto Exp roberto $ 2** $Id: lbuiltin.c,v 1.86 1999/12/20 13:10:38 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*/
@@ -377,10 +377,10 @@ void luaB_tostring (lua_State *L) {
377 case LUA_T_ARRAY: 377 case LUA_T_ARRAY:
378 sprintf(buff, "table: %p", o->value.a); 378 sprintf(buff, "table: %p", o->value.a);
379 break; 379 break;
380 case LUA_T_CLOSURE: 380 case LUA_T_LCLOSURE: case LUA_T_CCLOSURE:
381 sprintf(buff, "function: %p", o->value.cl); 381 sprintf(buff, "function: %p", o->value.cl);
382 break; 382 break;
383 case LUA_T_PROTO: 383 case LUA_T_LPROTO:
384 sprintf(buff, "function: %p", o->value.tf); 384 sprintf(buff, "function: %p", o->value.tf);
385 break; 385 break;
386 case LUA_T_CPROTO: 386 case LUA_T_CPROTO:
diff --git a/ldebug.c b/ldebug.c
index 88f06563..4b31f458 100644
--- a/ldebug.c
+++ b/ldebug.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: $ 2** $Id: ldebug.c,v 1.1 1999/12/14 18:31:20 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*/
@@ -42,10 +42,11 @@ int lua_setdebug (lua_State *L, int debug) {
42lua_Function lua_stackedfunction (lua_State *L, int level) { 42lua_Function lua_stackedfunction (lua_State *L, int level) {
43 int i; 43 int i;
44 for (i = (L->top-1)-L->stack; i>=0; i--) { 44 for (i = (L->top-1)-L->stack; i>=0; i--) {
45 int t = L->stack[i].ttype; 45 if (is_T_MARK(L->stack[i].ttype)) {
46 if (t == LUA_T_CLMARK || t == LUA_T_PMARK || t == LUA_T_CMARK) 46 if (level == 0)
47 if (level-- == 0)
48 return L->stack+i; 47 return L->stack+i;
48 level--;
49 }
49 } 50 }
50 return LUA_NOOBJECT; 51 return LUA_NOOBJECT;
51} 52}
@@ -53,8 +54,12 @@ lua_Function lua_stackedfunction (lua_State *L, int level) {
53 54
54int lua_nups (lua_State *L, lua_Function f) { 55int lua_nups (lua_State *L, lua_Function f) {
55 UNUSED(L); 56 UNUSED(L);
56 return (!f || luaA_normalizedtype(f) != LUA_T_CLOSURE) ? 0 : 57 switch (luaA_normalizedtype(f)) {
57 f->value.cl->nelems; 58 case LUA_T_LCLOSURE: case LUA_T_CCLOSURE:
59 return f->value.cl->nelems;
60 default:
61 return 0;
62 }
58} 63}
59 64
60 65
@@ -66,7 +71,7 @@ int lua_currentline (lua_State *L, lua_Function f) {
66lua_Object lua_getlocal (lua_State *L, lua_Function f, int local_number, 71lua_Object lua_getlocal (lua_State *L, lua_Function f, int local_number,
67 const char **name) { 72 const char **name) {
68 /* check whether `f' is a Lua function */ 73 /* check whether `f' is a Lua function */
69 if (lua_tag(L, f) != LUA_T_PROTO) 74 if (lua_tag(L, f) != LUA_T_LPROTO)
70 return LUA_NOOBJECT; 75 return LUA_NOOBJECT;
71 else { 76 else {
72 TProtoFunc *fp = luaA_protovalue(f)->value.tf; 77 TProtoFunc *fp = luaA_protovalue(f)->value.tf;
@@ -84,7 +89,7 @@ lua_Object lua_getlocal (lua_State *L, lua_Function f, int local_number,
84 89
85int lua_setlocal (lua_State *L, lua_Function f, int local_number) { 90int lua_setlocal (lua_State *L, lua_Function f, int local_number) {
86 /* check whether `f' is a Lua function */ 91 /* check whether `f' is a Lua function */
87 if (lua_tag(L, f) != LUA_T_PROTO) 92 if (lua_tag(L, f) != LUA_T_LPROTO)
88 return 0; 93 return 0;
89 else { 94 else {
90 TProtoFunc *fp = luaA_protovalue(f)->value.tf; 95 TProtoFunc *fp = luaA_protovalue(f)->value.tf;
@@ -110,7 +115,7 @@ void lua_funcinfo (lua_State *L, lua_Object func,
110 lua_error(L, "API error - `funcinfo' called with a non-function value"); 115 lua_error(L, "API error - `funcinfo' called with a non-function value");
111 else { 116 else {
112 const TObject *f = luaA_protovalue(func); 117 const TObject *f = luaA_protovalue(func);
113 if (luaA_normalizedtype(f) == LUA_T_PROTO) { 118 if (luaA_normalizedtype(f) == LUA_T_LPROTO) {
114 *source = tfvalue(f)->source->str; 119 *source = tfvalue(f)->source->str;
115 *linedefined = tfvalue(f)->lineDefined; 120 *linedefined = tfvalue(f)->lineDefined;
116 } 121 }
diff --git a/ldo.c b/ldo.c
index 60b9b354..3fde714b 100644
--- a/ldo.c
+++ b/ldo.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: ldo.c,v 1.58 1999/12/06 12:03:45 roberto Exp roberto $ 2** $Id: ldo.c,v 1.59 1999/12/21 18:04:41 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*/
@@ -93,7 +93,8 @@ void luaD_adjusttop (lua_State *L, StkId base, int extra) {
93** Open a hole inside the stack at `pos' 93** Open a hole inside the stack at `pos'
94*/ 94*/
95void luaD_openstack (lua_State *L, StkId pos) { 95void luaD_openstack (lua_State *L, StkId pos) {
96 luaO_memup(pos+1, pos, (L->top-pos)*sizeof(TObject)); 96 int i = L->top-pos;
97 while (i--) pos[i+1] = pos[i];
97 incr_top; 98 incr_top;
98} 99}
99 100
@@ -122,15 +123,18 @@ static void luaD_callHook (lua_State *L, StkId func, lua_CHFunction callhook,
122 if (isreturn) 123 if (isreturn)
123 callhook(L, LUA_NOOBJECT, "(return)", 0); 124 callhook(L, LUA_NOOBJECT, "(return)", 0);
124 else { 125 else {
125 if (ttype(func) == LUA_T_PROTO) 126 switch (ttype(func)) {
126 callhook(L, func, tfvalue(func)->source->str, 127 case LUA_T_LPROTO:
127 tfvalue(func)->lineDefined); 128 callhook(L, func, tfvalue(func)->source->str,
128 else if (ttype(func) == LUA_T_CLOSURE && 129 tfvalue(func)->lineDefined);
129 ttype(clvalue(func)->consts) == LUA_T_PROTO) 130 break;
130 callhook(L, func, tfvalue(protovalue(func))->source->str, 131 case LUA_T_LCLOSURE:
131 tfvalue(protovalue(func))->lineDefined); 132 callhook(L, func, tfvalue(protovalue(func))->source->str,
132 else 133 tfvalue(protovalue(func))->lineDefined);
133 callhook(L, func, "(C)", -1); 134 break;
135 default:
136 callhook(L, func, "(C)", -1);
137 }
134 } 138 }
135 L->allowhooks = 1; 139 L->allowhooks = 1;
136 L->top = old_top; 140 L->top = old_top;
@@ -158,16 +162,16 @@ static StkId callC (lua_State *L, lua_CFunction f, StkId base) {
158} 162}
159 163
160 164
161static StkId callCclosure (lua_State *L, const struct Closure *cl, 165static StkId callCclosure (lua_State *L, const struct Closure *cl, StkId base) {
162 lua_CFunction f, StkId base) {
163 int nup = cl->nelems; /* number of upvalues */ 166 int nup = cl->nelems; /* number of upvalues */
167 int n = L->top-base; /* number of arguments (to move up) */
164 luaD_checkstack(L, nup); 168 luaD_checkstack(L, nup);
165 /* open space for upvalues as extra arguments */ 169 /* open space for upvalues as extra arguments */
166 luaO_memup(base+nup, base, (L->top-base)*sizeof(TObject)); 170 while (n--) *(base+nup+n) = *(base+n);
167 /* copy upvalues into stack */
168 memcpy(base, cl->consts+1, nup*sizeof(TObject));
169 L->top += nup; 171 L->top += nup;
170 return callC(L, f, base); 172 /* copy upvalues into stack */
173 while (nup--) *(base+nup) = cl->consts[nup+1];
174 return callC(L, fvalue(cl->consts), base);
171} 175}
172 176
173 177
@@ -197,17 +201,20 @@ void luaD_call (lua_State *L, StkId func, int nResults) {
197 ttype(func) = LUA_T_CMARK; 201 ttype(func) = LUA_T_CMARK;
198 firstResult = callC(L, fvalue(func), func+1); 202 firstResult = callC(L, fvalue(func), func+1);
199 break; 203 break;
200 case LUA_T_PROTO: 204 case LUA_T_LPROTO:
201 ttype(func) = LUA_T_PMARK; 205 ttype(func) = LUA_T_LMARK;
202 firstResult = luaV_execute(L, NULL, tfvalue(func), func+1); 206 firstResult = luaV_execute(L, NULL, tfvalue(func), func+1);
203 break; 207 break;
204 case LUA_T_CLOSURE: { 208 case LUA_T_LCLOSURE: {
205 Closure *c = clvalue(func); 209 Closure *c = clvalue(func);
206 TObject *proto = c->consts; 210 ttype(func) = LUA_T_LCLMARK;
207 ttype(func) = LUA_T_CLMARK; 211 firstResult = luaV_execute(L, c, tfvalue(c->consts), func+1);
208 firstResult = (ttype(proto) == LUA_T_CPROTO) ? 212 break;
209 callCclosure(L, c, fvalue(proto), func+1) : 213 }
210 luaV_execute(L, c, tfvalue(proto), func+1); 214 case LUA_T_CCLOSURE: {
215 Closure *c = clvalue(func);
216 ttype(func) = LUA_T_CCLMARK;
217 firstResult = callCclosure(L, c, func+1);
211 break; 218 break;
212 } 219 }
213 default: { /* `func' is not a function; check the `function' tag method */ 220 default: { /* `func' is not a function; check the `function' tag method */
@@ -226,16 +233,18 @@ void luaD_call (lua_State *L, StkId func, int nResults) {
226 nResults = L->top - firstResult; 233 nResults = L->top - firstResult;
227 else 234 else
228 luaD_adjusttop(L, firstResult, nResults); 235 luaD_adjusttop(L, firstResult, nResults);
229 /* move results to func (to erase parameters and function) */ 236 /* move results to `func' (to erase parameters and function) */
230 luaO_memdown(func, firstResult, nResults*sizeof(TObject)); 237 while (nResults) {
231 L->top = func+nResults; 238 *func++ = *(L->top - nResults);
239 nResults--;
240 }
241 L->top = func;
232} 242}
233 243
234 244
235static void message (lua_State *L, const char *s) { 245static void message (lua_State *L, const char *s) {
236 const TObject *em = &(luaS_assertglobalbyname(L, "_ERRORMESSAGE")->value); 246 const TObject *em = &(luaS_assertglobalbyname(L, "_ERRORMESSAGE")->value);
237 if (ttype(em) == LUA_T_PROTO || ttype(em) == LUA_T_CPROTO || 247 if (*luaO_typename(em) == 'f') {
238 ttype(em) == LUA_T_CLOSURE) {
239 *L->top = *em; 248 *L->top = *em;
240 incr_top; 249 incr_top;
241 lua_pushstring(L, s); 250 lua_pushstring(L, s);
@@ -313,7 +322,7 @@ static int protectedparser (lua_State *L, ZIO *z, int bin) {
313 L->errorJmp = oldErr; 322 L->errorJmp = oldErr;
314 if (status) return 1; /* error code */ 323 if (status) return 1; /* error code */
315 if (tf == NULL) return 2; /* `natural' end */ 324 if (tf == NULL) return 2; /* `natural' end */
316 L->top->ttype = LUA_T_PROTO; /* push new function on the stack */ 325 L->top->ttype = LUA_T_LPROTO; /* push new function on the stack */
317 L->top->value.tf = tf; 326 L->top->value.tf = tf;
318 incr_top; 327 incr_top;
319 return 0; 328 return 0;
diff --git a/lgc.c b/lgc.c
index 2e9aa590..c119c29e 100644
--- a/lgc.c
+++ b/lgc.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lgc.c,v 1.36 1999/12/14 18:31:20 roberto Exp roberto $ 2** $Id: lgc.c,v 1.37 1999/12/21 18:04:41 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*/
@@ -100,10 +100,11 @@ static int markobject (lua_State *L, TObject *o) {
100 case LUA_T_ARRAY: 100 case LUA_T_ARRAY:
101 hashmark(L, avalue(o)); 101 hashmark(L, avalue(o));
102 break; 102 break;
103 case LUA_T_CLOSURE: case LUA_T_CLMARK: 103 case LUA_T_LCLOSURE: case LUA_T_LCLMARK:
104 case LUA_T_CCLOSURE: case LUA_T_CCLMARK:
104 closuremark(L, o->value.cl); 105 closuremark(L, o->value.cl);
105 break; 106 break;
106 case LUA_T_PROTO: case LUA_T_PMARK: 107 case LUA_T_LPROTO: case LUA_T_LMARK:
107 protomark(L, o->value.tf); 108 protomark(L, o->value.tf);
108 break; 109 break;
109 default: break; /* numbers, cprotos, etc */ 110 default: break; /* numbers, cprotos, etc */
diff --git a/lobject.c b/lobject.c
index b8b9247e..e55d9694 100644
--- a/lobject.c
+++ b/lobject.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lobject.c,v 1.26 1999/11/26 18:59:20 roberto Exp roberto $ 2** $Id: lobject.c,v 1.27 1999/12/14 18:31:20 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*/
@@ -14,8 +14,9 @@
14 14
15 15
16const char *const luaO_typenames[] = { /* ORDER LUA_T */ 16const char *const luaO_typenames[] = { /* ORDER LUA_T */
17 "userdata", "number", "string", "table", "function", "function", 17 "userdata", "number", "string", "table", "function", "function", "nil",
18 "nil", "function", "mark", "mark", "mark", "line", NULL 18 "function", "function", "function", "function", "function", "function",
19 "line", NULL
19}; 20};
20 21
21 22
@@ -34,13 +35,20 @@ unsigned long luaO_power2 (unsigned long n) {
34 35
35int luaO_equalval (const TObject *t1, const TObject *t2) { 36int luaO_equalval (const TObject *t1, const TObject *t2) {
36 switch (ttype(t1)) { 37 switch (ttype(t1)) {
37 case LUA_T_NIL: return 1; 38 case LUA_T_NIL:
38 case LUA_T_NUMBER: return nvalue(t1) == nvalue(t2); 39 return 1;
39 case LUA_T_STRING: case LUA_T_USERDATA: return svalue(t1) == svalue(t2); 40 case LUA_T_NUMBER:
40 case LUA_T_ARRAY: return avalue(t1) == avalue(t2); 41 return nvalue(t1) == nvalue(t2);
41 case LUA_T_PROTO: return tfvalue(t1) == tfvalue(t2); 42 case LUA_T_STRING: case LUA_T_USERDATA:
42 case LUA_T_CPROTO: return fvalue(t1) == fvalue(t2); 43 return svalue(t1) == svalue(t2);
43 case LUA_T_CLOSURE: return t1->value.cl == t2->value.cl; 44 case LUA_T_ARRAY:
45 return avalue(t1) == avalue(t2);
46 case LUA_T_LPROTO:
47 return tfvalue(t1) == tfvalue(t2);
48 case LUA_T_CPROTO:
49 return fvalue(t1) == fvalue(t2);
50 case LUA_T_CCLOSURE: case LUA_T_LCLOSURE:
51 return t1->value.cl == t2->value.cl;
44 default: 52 default:
45 LUA_INTERNALERROR(L, "invalid type"); 53 LUA_INTERNALERROR(L, "invalid type");
46 return 0; /* UNREACHABLE */ 54 return 0; /* UNREACHABLE */
diff --git a/lobject.h b/lobject.h
index 8c6b63f1..8f63a9e3 100644
--- a/lobject.h
+++ b/lobject.h
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lobject.h,v 1.39 1999/12/02 16:24:45 roberto Exp roberto $ 2** $Id: lobject.h,v 1.40 1999/12/14 18:33:29 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*/
@@ -69,25 +69,33 @@ typedef enum {
69 LUA_T_NUMBER = -1, /* fixed tag for numbers */ 69 LUA_T_NUMBER = -1, /* fixed tag for numbers */
70 LUA_T_STRING = -2, /* fixed tag for strings */ 70 LUA_T_STRING = -2, /* fixed tag for strings */
71 LUA_T_ARRAY = -3, /* tag default for tables (or arrays) */ 71 LUA_T_ARRAY = -3, /* tag default for tables (or arrays) */
72 LUA_T_PROTO = -4, /* fixed tag for functions */ 72 LUA_T_LPROTO = -4, /* fixed tag for Lua functions */
73 LUA_T_CPROTO = -5, /* fixed tag for Cfunctions */ 73 LUA_T_CPROTO = -5, /* fixed tag for C functions */
74 LUA_T_NIL = -6, /* last "pre-defined" tag */ 74 LUA_T_NIL = -6, /* last "pre-defined" tag */
75 LUA_T_CLOSURE = -7, 75 LUA_T_LCLOSURE = -7, /* Lua closure */
76 LUA_T_CLMARK = -8, /* mark for closures */ 76 LUA_T_CCLOSURE = -8, /* C closure */
77 LUA_T_PMARK = -9, /* mark for Lua prototypes */ 77 LUA_T_LCLMARK = -9 ,/* mark for Lua closures */
78 LUA_T_CMARK = -10, /* mark for C prototypes */ 78 LUA_T_CCLMARK = -10,/* mark for C closures */
79 LUA_T_LINE = -11 79 LUA_T_LMARK = -11, /* mark for Lua prototypes */
80 LUA_T_CMARK = -12, /* mark for C prototypes */
81 LUA_T_LINE = -13
80} lua_Type; 82} lua_Type;
81 83
82#define NUM_TAGS 7 84#define NUM_TAGS 7
83 85
86/*
87** chech whether t is a mark; ttypes are negative numbers, so the
88** comparisons look reversed. (ORDER LUA_T)
89*/
90#define is_T_MARK(t) (LUA_T_CMARK <= (t) && (t) <= LUA_T_LCLMARK)
91
84 92
85typedef union { 93typedef union {
86 lua_CFunction f; /* LUA_T_CPROTO, LUA_T_CMARK */ 94 lua_CFunction f; /* LUA_T_CPROTO, LUA_T_CMARK */
87 real n; /* LUA_T_NUMBER */ 95 real n; /* LUA_T_NUMBER */
88 struct TaggedString *ts; /* LUA_T_STRING, LUA_T_USERDATA */ 96 struct TaggedString *ts; /* LUA_T_STRING, LUA_T_USERDATA */
89 struct TProtoFunc *tf; /* LUA_T_PROTO, LUA_T_PMARK */ 97 struct TProtoFunc *tf; /* LUA_T_LPROTO, LUA_T_LMARK */
90 struct Closure *cl; /* LUA_T_CLOSURE, LUA_T_CLMARK */ 98 struct Closure *cl; /* LUA_T_[CL]CLOSURE, LUA_T_[CL]CLMARK */
91 struct Hash *a; /* LUA_T_ARRAY */ 99 struct Hash *a; /* LUA_T_ARRAY */
92 int i; /* LUA_T_LINE */ 100 int i; /* LUA_T_LINE */
93} Value; 101} Value;
diff --git a/lparser.c b/lparser.c
index fb93c794..4229ddd6 100644
--- a/lparser.c
+++ b/lparser.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lparser.c,v 1.48 1999/12/21 17:31:28 roberto Exp roberto $ 2** $Id: lparser.c,v 1.49 1999/12/22 16:58:36 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*/
@@ -547,7 +547,7 @@ static void func_onstack (LexState *ls, FuncState *func) {
547 FuncState *fs = ls->fs; 547 FuncState *fs = ls->fs;
548 int i; 548 int i;
549 int c = next_constant(ls, fs->f); 549 int c = next_constant(ls, fs->f);
550 ttype(&fs->f->consts[c]) = LUA_T_PROTO; 550 ttype(&fs->f->consts[c]) = LUA_T_LPROTO;
551 fs->f->consts[c].value.tf = func->f; 551 fs->f->consts[c].value.tf = func->f;
552 if (func->nupvalues == 0) 552 if (func->nupvalues == 0)
553 code_constant(ls, c); 553 code_constant(ls, c);
@@ -580,7 +580,7 @@ static void init_state (LexState *ls, FuncState *fs, TaggedString *source) {
580 code_byte(ls, 0); /* to be filled with arg information */ 580 code_byte(ls, 0); /* to be filled with arg information */
581 /* push function (to avoid GC) */ 581 /* push function (to avoid GC) */
582 tfvalue(L->top) = f; 582 tfvalue(L->top) = f;
583 ttype(L->top) = LUA_T_PROTO; 583 ttype(L->top) = LUA_T_LPROTO;
584 incr_top; 584 incr_top;
585} 585}
586 586
diff --git a/lref.c b/lref.c
index c2e90d38..2b24ecd3 100644
--- a/lref.c
+++ b/lref.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lref.c,v 1.3 1999/11/22 13:12:07 roberto Exp roberto $ 2** $Id: lref.c,v 1.4 1999/12/14 18:31:20 roberto Exp roberto $
3** REF mechanism 3** REF mechanism
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -85,15 +85,10 @@ static int ismarked (const TObject *o) {
85 return o->value.ts->marked; 85 return o->value.ts->marked;
86 case LUA_T_ARRAY: 86 case LUA_T_ARRAY:
87 return o->value.a->marked; 87 return o->value.a->marked;
88 case LUA_T_CLOSURE: 88 case LUA_T_LCLOSURE: case LUA_T_CCLOSURE:
89 return o->value.cl->marked; 89 return o->value.cl->marked;
90 case LUA_T_PROTO: 90 case LUA_T_LPROTO:
91 return o->value.tf->marked; 91 return o->value.tf->marked;
92#ifdef DEBUG
93 case LUA_T_LINE: case LUA_T_CLMARK:
94 case LUA_T_CMARK: case LUA_T_PMARK:
95 LUA_INTERNALERROR(L, "invalid type");
96#endif
97 default: /* number or cproto */ 92 default: /* number or cproto */
98 return 1; 93 return 1;
99 } 94 }
diff --git a/ltable.c b/ltable.c
index c6f67fd5..59adf0d9 100644
--- a/ltable.c
+++ b/ltable.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: ltable.c,v 1.31 1999/11/26 18:59:20 roberto Exp roberto $ 2** $Id: ltable.c,v 1.32 1999/12/07 12:05:34 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,13 +52,13 @@ Node *luaH_mainposition (const Hash *t, const TObject *key) {
52 case LUA_T_ARRAY: 52 case LUA_T_ARRAY:
53 h = IntPoint(L, avalue(key)); 53 h = IntPoint(L, avalue(key));
54 break; 54 break;
55 case LUA_T_PROTO: 55 case LUA_T_LPROTO:
56 h = IntPoint(L, tfvalue(key)); 56 h = IntPoint(L, tfvalue(key));
57 break; 57 break;
58 case LUA_T_CPROTO: 58 case LUA_T_CPROTO:
59 h = IntPoint(L, fvalue(key)); 59 h = IntPoint(L, fvalue(key));
60 break; 60 break;
61 case LUA_T_CLOSURE: 61 case LUA_T_LCLOSURE: case LUA_T_CCLOSURE:
62 h = IntPoint(L, clvalue(key)); 62 h = IntPoint(L, clvalue(key));
63 break; 63 break;
64 default: 64 default:
diff --git a/ltests.c b/ltests.c
index 547d5c8b..bb7791f4 100644
--- a/ltests.c
+++ b/ltests.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lbuiltin.c,v 1.83 1999/12/07 12:05:34 roberto Exp $ 2** $Id: ltests.c,v 1.1 1999/12/14 18:31:20 roberto Exp roberto $
3** Internal Module for Debugging of the Lua Implementation 3** Internal Module for Debugging of the Lua Implementation
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -17,6 +17,7 @@
17#include "lstring.h" 17#include "lstring.h"
18#include "ltable.h" 18#include "ltable.h"
19#include "lua.h" 19#include "lua.h"
20#include "luadebug.h"
20 21
21 22
22void luaB_opentests (lua_State *L); 23void luaB_opentests (lua_State *L);
@@ -195,6 +196,12 @@ static void testC (lua_State *L) {
195 else if EQ("rawsettable") { 196 else if EQ("rawsettable") {
196 lua_rawsettable(L); 197 lua_rawsettable(L);
197 } 198 }
199 else if EQ("tag") {
200 lua_pushnumber(L, lua_tag(L, reg[getreg(L, &pc)]));
201 }
202 else if EQ("type") {
203 lua_pushstring(L, lua_type(L, reg[getreg(L, &pc)]));
204 }
198 else if EQ("nextvar") { 205 else if EQ("nextvar") {
199 lua_pushstring(L, lua_nextvar(L, lua_getstring(L, reg[getreg(L, &pc)]))); 206 lua_pushstring(L, lua_nextvar(L, lua_getstring(L, reg[getreg(L, &pc)])));
200 } 207 }
@@ -223,6 +230,10 @@ static void testC (lua_State *L) {
223 int n = getreg(L, &pc); 230 int n = getreg(L, &pc);
224 lua_settagmethod(L, (int)lua_getnumber(L, reg[n]), getname(&pc)); 231 lua_settagmethod(L, (int)lua_getnumber(L, reg[n]), getname(&pc));
225 } 232 }
233 else if EQ("getfunc") {
234 int n = getreg(L, &pc);
235 reg[n] = lua_stackedfunction(L, getnum(&pc));
236 }
226 else if EQ("beginblock") { 237 else if EQ("beginblock") {
227 lua_beginblock(L); 238 lua_beginblock(L);
228 } 239 }
diff --git a/ltm.c b/ltm.c
index 63d9f578..615cdfe4 100644
--- a/ltm.c
+++ b/ltm.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: ltm.c,v 1.28 1999/10/04 17:51:04 roberto Exp roberto $ 2** $Id: ltm.c,v 1.29 1999/11/22 13:12:07 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*/
@@ -42,7 +42,7 @@ static const char luaT_validevents[NUM_TAGS][IM_N] = {
42{1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1}, /* LUA_T_NUMBER */ 42{1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1}, /* LUA_T_NUMBER */
43{1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, /* LUA_T_STRING */ 43{1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, /* LUA_T_STRING */
44{0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1}, /* LUA_T_ARRAY */ 44{0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1}, /* LUA_T_ARRAY */
45{1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0}, /* LUA_T_PROTO */ 45{1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0}, /* LUA_T_LPROTO */
46{1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0}, /* LUA_T_CPROTO */ 46{1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0}, /* LUA_T_CPROTO */
47{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1} /* LUA_T_NIL */ 47{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1} /* LUA_T_NIL */
48}; 48};
@@ -104,23 +104,21 @@ int lua_copytagmethods (lua_State *L, int tagto, int tagfrom) {
104 104
105 105
106int luaT_effectivetag (const TObject *o) { 106int luaT_effectivetag (const TObject *o) {
107 static const int realtag[] = { /* ORDER LUA_T */
108 LUA_T_USERDATA, LUA_T_NUMBER, LUA_T_STRING, LUA_T_ARRAY,
109 LUA_T_LPROTO, LUA_T_CPROTO, LUA_T_NIL,
110 LUA_T_LPROTO, LUA_T_CPROTO, /* LUA_T_LCLOSURE, LUA_T_CCLOSURE */
111 LUA_T_LPROTO, LUA_T_CPROTO, /* LUA_T_LCLMARK, LUA_T_CCLMARK */
112 LUA_T_LPROTO, LUA_T_CPROTO /* LUA_T_LMARK, LUA_T_CMARK */
113 };
107 int t; 114 int t;
108 switch (t = ttype(o)) { 115 switch (t = ttype(o)) {
109 case LUA_T_ARRAY:
110 return o->value.a->htag;
111 case LUA_T_USERDATA: { 116 case LUA_T_USERDATA: {
112 int tag = o->value.ts->u.d.tag; 117 int tag = o->value.ts->u.d.tag;
113 return (tag >= 0) ? LUA_T_USERDATA : tag; 118 return (tag >= 0) ? LUA_T_USERDATA : tag; /* deprecated test */
114 } 119 }
115 case LUA_T_CLOSURE: 120 case LUA_T_ARRAY: return o->value.a->htag;
116 return o->value.cl->consts[0].ttype; 121 default: return realtag[-t];
117#ifdef DEBUG
118 case LUA_T_PMARK: case LUA_T_CMARK:
119 case LUA_T_CLMARK: case LUA_T_LINE:
120 LUA_INTERNALERROR(L, "invalid type");
121#endif
122 default:
123 return t;
124 } 122 }
125} 123}
126 124
diff --git a/lundump.c b/lundump.c
index cc500eab..01da4afb 100644
--- a/lundump.c
+++ b/lundump.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lundump.c,v 1.24 1999/12/02 18:45:03 lhf Exp $ 2** $Id: lundump.c,v 1.16 1999/12/02 19:11:51 roberto Exp roberto $
3** load bytecodes from files 3** load bytecodes from files
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -135,7 +135,7 @@ static void LoadConstants (lua_State* L, TProtoFunc* tf, ZIO* Z, int native)
135 case LUA_T_STRING: 135 case LUA_T_STRING:
136 tsvalue(o)=LoadTString(L,Z); 136 tsvalue(o)=LoadTString(L,Z);
137 break; 137 break;
138 case LUA_T_PROTO: 138 case LUA_T_LPROTO:
139 tfvalue(o)=LoadFunction(L,Z,native); 139 tfvalue(o)=LoadFunction(L,Z,native);
140 break; 140 break;
141 case LUA_T_NIL: 141 case LUA_T_NIL:
diff --git a/lvm.c b/lvm.c
index 12afff68..d185b32b 100644
--- a/lvm.c
+++ b/lvm.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lvm.c,v 1.73 1999/12/14 18:31:20 roberto Exp roberto $ 2** $Id: lvm.c,v 1.74 1999/12/21 18:04:41 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*/
@@ -86,8 +86,10 @@ void luaV_closure (lua_State *L, int nelems) {
86 Closure *c = luaF_newclosure(L, nelems); 86 Closure *c = luaF_newclosure(L, nelems);
87 c->consts[0] = *(L->top-1); 87 c->consts[0] = *(L->top-1);
88 L->top -= nelems; 88 L->top -= nelems;
89 memcpy(&c->consts[1], L->top-1, nelems*sizeof(TObject)); 89 while (nelems--)
90 ttype(L->top-1) = LUA_T_CLOSURE; 90 c->consts[nelems+1] = *(L->top-1+nelems);
91 ttype(L->top-1) = (ttype(&c->consts[0]) == LUA_T_CPROTO) ?
92 LUA_T_CCLOSURE : LUA_T_LCLOSURE;
91 (L->top-1)->value.cl = c; 93 (L->top-1)->value.cl = c;
92 } 94 }
93} 95}
@@ -577,6 +579,7 @@ StkId luaV_execute (lua_State *L, const Closure *cl, const TProtoFunc *tf,
577 *top++ = consts[aux]; 579 *top++ = consts[aux];
578 L->top = top; 580 L->top = top;
579 aux = *pc++; /* number of upvalues */ 581 aux = *pc++; /* number of upvalues */
582 LUA_ASSERT(L, aux>0, "closure with no upvalues");
580 luaV_closure(L, aux); 583 luaV_closure(L, aux);
581 luaC_checkGC(L); 584 luaC_checkGC(L);
582 top -= aux; 585 top -= aux;