diff options
-rw-r--r-- | lapi.c | 179 | ||||
-rw-r--r-- | lbuiltin.c | 29 | ||||
-rw-r--r-- | ldo.c | 170 | ||||
-rw-r--r-- | ldo.h | 32 | ||||
-rw-r--r-- | lfunc.c | 18 | ||||
-rw-r--r-- | lfunc.h | 5 | ||||
-rw-r--r-- | lgc.c | 74 | ||||
-rw-r--r-- | lgc.h | 4 | ||||
-rw-r--r-- | liolib.c | 37 | ||||
-rw-r--r-- | llex.c | 372 | ||||
-rw-r--r-- | llex.h | 32 | ||||
-rw-r--r-- | lmem.c | 18 | ||||
-rw-r--r-- | lobject.c | 5 | ||||
-rw-r--r-- | lobject.h | 3 | ||||
-rw-r--r-- | lstring.c | 42 | ||||
-rw-r--r-- | lstring.h | 4 | ||||
-rw-r--r-- | ltable.c | 14 | ||||
-rw-r--r-- | ltable.h | 5 | ||||
-rw-r--r-- | ltm.c | 38 | ||||
-rw-r--r-- | ltm.h | 9 | ||||
-rw-r--r-- | lua.c | 3 | ||||
-rw-r--r-- | lua.h | 4 | ||||
-rw-r--r-- | lua.stx | 245 | ||||
-rw-r--r-- | lvm.c | 224 | ||||
-rw-r--r-- | makefile | 43 |
25 files changed, 781 insertions, 828 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lapi.c,v 1.3 1997/10/24 17:17:24 roberto Exp roberto $ | 2 | ** $Id: lapi.c,v 1.4 1997/11/04 15:27:53 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 | */ |
@@ -10,13 +10,12 @@ | |||
10 | 10 | ||
11 | #include "lapi.h" | 11 | #include "lapi.h" |
12 | #include "lauxlib.h" | 12 | #include "lauxlib.h" |
13 | #include "lbuiltin.h" | ||
14 | #include "ldo.h" | 13 | #include "ldo.h" |
15 | #include "lfunc.h" | 14 | #include "lfunc.h" |
16 | #include "lgc.h" | 15 | #include "lgc.h" |
17 | #include "llex.h" | ||
18 | #include "lmem.h" | 16 | #include "lmem.h" |
19 | #include "lobject.h" | 17 | #include "lobject.h" |
18 | #include "lstate.h" | ||
20 | #include "lstring.h" | 19 | #include "lstring.h" |
21 | #include "ltable.h" | 20 | #include "ltable.h" |
22 | #include "ltm.h" | 21 | #include "ltm.h" |
@@ -38,41 +37,41 @@ TObject *luaA_Address (lua_Object o) | |||
38 | 37 | ||
39 | void luaA_packresults (void) | 38 | void luaA_packresults (void) |
40 | { | 39 | { |
41 | luaV_pack(luaD_Cstack.lua2C, luaD_Cstack.num, luaD_stack.top); | 40 | luaV_pack(L->Cstack.lua2C, L->Cstack.num, L->stack.top); |
42 | incr_top; | 41 | incr_top; |
43 | } | 42 | } |
44 | 43 | ||
45 | 44 | ||
46 | int luaA_passresults (void) | 45 | int luaA_passresults (void) |
47 | { | 46 | { |
48 | luaD_checkstack(luaD_Cstack.num); | 47 | luaD_checkstack(L->Cstack.num); |
49 | memcpy(luaD_stack.top, luaD_Cstack.lua2C+luaD_stack.stack, | 48 | memcpy(L->stack.top, L->Cstack.lua2C+L->stack.stack, |
50 | luaD_Cstack.num*sizeof(TObject)); | 49 | L->Cstack.num*sizeof(TObject)); |
51 | luaD_stack.top += luaD_Cstack.num; | 50 | L->stack.top += L->Cstack.num; |
52 | return luaD_Cstack.num; | 51 | return L->Cstack.num; |
53 | } | 52 | } |
54 | 53 | ||
55 | 54 | ||
56 | static void checkCparams (int nParams) | 55 | static void checkCparams (int nParams) |
57 | { | 56 | { |
58 | if (luaD_stack.top-luaD_stack.stack < luaD_Cstack.base+nParams) | 57 | if (L->stack.top-L->stack.stack < L->Cstack.base+nParams) |
59 | lua_error("API error - wrong number of arguments in C2lua stack"); | 58 | lua_error("API error - wrong number of arguments in C2lua stack"); |
60 | } | 59 | } |
61 | 60 | ||
62 | 61 | ||
63 | static lua_Object put_luaObject (TObject *o) | 62 | static lua_Object put_luaObject (TObject *o) |
64 | { | 63 | { |
65 | luaD_openstack((luaD_stack.top-luaD_stack.stack)-luaD_Cstack.base); | 64 | luaD_openstack((L->stack.top-L->stack.stack)-L->Cstack.base); |
66 | luaD_stack.stack[luaD_Cstack.base++] = *o; | 65 | L->stack.stack[L->Cstack.base++] = *o; |
67 | return luaD_Cstack.base; /* this is +1 real position (see Ref) */ | 66 | return L->Cstack.base; /* this is +1 real position (see Ref) */ |
68 | } | 67 | } |
69 | 68 | ||
70 | 69 | ||
71 | static lua_Object put_luaObjectonTop (void) | 70 | static lua_Object put_luaObjectonTop (void) |
72 | { | 71 | { |
73 | luaD_openstack((luaD_stack.top-luaD_stack.stack)-luaD_Cstack.base); | 72 | luaD_openstack((L->stack.top-L->stack.stack)-L->Cstack.base); |
74 | luaD_stack.stack[luaD_Cstack.base++] = *(--luaD_stack.top); | 73 | L->stack.stack[L->Cstack.base++] = *(--L->stack.top); |
75 | return luaD_Cstack.base; /* this is +1 real position (see Ref) */ | 74 | return L->Cstack.base; /* this is +1 real position (see Ref) */ |
76 | } | 75 | } |
77 | 76 | ||
78 | 77 | ||
@@ -89,20 +88,20 @@ lua_Object lua_pop (void) | |||
89 | */ | 88 | */ |
90 | lua_Object lua_lua2C (int number) | 89 | lua_Object lua_lua2C (int number) |
91 | { | 90 | { |
92 | if (number <= 0 || number > luaD_Cstack.num) return LUA_NOOBJECT; | 91 | if (number <= 0 || number > L->Cstack.num) return LUA_NOOBJECT; |
93 | /* Ref(luaD_stack.stack+(luaD_Cstack.lua2C+number-1)) == | 92 | /* Ref(L->stack.stack+(L->Cstack.lua2C+number-1)) == |
94 | luaD_stack.stack+(luaD_Cstack.lua2C+number-1)-luaD_stack.stack+1 == */ | 93 | L->stack.stack+(L->Cstack.lua2C+number-1)-L->stack.stack+1 == */ |
95 | return luaD_Cstack.lua2C+number; | 94 | return L->Cstack.lua2C+number; |
96 | } | 95 | } |
97 | 96 | ||
98 | 97 | ||
99 | lua_Object lua_upvalue (int n) | 98 | lua_Object lua_upvalue (int n) |
100 | { | 99 | { |
101 | TObject *f = luaD_stack.stack+luaD_Cstack.lua2C-1; | 100 | TObject *f = L->stack.stack+L->Cstack.lua2C-1; |
102 | if (ttype(f) != LUA_T_MARK || n <= 0 || n > clvalue(f)->nelems) | 101 | if (ttype(f) != LUA_T_MARK || n <= 0 || n > clvalue(f)->nelems) |
103 | return LUA_NOOBJECT; | 102 | return LUA_NOOBJECT; |
104 | if (ttype(protovalue(f)) != LUA_T_CPROTO) lua_error("BAD!!"); | 103 | if (ttype(protovalue(f)) != LUA_T_CPROTO) lua_error("BAD!!"); |
105 | *luaD_stack.top = clvalue(f)->consts[n]; | 104 | *L->stack.top = clvalue(f)->consts[n]; |
106 | incr_top; | 105 | incr_top; |
107 | return put_luaObjectonTop(); | 106 | return put_luaObjectonTop(); |
108 | } | 107 | } |
@@ -113,8 +112,8 @@ int lua_callfunction (lua_Object function) | |||
113 | if (function == LUA_NOOBJECT) | 112 | if (function == LUA_NOOBJECT) |
114 | return 1; | 113 | return 1; |
115 | else { | 114 | else { |
116 | luaD_openstack((luaD_stack.top-luaD_stack.stack)-luaD_Cstack.base); | 115 | luaD_openstack((L->stack.top-L->stack.stack)-L->Cstack.base); |
117 | luaD_stack.stack[luaD_Cstack.base] = *Address(function); | 116 | L->stack.stack[L->Cstack.base] = *Address(function); |
118 | return luaD_protectedrun(MULT_RET); | 117 | return luaD_protectedrun(MULT_RET); |
119 | } | 118 | } |
120 | } | 119 | } |
@@ -129,16 +128,16 @@ lua_Object lua_gettagmethod (int tag, char *event) | |||
129 | lua_Object lua_settagmethod (int tag, char *event) | 128 | lua_Object lua_settagmethod (int tag, char *event) |
130 | { | 129 | { |
131 | checkCparams(1); | 130 | checkCparams(1); |
132 | luaT_settagmethod(tag, event, luaD_stack.top-1); | 131 | luaT_settagmethod(tag, event, L->stack.top-1); |
133 | return put_luaObjectonTop(); | 132 | return put_luaObjectonTop(); |
134 | } | 133 | } |
135 | 134 | ||
136 | 135 | ||
137 | lua_Object lua_seterrormethod (void) | 136 | lua_Object lua_seterrormethod (void) |
138 | { | 137 | { |
139 | TObject temp = luaD_errorim; | 138 | TObject temp = L->errorim; |
140 | checkCparams(1); | 139 | checkCparams(1); |
141 | luaD_errorim = *(--luaD_stack.top); | 140 | L->errorim = *(--L->stack.top); |
142 | return put_luaObject(&temp); | 141 | return put_luaObject(&temp); |
143 | } | 142 | } |
144 | 143 | ||
@@ -154,15 +153,15 @@ lua_Object lua_gettable (void) | |||
154 | lua_Object lua_rawgettable (void) | 153 | lua_Object lua_rawgettable (void) |
155 | { | 154 | { |
156 | checkCparams(2); | 155 | checkCparams(2); |
157 | if (ttype(luaD_stack.top-2) != LUA_T_ARRAY) | 156 | if (ttype(L->stack.top-2) != LUA_T_ARRAY) |
158 | lua_error("indexed expression not a table in raw gettable"); | 157 | lua_error("indexed expression not a table in raw gettable"); |
159 | else { | 158 | else { |
160 | TObject *h = luaH_get(avalue(luaD_stack.top-2), luaD_stack.top-1); | 159 | TObject *h = luaH_get(avalue(L->stack.top-2), L->stack.top-1); |
161 | --luaD_stack.top; | 160 | --L->stack.top; |
162 | if (h != NULL) | 161 | if (h != NULL) |
163 | *(luaD_stack.top-1) = *h; | 162 | *(L->stack.top-1) = *h; |
164 | else | 163 | else |
165 | ttype(luaD_stack.top-1) = LUA_T_NIL; | 164 | ttype(L->stack.top-1) = LUA_T_NIL; |
166 | } | 165 | } |
167 | return put_luaObjectonTop(); | 166 | return put_luaObjectonTop(); |
168 | } | 167 | } |
@@ -171,14 +170,14 @@ lua_Object lua_rawgettable (void) | |||
171 | void lua_settable (void) | 170 | void lua_settable (void) |
172 | { | 171 | { |
173 | checkCparams(3); | 172 | checkCparams(3); |
174 | luaV_settable(luaD_stack.top-3, 1); | 173 | luaV_settable(L->stack.top-3, 1); |
175 | } | 174 | } |
176 | 175 | ||
177 | 176 | ||
178 | void lua_rawsettable (void) | 177 | void lua_rawsettable (void) |
179 | { | 178 | { |
180 | checkCparams(3); | 179 | checkCparams(3); |
181 | luaV_settable(luaD_stack.top-3, 0); | 180 | luaV_settable(L->stack.top-3, 0); |
182 | } | 181 | } |
183 | 182 | ||
184 | 183 | ||
@@ -192,6 +191,12 @@ lua_Object lua_createtable (void) | |||
192 | } | 191 | } |
193 | 192 | ||
194 | 193 | ||
194 | lua_Object lua_globalbag (void) | ||
195 | { | ||
196 | return put_luaObject(&L->globalbag); | ||
197 | } | ||
198 | |||
199 | |||
195 | lua_Object lua_getglobal (char *name) | 200 | lua_Object lua_getglobal (char *name) |
196 | { | 201 | { |
197 | luaD_checkstack(2); /* may need that to call T.M. */ | 202 | luaD_checkstack(2); /* may need that to call T.M. */ |
@@ -219,7 +224,7 @@ void lua_rawsetglobal (char *name) | |||
219 | { | 224 | { |
220 | TaggedString *ts = luaS_new(name); | 225 | TaggedString *ts = luaS_new(name); |
221 | checkCparams(1); | 226 | checkCparams(1); |
222 | luaS_rawsetglobal(ts, --luaD_stack.top); | 227 | luaS_rawsetglobal(ts, --L->stack.top); |
223 | } | 228 | } |
224 | 229 | ||
225 | 230 | ||
@@ -293,24 +298,24 @@ lua_CFunction lua_getcfunction (lua_Object object) | |||
293 | 298 | ||
294 | void lua_pushnil (void) | 299 | void lua_pushnil (void) |
295 | { | 300 | { |
296 | ttype(luaD_stack.top) = LUA_T_NIL; | 301 | ttype(L->stack.top) = LUA_T_NIL; |
297 | incr_top; | 302 | incr_top; |
298 | } | 303 | } |
299 | 304 | ||
300 | void lua_pushnumber (real n) | 305 | void lua_pushnumber (real n) |
301 | { | 306 | { |
302 | ttype(luaD_stack.top) = LUA_T_NUMBER; | 307 | ttype(L->stack.top) = LUA_T_NUMBER; |
303 | nvalue(luaD_stack.top) = n; | 308 | nvalue(L->stack.top) = n; |
304 | incr_top; | 309 | incr_top; |
305 | } | 310 | } |
306 | 311 | ||
307 | void lua_pushstring (char *s) | 312 | void lua_pushstring (char *s) |
308 | { | 313 | { |
309 | if (s == NULL) | 314 | if (s == NULL) |
310 | ttype(luaD_stack.top) = LUA_T_NIL; | 315 | ttype(L->stack.top) = LUA_T_NIL; |
311 | else { | 316 | else { |
312 | tsvalue(luaD_stack.top) = luaS_new(s); | 317 | tsvalue(L->stack.top) = luaS_new(s); |
313 | ttype(luaD_stack.top) = LUA_T_STRING; | 318 | ttype(L->stack.top) = LUA_T_STRING; |
314 | } | 319 | } |
315 | incr_top; | 320 | incr_top; |
316 | luaC_checkGC(); | 321 | luaC_checkGC(); |
@@ -319,13 +324,13 @@ void lua_pushstring (char *s) | |||
319 | void lua_pushCclosure (lua_CFunction fn, int n) | 324 | void lua_pushCclosure (lua_CFunction fn, int n) |
320 | { | 325 | { |
321 | if (fn == NULL) { | 326 | if (fn == NULL) { |
322 | ttype(luaD_stack.top) = LUA_T_NIL; | 327 | ttype(L->stack.top) = LUA_T_NIL; |
323 | incr_top; | 328 | incr_top; |
324 | } | 329 | } |
325 | else { | 330 | else { |
326 | checkCparams(n); | 331 | checkCparams(n); |
327 | ttype(luaD_stack.top) = LUA_T_CPROTO; | 332 | ttype(L->stack.top) = LUA_T_CPROTO; |
328 | fvalue(luaD_stack.top) = fn; | 333 | fvalue(L->stack.top) = fn; |
329 | incr_top; | 334 | incr_top; |
330 | luaV_closure(n); | 335 | luaV_closure(n); |
331 | } | 336 | } |
@@ -335,15 +340,15 @@ void lua_pushusertag (void *u, int tag) | |||
335 | { | 340 | { |
336 | if (tag < 0 && tag != LUA_ANYTAG) | 341 | if (tag < 0 && tag != LUA_ANYTAG) |
337 | luaT_realtag(tag); /* error if tag is not valid */ | 342 | luaT_realtag(tag); /* error if tag is not valid */ |
338 | tsvalue(luaD_stack.top) = luaS_createudata(u, tag); | 343 | tsvalue(L->stack.top) = luaS_createudata(u, tag); |
339 | ttype(luaD_stack.top) = LUA_T_USERDATA; | 344 | ttype(L->stack.top) = LUA_T_USERDATA; |
340 | incr_top; | 345 | incr_top; |
341 | luaC_checkGC(); | 346 | luaC_checkGC(); |
342 | } | 347 | } |
343 | 348 | ||
344 | void luaA_pushobject (TObject *o) | 349 | void luaA_pushobject (TObject *o) |
345 | { | 350 | { |
346 | *luaD_stack.top = *o; | 351 | *L->stack.top = *o; |
347 | incr_top; | 352 | incr_top; |
348 | } | 353 | } |
349 | 354 | ||
@@ -351,9 +356,9 @@ void lua_pushobject (lua_Object o) | |||
351 | { | 356 | { |
352 | if (o == LUA_NOOBJECT) | 357 | if (o == LUA_NOOBJECT) |
353 | lua_error("API error - attempt to push a NOOBJECT"); | 358 | lua_error("API error - attempt to push a NOOBJECT"); |
354 | *luaD_stack.top = *Address(o); | 359 | *L->stack.top = *Address(o); |
355 | if (ttype(luaD_stack.top) == LUA_T_MARK) | 360 | if (ttype(L->stack.top) == LUA_T_MARK) |
356 | ttype(luaD_stack.top) = LUA_T_FUNCTION; | 361 | ttype(L->stack.top) = LUA_T_FUNCTION; |
357 | incr_top; | 362 | incr_top; |
358 | } | 363 | } |
359 | 364 | ||
@@ -376,18 +381,18 @@ void lua_settag (int tag) | |||
376 | { | 381 | { |
377 | checkCparams(1); | 382 | checkCparams(1); |
378 | luaT_realtag(tag); | 383 | luaT_realtag(tag); |
379 | switch (ttype(luaD_stack.top-1)) { | 384 | switch (ttype(L->stack.top-1)) { |
380 | case LUA_T_ARRAY: | 385 | case LUA_T_ARRAY: |
381 | (luaD_stack.top-1)->value.a->htag = tag; | 386 | (L->stack.top-1)->value.a->htag = tag; |
382 | break; | 387 | break; |
383 | case LUA_T_USERDATA: | 388 | case LUA_T_USERDATA: |
384 | (luaD_stack.top-1)->value.ts->u.d.tag = tag; | 389 | (L->stack.top-1)->value.ts->u.d.tag = tag; |
385 | break; | 390 | break; |
386 | default: | 391 | default: |
387 | luaL_verror("cannot change the tag of a %s", | 392 | luaL_verror("cannot change the tag of a %s", |
388 | luaO_typenames[-ttype((luaD_stack.top-1))]); | 393 | luaO_typenames[-ttype((L->stack.top-1))]); |
389 | } | 394 | } |
390 | luaD_stack.top--; | 395 | L->stack.top--; |
391 | } | 396 | } |
392 | 397 | ||
393 | 398 | ||
@@ -406,10 +411,10 @@ lua_LHFunction lua_linehook = NULL; | |||
406 | lua_Function lua_stackedfunction (int level) | 411 | lua_Function lua_stackedfunction (int level) |
407 | { | 412 | { |
408 | StkId i; | 413 | StkId i; |
409 | for (i = (luaD_stack.top-1)-luaD_stack.stack; i>=0; i--) | 414 | for (i = (L->stack.top-1)-L->stack.stack; i>=0; i--) |
410 | if (luaD_stack.stack[i].ttype == LUA_T_MARK) | 415 | if (L->stack.stack[i].ttype == LUA_T_MARK) |
411 | if (level-- == 0) | 416 | if (level-- == 0) |
412 | return Ref(luaD_stack.stack+i); | 417 | return Ref(L->stack.stack+i); |
413 | return LUA_NOOBJECT; | 418 | return LUA_NOOBJECT; |
414 | } | 419 | } |
415 | 420 | ||
@@ -417,7 +422,7 @@ lua_Function lua_stackedfunction (int level) | |||
417 | int lua_currentline (lua_Function func) | 422 | int lua_currentline (lua_Function func) |
418 | { | 423 | { |
419 | TObject *f = Address(func); | 424 | TObject *f = Address(func); |
420 | return (f+1 < luaD_stack.top && (f+1)->ttype == LUA_T_LINE) ? (f+1)->value.i : -1; | 425 | return (f+1 < L->stack.top && (f+1)->ttype == LUA_T_LINE) ? (f+1)->value.i : -1; |
421 | } | 426 | } |
422 | 427 | ||
423 | 428 | ||
@@ -447,11 +452,11 @@ int lua_setlocal (lua_Function func, int local_number) | |||
447 | TProtoFunc *fp = protovalue(f)->value.tf; | 452 | TProtoFunc *fp = protovalue(f)->value.tf; |
448 | char *name = luaF_getlocalname(fp, local_number, lua_currentline(func)); | 453 | char *name = luaF_getlocalname(fp, local_number, lua_currentline(func)); |
449 | checkCparams(1); | 454 | checkCparams(1); |
450 | --luaD_stack.top; | 455 | --L->stack.top; |
451 | if (name) { | 456 | if (name) { |
452 | /* if "name", there must be a LUA_T_LINE */ | 457 | /* if "name", there must be a LUA_T_LINE */ |
453 | /* therefore, f+2 points to function base */ | 458 | /* therefore, f+2 points to function base */ |
454 | *((f+2)+(local_number-1)) = *luaD_stack.top; | 459 | *((f+2)+(local_number-1)) = *L->stack.top; |
455 | return 1; | 460 | return 1; |
456 | } | 461 | } |
457 | else | 462 | else |
@@ -478,19 +483,18 @@ void lua_funcinfo (lua_Object func, char **filename, int *linedefined) | |||
478 | } | 483 | } |
479 | 484 | ||
480 | 485 | ||
481 | static TObject *functofind; | ||
482 | static int checkfunc (TObject *o) | 486 | static int checkfunc (TObject *o) |
483 | { | 487 | { |
484 | return (o->ttype == LUA_T_FUNCTION) && | 488 | return (o->ttype == LUA_T_FUNCTION) && |
485 | ((functofind->ttype == LUA_T_FUNCTION) || | 489 | ((L->functofind->ttype == LUA_T_FUNCTION) || |
486 | (functofind->ttype == LUA_T_MARK)) && | 490 | (L->functofind->ttype == LUA_T_MARK)) && |
487 | (functofind->value.cl == o->value.cl); | 491 | (L->functofind->value.cl == o->value.cl); |
488 | } | 492 | } |
489 | 493 | ||
490 | 494 | ||
491 | char *lua_getobjname (lua_Object o, char **name) | 495 | char *lua_getobjname (lua_Object o, char **name) |
492 | { /* try to find a name for given function */ | 496 | { /* try to find a name for given function */ |
493 | functofind = Address(o); | 497 | L->functofind = Address(o); |
494 | if ((*name = luaT_travtagmethods(checkfunc)) != NULL) | 498 | if ((*name = luaT_travtagmethods(checkfunc)) != NULL) |
495 | return "tag-method"; | 499 | return "tag-method"; |
496 | else if ((*name = luaS_travsymbol(checkfunc)) != NULL) | 500 | else if ((*name = luaS_travsymbol(checkfunc)) != NULL) |
@@ -504,36 +508,30 @@ char *lua_getobjname (lua_Object o, char **name) | |||
504 | ** ======================================================= | 508 | ** ======================================================= |
505 | */ | 509 | */ |
506 | 510 | ||
507 | #define MAX_C_BLOCKS 10 | ||
508 | |||
509 | static int numCblocks = 0; | ||
510 | static struct C_Lua_Stack Cblocks[MAX_C_BLOCKS]; | ||
511 | 511 | ||
512 | void lua_beginblock (void) | 512 | void lua_beginblock (void) |
513 | { | 513 | { |
514 | if (numCblocks >= MAX_C_BLOCKS) | 514 | if (L->numCblocks >= MAX_C_BLOCKS) |
515 | lua_error("`lua_beginblock': too many nested blocks"); | 515 | lua_error("`lua_beginblock': too many nested blocks"); |
516 | Cblocks[numCblocks] = luaD_Cstack; | 516 | L->Cblocks[L->numCblocks] = L->Cstack; |
517 | numCblocks++; | 517 | L->numCblocks++; |
518 | } | 518 | } |
519 | 519 | ||
520 | void lua_endblock (void) | 520 | void lua_endblock (void) |
521 | { | 521 | { |
522 | --numCblocks; | 522 | --L->numCblocks; |
523 | luaD_Cstack = Cblocks[numCblocks]; | 523 | L->Cstack = L->Cblocks[L->numCblocks]; |
524 | luaD_adjusttop(luaD_Cstack.base); | 524 | luaD_adjusttop(L->Cstack.base); |
525 | } | 525 | } |
526 | 526 | ||
527 | 527 | ||
528 | 528 | ||
529 | |||
530 | |||
531 | int lua_ref (int lock) | 529 | int lua_ref (int lock) |
532 | { | 530 | { |
533 | int ref; | 531 | int ref; |
534 | checkCparams(1); | 532 | checkCparams(1); |
535 | ref = luaC_ref(luaD_stack.top-1, lock); | 533 | ref = luaC_ref(L->stack.top-1, lock); |
536 | luaD_stack.top--; | 534 | L->stack.top--; |
537 | return ref; | 535 | return ref; |
538 | } | 536 | } |
539 | 537 | ||
@@ -546,19 +544,6 @@ lua_Object lua_getref (int ref) | |||
546 | } | 544 | } |
547 | 545 | ||
548 | 546 | ||
549 | void lua_open (void) | ||
550 | { | ||
551 | static int firsttime = 1; | ||
552 | if (!firsttime) return; | ||
553 | firsttime = 0; | ||
554 | luaS_init(); | ||
555 | luaX_init(); | ||
556 | luaT_init(); | ||
557 | luaD_init(); | ||
558 | luaB_predefine(); | ||
559 | } | ||
560 | |||
561 | |||
562 | 547 | ||
563 | #if LUA_COMPAT2_5 | 548 | #if LUA_COMPAT2_5 |
564 | /* | 549 | /* |
@@ -567,11 +552,11 @@ void lua_open (void) | |||
567 | 552 | ||
568 | static void do_unprotectedrun (lua_CFunction f, int nParams, int nResults) | 553 | static void do_unprotectedrun (lua_CFunction f, int nParams, int nResults) |
569 | { | 554 | { |
570 | StkId base = (luaD_stack.top-luaD_stack.stack)-nParams; | 555 | StkId base = (L->stack.top-L->stack.stack)-nParams; |
571 | luaD_openstack(nParams); | 556 | luaD_openstack(nParams); |
572 | luaD_stack.stack[base].ttype = LUA_T_CPROTO; | 557 | L->stack.stack[base].ttype = LUA_T_CPROTO; |
573 | luaD_stack.stack[base].value.f = f; | 558 | L->stack.stack[base].value.f = f; |
574 | luaF_simpleclosure(luaD_stack.stack+base); | 559 | luaF_simpleclosure(L->stack.stack+base); |
575 | luaD_call(base+1, nResults); | 560 | luaD_call(base+1, nResults); |
576 | } | 561 | } |
577 | 562 | ||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lbuiltin.c,v 1.6 1997/11/04 15:27:53 roberto Exp roberto $ | 2 | ** $Id: lbuiltin.c,v 1.7 1997/11/07 18:19:13 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 | */ |
@@ -15,6 +15,7 @@ | |||
15 | #include "lfunc.h" | 15 | #include "lfunc.h" |
16 | #include "lmem.h" | 16 | #include "lmem.h" |
17 | #include "lobject.h" | 17 | #include "lobject.h" |
18 | #include "lstate.h" | ||
18 | #include "lstring.h" | 19 | #include "lstring.h" |
19 | #include "ltable.h" | 20 | #include "ltable.h" |
20 | #include "ltm.h" | 21 | #include "ltm.h" |
@@ -51,7 +52,7 @@ static void nextvar (void) | |||
51 | TObject *o = luaA_Address(luaL_nonnullarg(1)); | 52 | TObject *o = luaA_Address(luaL_nonnullarg(1)); |
52 | TaggedString *g; | 53 | TaggedString *g; |
53 | if (ttype(o) == LUA_T_NIL) | 54 | if (ttype(o) == LUA_T_NIL) |
54 | g = (TaggedString *)luaS_root.next; | 55 | g = (TaggedString *)L->rootglobal.next; |
55 | else { | 56 | else { |
56 | luaL_arg_check(ttype(o) == LUA_T_STRING, 1, "variable name expected"); | 57 | luaL_arg_check(ttype(o) == LUA_T_STRING, 1, "variable name expected"); |
57 | g = tsvalue(o); | 58 | g = tsvalue(o); |
@@ -72,21 +73,21 @@ static void foreachvar (void) | |||
72 | { | 73 | { |
73 | TObject f = *luaA_Address(functionarg(1)); | 74 | TObject f = *luaA_Address(functionarg(1)); |
74 | GCnode *g; | 75 | GCnode *g; |
75 | StkId name = luaD_Cstack.base++; /* place to keep var name (to avoid GC) */ | 76 | StkId name = L->Cstack.base++; /* place to keep var name (to avoid GC) */ |
76 | ttype(luaD_stack.stack+name) = LUA_T_NIL; | 77 | ttype(L->stack.stack+name) = LUA_T_NIL; |
77 | luaD_stack.top++; | 78 | L->stack.top++; |
78 | for (g = luaS_root.next; g; g = g->next) { | 79 | for (g = L->rootglobal.next; g; g = g->next) { |
79 | TaggedString *s = (TaggedString *)g; | 80 | TaggedString *s = (TaggedString *)g; |
80 | if (s->u.globalval.ttype != LUA_T_NIL) { | 81 | if (s->u.globalval.ttype != LUA_T_NIL) { |
81 | ttype(luaD_stack.stack+name) = LUA_T_STRING; | 82 | ttype(L->stack.stack+name) = LUA_T_STRING; |
82 | tsvalue(luaD_stack.stack+name) = s; /* keep s on stack to avoid GC */ | 83 | tsvalue(L->stack.stack+name) = s; /* keep s on stack to avoid GC */ |
83 | luaA_pushobject(&f); | 84 | luaA_pushobject(&f); |
84 | pushstring(s); | 85 | pushstring(s); |
85 | luaA_pushobject(&s->u.globalval); | 86 | luaA_pushobject(&s->u.globalval); |
86 | luaD_call((luaD_stack.top-luaD_stack.stack)-2, 1); | 87 | luaD_call((L->stack.top-L->stack.stack)-2, 1); |
87 | if (ttype(luaD_stack.top-1) != LUA_T_NIL) | 88 | if (ttype(L->stack.top-1) != LUA_T_NIL) |
88 | return; | 89 | return; |
89 | luaD_stack.top--; | 90 | L->stack.top--; |
90 | } | 91 | } |
91 | } | 92 | } |
92 | } | 93 | } |
@@ -115,10 +116,10 @@ static void foreach (void) | |||
115 | luaA_pushobject(&f); | 116 | luaA_pushobject(&f); |
116 | luaA_pushobject(ref(nd)); | 117 | luaA_pushobject(ref(nd)); |
117 | luaA_pushobject(val(nd)); | 118 | luaA_pushobject(val(nd)); |
118 | luaD_call((luaD_stack.top-luaD_stack.stack)-2, 1); | 119 | luaD_call((L->stack.top-L->stack.stack)-2, 1); |
119 | if (ttype(luaD_stack.top-1) != LUA_T_NIL) | 120 | if (ttype(L->stack.top-1) != LUA_T_NIL) |
120 | return; | 121 | return; |
121 | luaD_stack.top--; | 122 | L->stack.top--; |
122 | } | 123 | } |
123 | } | 124 | } |
124 | } | 125 | } |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: ldo.c,v 1.7 1997/11/04 15:27:53 roberto Exp roberto $ | 2 | ** $Id: ldo.c,v 1.8 1997/11/07 15:09:49 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 | */ |
@@ -16,6 +16,7 @@ | |||
16 | #include "lmem.h" | 16 | #include "lmem.h" |
17 | #include "lobject.h" | 17 | #include "lobject.h" |
18 | #include "lparser.h" | 18 | #include "lparser.h" |
19 | #include "lstate.h" | ||
19 | #include "ltm.h" | 20 | #include "ltm.h" |
20 | #include "lua.h" | 21 | #include "lua.h" |
21 | #include "luadebug.h" | 22 | #include "luadebug.h" |
@@ -30,14 +31,6 @@ | |||
30 | #endif | 31 | #endif |
31 | 32 | ||
32 | 33 | ||
33 | struct Stack luaD_stack; | ||
34 | |||
35 | |||
36 | struct C_Lua_Stack luaD_Cstack = {0, 0, 0}; | ||
37 | |||
38 | static jmp_buf *errorJmp = NULL; /* current error recover point */ | ||
39 | |||
40 | |||
41 | 34 | ||
42 | /* | 35 | /* |
43 | ** Error messages | 36 | ** Error messages |
@@ -50,8 +43,6 @@ static void stderrorim (void) | |||
50 | fprintf(stderr, "lua error: %s\n", lua_getstring(s)); | 43 | fprintf(stderr, "lua error: %s\n", lua_getstring(s)); |
51 | } | 44 | } |
52 | 45 | ||
53 | TObject luaD_errorim; | ||
54 | |||
55 | 46 | ||
56 | static void initCfunc (TObject *o, lua_CFunction f) | 47 | static void initCfunc (TObject *o, lua_CFunction f) |
57 | { | 48 | { |
@@ -67,24 +58,25 @@ static void initCfunc (TObject *o, lua_CFunction f) | |||
67 | 58 | ||
68 | void luaD_init (void) | 59 | void luaD_init (void) |
69 | { | 60 | { |
70 | luaD_stack.stack = luaM_newvector(INIT_STACK_SIZE, TObject); | 61 | L->stacklimit = STACK_LIMIT; |
71 | luaD_stack.top = luaD_stack.stack; | 62 | L->stack.stack = luaM_newvector(INIT_STACK_SIZE, TObject); |
72 | luaD_stack.last = luaD_stack.stack+(INIT_STACK_SIZE-1); | 63 | L->stack.top = L->stack.stack; |
73 | initCfunc(&luaD_errorim, stderrorim); | 64 | L->stack.last = L->stack.stack+(INIT_STACK_SIZE-1); |
65 | initCfunc(&L->errorim, stderrorim); | ||
74 | } | 66 | } |
75 | 67 | ||
76 | 68 | ||
77 | void luaD_checkstack (int n) | 69 | void luaD_checkstack (int n) |
78 | { | 70 | { |
79 | if (luaD_stack.last-luaD_stack.top <= n) { | 71 | if (L->stack.last-L->stack.top <= n) { |
80 | static int limit = STACK_LIMIT; | 72 | StkId top = L->stack.top-L->stack.stack; |
81 | StkId top = luaD_stack.top-luaD_stack.stack; | 73 | int stacksize = (L->stack.last-L->stack.stack)+1+STACK_EXTRA+n; |
82 | int stacksize = (luaD_stack.last-luaD_stack.stack)+1+STACK_EXTRA+n; | 74 | L->stack.stack = luaM_reallocvector(L->stack.stack, stacksize,TObject); |
83 | luaD_stack.stack = luaM_reallocvector(luaD_stack.stack, stacksize,TObject); | 75 | L->stack.last = L->stack.stack+(stacksize-1); |
84 | luaD_stack.last = luaD_stack.stack+(stacksize-1); | 76 | L->stack.top = L->stack.stack + top; |
85 | luaD_stack.top = luaD_stack.stack + top; | 77 | if (stacksize >= L->stacklimit) { |
86 | if (stacksize >= limit) { | 78 | /* extra space to run error handler */ |
87 | limit = stacksize+STACK_EXTRA; /* extra space to run error handler */ | 79 | L->stacklimit = stacksize+STACK_EXTRA; |
88 | if (lua_stackedfunction(100) == LUA_NOOBJECT) { | 80 | if (lua_stackedfunction(100) == LUA_NOOBJECT) { |
89 | /* less than 100 functions on the stack: cannot be recursive loop */ | 81 | /* less than 100 functions on the stack: cannot be recursive loop */ |
90 | lua_error("Lua2C - C2Lua overflow"); | 82 | lua_error("Lua2C - C2Lua overflow"); |
@@ -101,80 +93,80 @@ void luaD_checkstack (int n) | |||
101 | */ | 93 | */ |
102 | void luaD_adjusttop (StkId newtop) | 94 | void luaD_adjusttop (StkId newtop) |
103 | { | 95 | { |
104 | int diff = newtop-(luaD_stack.top-luaD_stack.stack); | 96 | int diff = newtop-(L->stack.top-L->stack.stack); |
105 | if (diff <= 0) | 97 | if (diff <= 0) |
106 | luaD_stack.top += diff; | 98 | L->stack.top += diff; |
107 | else { | 99 | else { |
108 | luaD_checkstack(diff); | 100 | luaD_checkstack(diff); |
109 | while (diff--) | 101 | while (diff--) |
110 | ttype(luaD_stack.top++) = LUA_T_NIL; | 102 | ttype(L->stack.top++) = LUA_T_NIL; |
111 | } | 103 | } |
112 | } | 104 | } |
113 | 105 | ||
114 | 106 | ||
115 | /* | 107 | /* |
116 | ** Open a hole below "nelems" from the luaD_stack.top. | 108 | ** Open a hole below "nelems" from the L->stack.top. |
117 | */ | 109 | */ |
118 | void luaD_openstack (int nelems) | 110 | void luaD_openstack (int nelems) |
119 | { | 111 | { |
120 | int i; | 112 | int i; |
121 | for (i=0; i<nelems; i++) | 113 | for (i=0; i<nelems; i++) |
122 | *(luaD_stack.top-i) = *(luaD_stack.top-i-1); | 114 | *(L->stack.top-i) = *(L->stack.top-i-1); |
123 | incr_top; | 115 | incr_top; |
124 | } | 116 | } |
125 | 117 | ||
126 | 118 | ||
127 | void luaD_lineHook (int line) | 119 | void luaD_lineHook (int line) |
128 | { | 120 | { |
129 | struct C_Lua_Stack oldCLS = luaD_Cstack; | 121 | struct C_Lua_Stack oldCLS = L->Cstack; |
130 | StkId old_top = luaD_Cstack.lua2C = luaD_Cstack.base = luaD_stack.top-luaD_stack.stack; | 122 | StkId old_top = L->Cstack.lua2C = L->Cstack.base = L->stack.top-L->stack.stack; |
131 | luaD_Cstack.num = 0; | 123 | L->Cstack.num = 0; |
132 | (*lua_linehook)(line); | 124 | (*lua_linehook)(line); |
133 | luaD_stack.top = luaD_stack.stack+old_top; | 125 | L->stack.top = L->stack.stack+old_top; |
134 | luaD_Cstack = oldCLS; | 126 | L->Cstack = oldCLS; |
135 | } | 127 | } |
136 | 128 | ||
137 | 129 | ||
138 | void luaD_callHook (StkId base, lua_Type type, int isreturn) | 130 | void luaD_callHook (StkId base, lua_Type type, int isreturn) |
139 | { | 131 | { |
140 | struct C_Lua_Stack oldCLS = luaD_Cstack; | 132 | struct C_Lua_Stack oldCLS = L->Cstack; |
141 | StkId old_top = luaD_Cstack.lua2C = luaD_Cstack.base = luaD_stack.top-luaD_stack.stack; | 133 | StkId old_top = L->Cstack.lua2C = L->Cstack.base = L->stack.top-L->stack.stack; |
142 | luaD_Cstack.num = 0; | 134 | L->Cstack.num = 0; |
143 | if (isreturn) | 135 | if (isreturn) |
144 | (*lua_callhook)(LUA_NOOBJECT, "(return)", 0); | 136 | (*lua_callhook)(LUA_NOOBJECT, "(return)", 0); |
145 | else { | 137 | else { |
146 | TObject *f = luaD_stack.stack+base-1; | 138 | TObject *f = L->stack.stack+base-1; |
147 | if (type == LUA_T_PROTO) | 139 | if (type == LUA_T_PROTO) |
148 | (*lua_callhook)(Ref(f), tfvalue(protovalue(f))->fileName->str, | 140 | (*lua_callhook)(Ref(f), tfvalue(protovalue(f))->fileName->str, |
149 | tfvalue(protovalue(f))->lineDefined); | 141 | tfvalue(protovalue(f))->lineDefined); |
150 | else | 142 | else |
151 | (*lua_callhook)(Ref(f), "(C)", -1); | 143 | (*lua_callhook)(Ref(f), "(C)", -1); |
152 | } | 144 | } |
153 | luaD_stack.top = luaD_stack.stack+old_top; | 145 | L->stack.top = L->stack.stack+old_top; |
154 | luaD_Cstack = oldCLS; | 146 | L->Cstack = oldCLS; |
155 | } | 147 | } |
156 | 148 | ||
157 | 149 | ||
158 | /* | 150 | /* |
159 | ** Call a C function. luaD_Cstack.base will point to the top of the stack, | 151 | ** Call a C function. L->Cstack.base will point to the top of the stack, |
160 | ** and luaD_Cstack.num is the number of parameters. Returns an index | 152 | ** and L->Cstack.num is the number of parameters. Returns an index |
161 | ** to the first result from C. | 153 | ** to the first result from C. |
162 | */ | 154 | */ |
163 | static StkId callC (lua_CFunction func, StkId base) | 155 | static StkId callC (lua_CFunction func, StkId base) |
164 | { | 156 | { |
165 | struct C_Lua_Stack oldCLS = luaD_Cstack; | 157 | struct C_Lua_Stack oldCLS = L->Cstack; |
166 | StkId firstResult; | 158 | StkId firstResult; |
167 | luaD_Cstack.num = (luaD_stack.top-luaD_stack.stack) - base; | 159 | L->Cstack.num = (L->stack.top-L->stack.stack) - base; |
168 | /* incorporate parameters on the luaD_stack.stack */ | 160 | /* incorporate parameters on the L->stack.stack */ |
169 | luaD_Cstack.lua2C = base; | 161 | L->Cstack.lua2C = base; |
170 | luaD_Cstack.base = base+luaD_Cstack.num; /* == top-stack */ | 162 | L->Cstack.base = base+L->Cstack.num; /* == top-stack */ |
171 | if (lua_callhook) | 163 | if (lua_callhook) |
172 | luaD_callHook(base, LUA_T_CPROTO, 0); | 164 | luaD_callHook(base, LUA_T_CPROTO, 0); |
173 | (*func)(); | 165 | (*func)(); |
174 | if (lua_callhook) /* func may have changed lua_callhook */ | 166 | if (lua_callhook) /* func may have changed lua_callhook */ |
175 | luaD_callHook(base, LUA_T_CPROTO, 1); | 167 | luaD_callHook(base, LUA_T_CPROTO, 1); |
176 | firstResult = luaD_Cstack.base; | 168 | firstResult = L->Cstack.base; |
177 | luaD_Cstack = oldCLS; | 169 | L->Cstack = oldCLS; |
178 | return firstResult; | 170 | return firstResult; |
179 | } | 171 | } |
180 | 172 | ||
@@ -182,21 +174,21 @@ static StkId callC (lua_CFunction func, StkId base) | |||
182 | void luaD_callTM (TObject *f, int nParams, int nResults) | 174 | void luaD_callTM (TObject *f, int nParams, int nResults) |
183 | { | 175 | { |
184 | luaD_openstack(nParams); | 176 | luaD_openstack(nParams); |
185 | *(luaD_stack.top-nParams-1) = *f; | 177 | *(L->stack.top-nParams-1) = *f; |
186 | luaD_call((luaD_stack.top-luaD_stack.stack)-nParams, nResults); | 178 | luaD_call((L->stack.top-L->stack.stack)-nParams, nResults); |
187 | } | 179 | } |
188 | 180 | ||
189 | 181 | ||
190 | /* | 182 | /* |
191 | ** Call a function (C or Lua). The parameters must be on the luaD_stack.stack, | 183 | ** Call a function (C or Lua). The parameters must be on the L->stack.stack, |
192 | ** between [luaD_stack.stack+base,luaD_stack.top). The function to be called is at luaD_stack.stack+base-1. | 184 | ** between [L->stack.stack+base,L->stack.top). The function to be called is at L->stack.stack+base-1. |
193 | ** When returns, the results are on the luaD_stack.stack, between [luaD_stack.stack+base-1,luaD_stack.top). | 185 | ** When returns, the results are on the L->stack.stack, between [L->stack.stack+base-1,L->stack.top). |
194 | ** The number of results is nResults, unless nResults=MULT_RET. | 186 | ** The number of results is nResults, unless nResults=MULT_RET. |
195 | */ | 187 | */ |
196 | void luaD_call (StkId base, int nResults) | 188 | void luaD_call (StkId base, int nResults) |
197 | { | 189 | { |
198 | StkId firstResult; | 190 | StkId firstResult; |
199 | TObject *func = luaD_stack.stack+base-1; | 191 | TObject *func = L->stack.stack+base-1; |
200 | int i; | 192 | int i; |
201 | if (ttype(func) == LUA_T_FUNCTION) { | 193 | if (ttype(func) == LUA_T_FUNCTION) { |
202 | TObject *proto = protovalue(func); | 194 | TObject *proto = protovalue(func); |
@@ -209,7 +201,7 @@ void luaD_call (StkId base, int nResults) | |||
209 | TObject *im = luaT_getimbyObj(func, IM_FUNCTION); | 201 | TObject *im = luaT_getimbyObj(func, IM_FUNCTION); |
210 | if (ttype(im) == LUA_T_NIL) | 202 | if (ttype(im) == LUA_T_NIL) |
211 | lua_error("call expression not a function"); | 203 | lua_error("call expression not a function"); |
212 | luaD_callTM(im, (luaD_stack.top-luaD_stack.stack)-(base-1), nResults); | 204 | luaD_callTM(im, (L->stack.top-L->stack.stack)-(base-1), nResults); |
213 | return; | 205 | return; |
214 | } | 206 | } |
215 | /* adjust the number of results */ | 207 | /* adjust the number of results */ |
@@ -217,29 +209,29 @@ void luaD_call (StkId base, int nResults) | |||
217 | luaD_adjusttop(firstResult+nResults); | 209 | luaD_adjusttop(firstResult+nResults); |
218 | /* move results to base-1 (to erase parameters and function) */ | 210 | /* move results to base-1 (to erase parameters and function) */ |
219 | base--; | 211 | base--; |
220 | nResults = luaD_stack.top - (luaD_stack.stack+firstResult); /* actual number of results */ | 212 | nResults = L->stack.top - (L->stack.stack+firstResult); /* actual number of results */ |
221 | for (i=0; i<nResults; i++) | 213 | for (i=0; i<nResults; i++) |
222 | *(luaD_stack.stack+base+i) = *(luaD_stack.stack+firstResult+i); | 214 | *(L->stack.stack+base+i) = *(L->stack.stack+firstResult+i); |
223 | luaD_stack.top -= firstResult-base; | 215 | L->stack.top -= firstResult-base; |
224 | } | 216 | } |
225 | 217 | ||
226 | 218 | ||
227 | 219 | ||
228 | /* | 220 | /* |
229 | ** Traverse all objects on luaD_stack.stack | 221 | ** Traverse all objects on L->stack.stack |
230 | */ | 222 | */ |
231 | void luaD_travstack (int (*fn)(TObject *)) | 223 | void luaD_travstack (int (*fn)(TObject *)) |
232 | { | 224 | { |
233 | StkId i; | 225 | StkId i; |
234 | for (i = (luaD_stack.top-1)-luaD_stack.stack; i>=0; i--) | 226 | for (i = (L->stack.top-1)-L->stack.stack; i>=0; i--) |
235 | fn (luaD_stack.stack+i); | 227 | fn (L->stack.stack+i); |
236 | } | 228 | } |
237 | 229 | ||
238 | 230 | ||
239 | 231 | ||
240 | static void message (char *s) | 232 | static void message (char *s) |
241 | { | 233 | { |
242 | TObject im = luaD_errorim; | 234 | TObject im = L->errorim; |
243 | if (ttype(&im) != LUA_T_NIL) { | 235 | if (ttype(&im) != LUA_T_NIL) { |
244 | lua_pushstring(s); | 236 | lua_pushstring(s); |
245 | luaD_callTM(&im, 1, 0); | 237 | luaD_callTM(&im, 1, 0); |
@@ -252,8 +244,8 @@ static void message (char *s) | |||
252 | void lua_error (char *s) | 244 | void lua_error (char *s) |
253 | { | 245 | { |
254 | if (s) message(s); | 246 | if (s) message(s); |
255 | if (errorJmp) | 247 | if (L->errorJmp) |
256 | longjmp(*errorJmp, 1); | 248 | longjmp(*((jmp_buf *)L->errorJmp), 1); |
257 | else { | 249 | else { |
258 | fprintf (stderr, "lua: exit(1). Unable to recover\n"); | 250 | fprintf (stderr, "lua: exit(1). Unable to recover\n"); |
259 | exit(1); | 251 | exit(1); |
@@ -261,40 +253,40 @@ void lua_error (char *s) | |||
261 | } | 253 | } |
262 | 254 | ||
263 | /* | 255 | /* |
264 | ** Call the function at luaD_Cstack.base, and incorporate results on | 256 | ** Call the function at L->Cstack.base, and incorporate results on |
265 | ** the Lua2C structure. | 257 | ** the Lua2C structure. |
266 | */ | 258 | */ |
267 | static void do_callinc (int nResults) | 259 | static void do_callinc (int nResults) |
268 | { | 260 | { |
269 | StkId base = luaD_Cstack.base; | 261 | StkId base = L->Cstack.base; |
270 | luaD_call(base+1, nResults); | 262 | luaD_call(base+1, nResults); |
271 | luaD_Cstack.lua2C = base; /* position of the luaM_new results */ | 263 | L->Cstack.lua2C = base; /* position of the luaM_new results */ |
272 | luaD_Cstack.num = (luaD_stack.top-luaD_stack.stack) - base; /* number of results */ | 264 | L->Cstack.num = (L->stack.top-L->stack.stack) - base; /* number of results */ |
273 | luaD_Cstack.base = base + luaD_Cstack.num; /* incorporate results on luaD_stack.stack */ | 265 | L->Cstack.base = base + L->Cstack.num; /* incorporate results on L->stack.stack */ |
274 | } | 266 | } |
275 | 267 | ||
276 | 268 | ||
277 | /* | 269 | /* |
278 | ** Execute a protected call. Assumes that function is at luaD_Cstack.base and | 270 | ** Execute a protected call. Assumes that function is at L->Cstack.base and |
279 | ** parameters are on top of it. Leave nResults on the stack. | 271 | ** parameters are on top of it. Leave nResults on the stack. |
280 | */ | 272 | */ |
281 | int luaD_protectedrun (int nResults) | 273 | int luaD_protectedrun (int nResults) |
282 | { | 274 | { |
283 | jmp_buf myErrorJmp; | 275 | jmp_buf myErrorJmp; |
284 | int status; | 276 | int status; |
285 | struct C_Lua_Stack oldCLS = luaD_Cstack; | 277 | struct C_Lua_Stack oldCLS = L->Cstack; |
286 | jmp_buf *oldErr = errorJmp; | 278 | jmp_buf *oldErr = L->errorJmp; |
287 | errorJmp = &myErrorJmp; | 279 | L->errorJmp = &myErrorJmp; |
288 | if (setjmp(myErrorJmp) == 0) { | 280 | if (setjmp(myErrorJmp) == 0) { |
289 | do_callinc(nResults); | 281 | do_callinc(nResults); |
290 | status = 0; | 282 | status = 0; |
291 | } | 283 | } |
292 | else { /* an error occurred: restore luaD_Cstack and luaD_stack.top */ | 284 | else { /* an error occurred: restore L->Cstack and L->stack.top */ |
293 | luaD_Cstack = oldCLS; | 285 | L->Cstack = oldCLS; |
294 | luaD_stack.top = luaD_stack.stack+luaD_Cstack.base; | 286 | L->stack.top = L->stack.stack+L->Cstack.base; |
295 | status = 1; | 287 | status = 1; |
296 | } | 288 | } |
297 | errorJmp = oldErr; | 289 | L->errorJmp = oldErr; |
298 | return status; | 290 | return status; |
299 | } | 291 | } |
300 | 292 | ||
@@ -307,8 +299,8 @@ static int protectedparser (ZIO *z, char *chunkname, int bin) | |||
307 | int status; | 299 | int status; |
308 | TProtoFunc *tf; | 300 | TProtoFunc *tf; |
309 | jmp_buf myErrorJmp; | 301 | jmp_buf myErrorJmp; |
310 | jmp_buf *oldErr = errorJmp; | 302 | jmp_buf *oldErr = L->errorJmp; |
311 | errorJmp = &myErrorJmp; | 303 | L->errorJmp = &myErrorJmp; |
312 | if (setjmp(myErrorJmp) == 0) { | 304 | if (setjmp(myErrorJmp) == 0) { |
313 | tf = bin ? luaU_undump1(z, chunkname) : luaY_parser(z, chunkname); | 305 | tf = bin ? luaU_undump1(z, chunkname) : luaY_parser(z, chunkname); |
314 | status = 0; | 306 | status = 0; |
@@ -317,12 +309,12 @@ static int protectedparser (ZIO *z, char *chunkname, int bin) | |||
317 | tf = NULL; | 309 | tf = NULL; |
318 | status = 1; | 310 | status = 1; |
319 | } | 311 | } |
320 | errorJmp = oldErr; | 312 | L->errorJmp = oldErr; |
321 | if (status) return 1; /* error code */ | 313 | if (status) return 1; /* error code */ |
322 | if (tf == NULL) return 2; /* 'natural' end */ | 314 | if (tf == NULL) return 2; /* 'natural' end */ |
323 | luaD_adjusttop(luaD_Cstack.base+1); /* one slot for the pseudo-function */ | 315 | luaD_adjusttop(L->Cstack.base+1); /* one slot for the pseudo-function */ |
324 | luaD_stack.stack[luaD_Cstack.base].ttype = LUA_T_PROTO; | 316 | L->stack.stack[L->Cstack.base].ttype = LUA_T_PROTO; |
325 | luaD_stack.stack[luaD_Cstack.base].value.tf = tf; | 317 | L->stack.stack[L->Cstack.base].value.tf = tf; |
326 | luaV_closure(0); | 318 | luaV_closure(0); |
327 | return 0; | 319 | return 0; |
328 | } | 320 | } |
@@ -332,15 +324,15 @@ static int do_main (ZIO *z, char *chunkname, int bin) | |||
332 | { | 324 | { |
333 | int status; | 325 | int status; |
334 | do { | 326 | do { |
335 | long old_blocks = (luaC_checkGC(), luaO_nblocks); | 327 | long old_blocks = (luaC_checkGC(), L->nblocks); |
336 | status = protectedparser(z, chunkname, bin); | 328 | status = protectedparser(z, chunkname, bin); |
337 | if (status == 1) return 1; /* error */ | 329 | if (status == 1) return 1; /* error */ |
338 | else if (status == 2) return 0; /* 'natural' end */ | 330 | else if (status == 2) return 0; /* 'natural' end */ |
339 | else { | 331 | else { |
340 | unsigned long newelems2 = 2*(luaO_nblocks-old_blocks); | 332 | unsigned long newelems2 = 2*(L->nblocks-old_blocks); |
341 | luaC_threshold += newelems2; | 333 | L->GCthreshold += newelems2; |
342 | status = luaD_protectedrun(MULT_RET); | 334 | status = luaD_protectedrun(MULT_RET); |
343 | luaC_threshold -= newelems2; | 335 | L->GCthreshold -= newelems2; |
344 | } | 336 | } |
345 | } while (bin && status == 0); | 337 | } while (bin && status == 0); |
346 | return status; | 338 | return status; |
@@ -351,7 +343,7 @@ void luaD_gcIM (TObject *o) | |||
351 | { | 343 | { |
352 | TObject *im = luaT_getimbyObj(o, IM_GC); | 344 | TObject *im = luaT_getimbyObj(o, IM_GC); |
353 | if (ttype(im) != LUA_T_NIL) { | 345 | if (ttype(im) != LUA_T_NIL) { |
354 | *luaD_stack.top = *o; | 346 | *L->stack.top = *o; |
355 | incr_top; | 347 | incr_top; |
356 | luaD_callTM(im, 1, 0); | 348 | luaD_callTM(im, 1, 0); |
357 | } | 349 | } |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: ldo.h,v 1.1 1997/09/16 19:25:59 roberto Exp roberto $ | 2 | ** $Id: ldo.h,v 1.2 1997/11/04 15:27:53 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 | */ |
@@ -9,43 +9,25 @@ | |||
9 | 9 | ||
10 | 10 | ||
11 | #include "lobject.h" | 11 | #include "lobject.h" |
12 | #include "lstate.h" | ||
12 | 13 | ||
13 | 14 | ||
14 | typedef int StkId; /* index to luaD_stack.stack elements */ | ||
15 | |||
16 | #define MULT_RET 255 | 15 | #define MULT_RET 255 |
17 | 16 | ||
18 | 17 | ||
19 | extern struct Stack { | ||
20 | TObject *last; | ||
21 | TObject *stack; | ||
22 | TObject *top; | ||
23 | } luaD_stack; | ||
24 | |||
25 | |||
26 | extern struct C_Lua_Stack { | ||
27 | StkId base; /* when Lua calls C or C calls Lua, points to */ | ||
28 | /* the first slot after the last parameter. */ | ||
29 | StkId lua2C; /* points to first element of "array" lua2C */ | ||
30 | int num; /* size of "array" lua2C */ | ||
31 | } luaD_Cstack; | ||
32 | |||
33 | |||
34 | extern TObject luaD_errorim; | ||
35 | |||
36 | 18 | ||
37 | /* | 19 | /* |
38 | ** macro to increment stack top. | 20 | ** macro to increment stack top. |
39 | ** There must be always an empty slot at the luaD_stack.top | 21 | ** There must be always an empty slot at the L->stack.top |
40 | */ | 22 | */ |
41 | #define incr_top { if (luaD_stack.top >= luaD_stack.last) luaD_checkstack(1); \ | 23 | #define incr_top { if (L->stack.top >= L->stack.last) luaD_checkstack(1); \ |
42 | luaD_stack.top++; } | 24 | L->stack.top++; } |
43 | 25 | ||
44 | 26 | ||
45 | /* macros to convert from lua_Object to (TObject *) and back */ | 27 | /* macros to convert from lua_Object to (TObject *) and back */ |
46 | 28 | ||
47 | #define Address(lo) ((lo)+luaD_stack.stack-1) | 29 | #define Address(lo) ((lo)+L->stack.stack-1) |
48 | #define Ref(st) ((st)-luaD_stack.stack+1) | 30 | #define Ref(st) ((st)-L->stack.stack+1) |
49 | 31 | ||
50 | 32 | ||
51 | void luaD_init (void); | 33 | void luaD_init (void); |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lfunc.c,v 1.4 1997/10/23 16:26:37 roberto Exp roberto $ | 2 | ** $Id: lfunc.c,v 1.5 1997/10/24 17:17:24 roberto Exp roberto $ |
3 | ** Lua Funcion auxiliar | 3 | ** Lua Funcion auxiliar |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -9,20 +9,18 @@ | |||
9 | 9 | ||
10 | #include "lfunc.h" | 10 | #include "lfunc.h" |
11 | #include "lmem.h" | 11 | #include "lmem.h" |
12 | #include "lstate.h" | ||
12 | 13 | ||
13 | #define gcsizeproto(p) 5 | 14 | #define gcsizeproto(p) 5 |
14 | #define gcsizeclosure(c) 1 | 15 | #define gcsizeclosure(c) 1 |
15 | 16 | ||
16 | GCnode luaF_root = {NULL, 0}; | ||
17 | GCnode luaF_rootcl = {NULL, 0}; | ||
18 | |||
19 | 17 | ||
20 | 18 | ||
21 | Closure *luaF_newclosure (int nelems) | 19 | Closure *luaF_newclosure (int nelems) |
22 | { | 20 | { |
23 | Closure *c = (Closure *)luaM_malloc(sizeof(Closure)+nelems*sizeof(TObject)); | 21 | Closure *c = (Closure *)luaM_malloc(sizeof(Closure)+nelems*sizeof(TObject)); |
24 | luaO_insertlist(&luaF_rootcl, (GCnode *)c); | 22 | luaO_insertlist(&(L->rootcl), (GCnode *)c); |
25 | luaO_nblocks += gcsizeclosure(c); | 23 | L->nblocks += gcsizeclosure(c); |
26 | c->nelems = nelems; | 24 | c->nelems = nelems; |
27 | return c; | 25 | return c; |
28 | } | 26 | } |
@@ -46,8 +44,8 @@ TProtoFunc *luaF_newproto (void) | |||
46 | f->consts = NULL; | 44 | f->consts = NULL; |
47 | f->nconsts = 0; | 45 | f->nconsts = 0; |
48 | f->locvars = NULL; | 46 | f->locvars = NULL; |
49 | luaO_insertlist(&luaF_root, (GCnode *)f); | 47 | luaO_insertlist(&(L->rootproto), (GCnode *)f); |
50 | luaO_nblocks += gcsizeproto(f); | 48 | L->nblocks += gcsizeproto(f); |
51 | return f; | 49 | return f; |
52 | } | 50 | } |
53 | 51 | ||
@@ -66,7 +64,7 @@ void luaF_freeproto (TProtoFunc *l) | |||
66 | { | 64 | { |
67 | while (l) { | 65 | while (l) { |
68 | TProtoFunc *next = (TProtoFunc *)l->head.next; | 66 | TProtoFunc *next = (TProtoFunc *)l->head.next; |
69 | luaO_nblocks -= gcsizeproto(l); | 67 | L->nblocks -= gcsizeproto(l); |
70 | freefunc(l); | 68 | freefunc(l); |
71 | l = next; | 69 | l = next; |
72 | } | 70 | } |
@@ -77,7 +75,7 @@ void luaF_freeclosure (Closure *l) | |||
77 | { | 75 | { |
78 | while (l) { | 76 | while (l) { |
79 | Closure *next = (Closure *)l->head.next; | 77 | Closure *next = (Closure *)l->head.next; |
80 | luaO_nblocks -= gcsizeclosure(l); | 78 | L->nblocks -= gcsizeclosure(l); |
81 | luaM_free(l); | 79 | luaM_free(l); |
82 | l = next; | 80 | l = next; |
83 | } | 81 | } |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lfunc.h,v 1.2 1997/09/26 16:46:20 roberto Exp roberto $ | 2 | ** $Id: lfunc.h,v 1.3 1997/10/24 17:17:24 roberto Exp roberto $ |
3 | ** Lua Function structures | 3 | ** Lua Function structures |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -11,9 +11,6 @@ | |||
11 | #include "lobject.h" | 11 | #include "lobject.h" |
12 | 12 | ||
13 | 13 | ||
14 | extern GCnode luaF_root; | ||
15 | extern GCnode luaF_rootcl; | ||
16 | |||
17 | 14 | ||
18 | TProtoFunc *luaF_newproto (void); | 15 | TProtoFunc *luaF_newproto (void); |
19 | Closure *luaF_newclosure (int nelems); | 16 | Closure *luaF_newclosure (int nelems); |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lgc.c,v 1.6 1997/10/24 17:17:24 roberto Exp roberto $ | 2 | ** $Id: lgc.c,v 1.7 1997/11/03 20:45:23 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 | */ |
@@ -10,6 +10,7 @@ | |||
10 | #include "lgc.h" | 10 | #include "lgc.h" |
11 | #include "lmem.h" | 11 | #include "lmem.h" |
12 | #include "lobject.h" | 12 | #include "lobject.h" |
13 | #include "lstate.h" | ||
13 | #include "lstring.h" | 14 | #include "lstring.h" |
14 | #include "ltable.h" | 15 | #include "ltable.h" |
15 | #include "ltm.h" | 16 | #include "ltm.h" |
@@ -27,12 +28,6 @@ static int markobject (TObject *o); | |||
27 | ** ======================================================= | 28 | ** ======================================================= |
28 | */ | 29 | */ |
29 | 30 | ||
30 | static struct ref { | ||
31 | TObject o; | ||
32 | enum {LOCK, HOLD, FREE, COLLECTED} status; | ||
33 | } *refArray = NULL; | ||
34 | static int refSize = 0; | ||
35 | |||
36 | 31 | ||
37 | int luaC_ref (TObject *o, int lock) | 32 | int luaC_ref (TObject *o, int lock) |
38 | { | 33 | { |
@@ -40,18 +35,19 @@ int luaC_ref (TObject *o, int lock) | |||
40 | if (ttype(o) == LUA_T_NIL) | 35 | if (ttype(o) == LUA_T_NIL) |
41 | ref = -1; /* special ref for nil */ | 36 | ref = -1; /* special ref for nil */ |
42 | else { | 37 | else { |
43 | for (ref=0; ref<refSize; ref++) | 38 | for (ref=0; ref<L->refSize; ref++) |
44 | if (refArray[ref].status == FREE) | 39 | if (L->refArray[ref].status == FREE) |
45 | goto found; | 40 | goto found; |
46 | /* no more empty spaces */ { | 41 | /* no more empty spaces */ { |
47 | int oldSize = refSize; | 42 | int oldSize = L->refSize; |
48 | refSize = luaM_growvector(&refArray, refSize, struct ref, refEM, MAX_WORD); | 43 | L->refSize = luaM_growvector(&L->refArray, L->refSize, struct ref, |
49 | for (ref=oldSize; ref<refSize; ref++) | 44 | refEM, MAX_WORD); |
50 | refArray[ref].status = FREE; | 45 | for (ref=oldSize; ref<L->refSize; ref++) |
46 | L->refArray[ref].status = FREE; | ||
51 | ref = oldSize; | 47 | ref = oldSize; |
52 | } found: | 48 | } found: |
53 | refArray[ref].o = *o; | 49 | L->refArray[ref].o = *o; |
54 | refArray[ref].status = lock ? LOCK : HOLD; | 50 | L->refArray[ref].status = lock ? LOCK : HOLD; |
55 | } | 51 | } |
56 | return ref; | 52 | return ref; |
57 | } | 53 | } |
@@ -59,8 +55,8 @@ int luaC_ref (TObject *o, int lock) | |||
59 | 55 | ||
60 | void lua_unref (int ref) | 56 | void lua_unref (int ref) |
61 | { | 57 | { |
62 | if (ref >= 0 && ref < refSize) | 58 | if (ref >= 0 && ref < L->refSize) |
63 | refArray[ref].status = FREE; | 59 | L->refArray[ref].status = FREE; |
64 | } | 60 | } |
65 | 61 | ||
66 | 62 | ||
@@ -68,9 +64,9 @@ TObject* luaC_getref (int ref) | |||
68 | { | 64 | { |
69 | if (ref == -1) | 65 | if (ref == -1) |
70 | return &luaO_nilobject; | 66 | return &luaO_nilobject; |
71 | if (ref >= 0 && ref < refSize && | 67 | if (ref >= 0 && ref < L->refSize && |
72 | (refArray[ref].status == LOCK || refArray[ref].status == HOLD)) | 68 | (L->refArray[ref].status == LOCK || L->refArray[ref].status == HOLD)) |
73 | return &refArray[ref].o; | 69 | return &L->refArray[ref].o; |
74 | else | 70 | else |
75 | return NULL; | 71 | return NULL; |
76 | } | 72 | } |
@@ -79,9 +75,9 @@ TObject* luaC_getref (int ref) | |||
79 | static void travlock (void) | 75 | static void travlock (void) |
80 | { | 76 | { |
81 | int i; | 77 | int i; |
82 | for (i=0; i<refSize; i++) | 78 | for (i=0; i<L->refSize; i++) |
83 | if (refArray[i].status == LOCK) | 79 | if (L->refArray[i].status == LOCK) |
84 | markobject(&refArray[i].o); | 80 | markobject(&L->refArray[i].o); |
85 | } | 81 | } |
86 | 82 | ||
87 | 83 | ||
@@ -105,9 +101,9 @@ static int ismarked (TObject *o) | |||
105 | static void invalidaterefs (void) | 101 | static void invalidaterefs (void) |
106 | { | 102 | { |
107 | int i; | 103 | int i; |
108 | for (i=0; i<refSize; i++) | 104 | for (i=0; i<L->refSize; i++) |
109 | if (refArray[i].status == HOLD && !ismarked(&refArray[i].o)) | 105 | if (L->refArray[i].status == HOLD && !ismarked(&L->refArray[i].o)) |
110 | refArray[i].status = COLLECTED; | 106 | L->refArray[i].status = COLLECTED; |
111 | } | 107 | } |
112 | 108 | ||
113 | 109 | ||
@@ -210,7 +206,7 @@ static void hashmark (Hash *h) | |||
210 | static void globalmark (void) | 206 | static void globalmark (void) |
211 | { | 207 | { |
212 | TaggedString *g; | 208 | TaggedString *g; |
213 | for (g=(TaggedString *)luaS_root.next; g; g=(TaggedString *)g->head.next) | 209 | for (g=(TaggedString *)L->rootglobal.next; g; g=(TaggedString *)g->head.next) |
214 | if (g->u.globalval.ttype != LUA_T_NIL) { | 210 | if (g->u.globalval.ttype != LUA_T_NIL) { |
215 | markobject(&g->u.globalval); | 211 | markobject(&g->u.globalval); |
216 | strmark(g); /* cannot collect non nil global variables */ | 212 | strmark(g); /* cannot collect non nil global variables */ |
@@ -240,23 +236,19 @@ static int markobject (TObject *o) | |||
240 | 236 | ||
241 | 237 | ||
242 | 238 | ||
243 | #define GARBAGE_BLOCK 150 | ||
244 | |||
245 | unsigned long luaC_threshold = GARBAGE_BLOCK; | ||
246 | |||
247 | |||
248 | static void markall (void) | 239 | static void markall (void) |
249 | { | 240 | { |
250 | luaD_travstack(markobject); /* mark stack objects */ | 241 | luaD_travstack(markobject); /* mark stack objects */ |
251 | globalmark(); /* mark global variable values and names */ | 242 | globalmark(); /* mark global variable values and names */ |
252 | travlock(); /* mark locked objects */ | 243 | travlock(); /* mark locked objects */ |
244 | markobject(&L->globalbag); /* mark elements in global bag */ | ||
253 | luaT_travtagmethods(markobject); /* mark fallbacks */ | 245 | luaT_travtagmethods(markobject); /* mark fallbacks */ |
254 | } | 246 | } |
255 | 247 | ||
256 | 248 | ||
257 | long lua_collectgarbage (long limit) | 249 | long lua_collectgarbage (long limit) |
258 | { | 250 | { |
259 | unsigned long recovered = luaO_nblocks; /* to subtract nblocks after gc */ | 251 | unsigned long recovered = L->nblocks; /* to subtract nblocks after gc */ |
260 | Hash *freetable; | 252 | Hash *freetable; |
261 | TaggedString *freestr; | 253 | TaggedString *freestr; |
262 | TProtoFunc *freefunc; | 254 | TProtoFunc *freefunc; |
@@ -264,10 +256,10 @@ long lua_collectgarbage (long limit) | |||
264 | markall(); | 256 | markall(); |
265 | invalidaterefs(); | 257 | invalidaterefs(); |
266 | freestr = luaS_collector(); | 258 | freestr = luaS_collector(); |
267 | freetable = (Hash *)listcollect(&luaH_root); | 259 | freetable = (Hash *)listcollect(&(L->roottable)); |
268 | freefunc = (TProtoFunc *)listcollect(&luaF_root); | 260 | freefunc = (TProtoFunc *)listcollect(&(L->rootproto)); |
269 | freeclos = (Closure *)listcollect(&luaF_rootcl); | 261 | freeclos = (Closure *)listcollect(&(L->rootcl)); |
270 | luaC_threshold *= 4; /* to avoid GC during GC */ | 262 | L->GCthreshold *= 4; /* to avoid GC during GC */ |
271 | hashcallIM(freetable); /* GC tag methods for tables */ | 263 | hashcallIM(freetable); /* GC tag methods for tables */ |
272 | strcallIM(freestr); /* GC tag methods for userdata */ | 264 | strcallIM(freestr); /* GC tag methods for userdata */ |
273 | luaD_gcIM(&luaO_nilobject); /* GC tag method for nil (signal end of GC) */ | 265 | luaD_gcIM(&luaO_nilobject); /* GC tag method for nil (signal end of GC) */ |
@@ -276,16 +268,16 @@ long lua_collectgarbage (long limit) | |||
276 | luaF_freeproto(freefunc); | 268 | luaF_freeproto(freefunc); |
277 | luaF_freeclosure(freeclos); | 269 | luaF_freeclosure(freeclos); |
278 | luaM_clearbuffer(); | 270 | luaM_clearbuffer(); |
279 | recovered = recovered-luaO_nblocks; | 271 | recovered = recovered-L->nblocks; |
280 | /*printf("==total %ld coletados %ld\n", luaO_nblocks+recovered, recovered);*/ | 272 | /*printf("==total %ld coletados %ld\n", L->nblocks+recovered, recovered);*/ |
281 | luaC_threshold = (limit == 0) ? 2*luaO_nblocks : luaO_nblocks+limit; | 273 | L->GCthreshold = (limit == 0) ? 2*L->nblocks : L->nblocks+limit; |
282 | return recovered; | 274 | return recovered; |
283 | } | 275 | } |
284 | 276 | ||
285 | 277 | ||
286 | void luaC_checkGC (void) | 278 | void luaC_checkGC (void) |
287 | { | 279 | { |
288 | if (luaO_nblocks >= luaC_threshold) | 280 | if (L->nblocks >= L->GCthreshold) |
289 | lua_collectgarbage(0); | 281 | lua_collectgarbage(0); |
290 | } | 282 | } |
291 | 283 | ||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lgc.h,v 1.1 1997/09/16 19:25:59 roberto Exp roberto $ | 2 | ** $Id: lgc.h,v 1.2 1997/10/23 16:26:37 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 | */ |
@@ -11,8 +11,6 @@ | |||
11 | #include "lobject.h" | 11 | #include "lobject.h" |
12 | 12 | ||
13 | 13 | ||
14 | extern unsigned long luaC_threshold; | ||
15 | |||
16 | void luaC_checkGC (void); | 14 | void luaC_checkGC (void); |
17 | TObject* luaC_getref (int ref); | 15 | TObject* luaC_getref (int ref); |
18 | int luaC_ref (TObject *o, int lock); | 16 | int luaC_ref (TObject *o, int lock); |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: liolib.c,v 1.3 1997/10/30 20:29:09 roberto Exp roberto $ | 2 | ** $Id: liolib.c,v 1.4 1997/11/04 15:27:53 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 | */ |
@@ -41,8 +41,21 @@ int pclose(); | |||
41 | #endif | 41 | #endif |
42 | 42 | ||
43 | 43 | ||
44 | int lua_tagio; | 44 | static void createtag (char *t) |
45 | static int closedtag; | 45 | { |
46 | lua_pushobject(lua_globalbag()); | ||
47 | lua_pushstring(t); | ||
48 | lua_pushnumber(lua_newtag()); | ||
49 | lua_settable(); | ||
50 | } | ||
51 | |||
52 | |||
53 | static int gettag (char *t) | ||
54 | { | ||
55 | lua_pushobject(lua_globalbag()); | ||
56 | lua_pushstring(t); | ||
57 | return lua_getnumber(lua_gettable()); | ||
58 | } | ||
46 | 59 | ||
47 | 60 | ||
48 | static void pushresult (int i) | 61 | static void pushresult (int i) |
@@ -59,9 +72,9 @@ static void pushresult (int i) | |||
59 | static int ishandler (lua_Object f) | 72 | static int ishandler (lua_Object f) |
60 | { | 73 | { |
61 | if (lua_isuserdata(f)) { | 74 | if (lua_isuserdata(f)) { |
62 | if (lua_tag(f) == closedtag) | 75 | if (lua_tag(f) == gettag("closedtag")) |
63 | lua_error("trying to access a closed file"); | 76 | lua_error("trying to access a closed file"); |
64 | return lua_tag(f) == lua_tagio; | 77 | return lua_tag(f) == gettag("tagio"); |
65 | } | 78 | } |
66 | else return 0; | 79 | else return 0; |
67 | } | 80 | } |
@@ -94,13 +107,13 @@ static void closefile (char *name) | |||
94 | if (pclose(f) == -1) | 107 | if (pclose(f) == -1) |
95 | fclose(f); | 108 | fclose(f); |
96 | lua_pushobject(lua_getglobal(name)); | 109 | lua_pushobject(lua_getglobal(name)); |
97 | lua_settag(closedtag); | 110 | lua_settag(gettag("closedtag")); |
98 | } | 111 | } |
99 | 112 | ||
100 | 113 | ||
101 | static void setfile (FILE *f, char *name) | 114 | static void setfile (FILE *f, char *name) |
102 | { | 115 | { |
103 | lua_pushusertag(f, lua_tagio); | 116 | lua_pushusertag(f, gettag("tagio")); |
104 | lua_setglobal(name); | 117 | lua_setglobal(name); |
105 | } | 118 | } |
106 | 119 | ||
@@ -108,7 +121,7 @@ static void setfile (FILE *f, char *name) | |||
108 | static void setreturn (FILE *f, char *name) | 121 | static void setreturn (FILE *f, char *name) |
109 | { | 122 | { |
110 | setfile(f, name); | 123 | setfile(f, name); |
111 | lua_pushusertag(f, lua_tagio); | 124 | lua_pushusertag(f, gettag("tagio")); |
112 | } | 125 | } |
113 | 126 | ||
114 | 127 | ||
@@ -120,7 +133,7 @@ static void io_readfrom (void) | |||
120 | closefile("_INPUT"); | 133 | closefile("_INPUT"); |
121 | current = stdin; | 134 | current = stdin; |
122 | } | 135 | } |
123 | else if (lua_tag(f) == lua_tagio) | 136 | else if (lua_tag(f) == gettag("tagio")) |
124 | current = lua_getuserdata(f); | 137 | current = lua_getuserdata(f); |
125 | else { | 138 | else { |
126 | char *s = luaL_check_string(1); | 139 | char *s = luaL_check_string(1); |
@@ -142,7 +155,7 @@ static void io_writeto (void) | |||
142 | closefile("_OUTPUT"); | 155 | closefile("_OUTPUT"); |
143 | current = stdout; | 156 | current = stdout; |
144 | } | 157 | } |
145 | else if (lua_tag(f) == lua_tagio) | 158 | else if (lua_tag(f) == gettag("tagio")) |
146 | current = lua_getuserdata(f); | 159 | current = lua_getuserdata(f); |
147 | else { | 160 | else { |
148 | char *s = luaL_check_string(1); | 161 | char *s = luaL_check_string(1); |
@@ -373,8 +386,8 @@ static struct luaL_reg iolib[] = { | |||
373 | void lua_iolibopen (void) | 386 | void lua_iolibopen (void) |
374 | { | 387 | { |
375 | luaL_openlib(iolib, (sizeof(iolib)/sizeof(iolib[0]))); | 388 | luaL_openlib(iolib, (sizeof(iolib)/sizeof(iolib[0]))); |
376 | lua_tagio = lua_newtag(); | 389 | createtag("iotag"); |
377 | closedtag = lua_newtag(); | 390 | createtag("closedtag"); |
378 | setfile(stdin, "_INPUT"); | 391 | setfile(stdin, "_INPUT"); |
379 | setfile(stdout, "_OUTPUT"); | 392 | setfile(stdout, "_OUTPUT"); |
380 | setfile(stdin, "_STDIN"); | 393 | setfile(stdin, "_STDIN"); |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: llex.c,v 1.4 1997/11/04 15:27:53 roberto Exp roberto $ | 2 | ** $Id: llex.c,v 1.5 1997/11/07 15:09:49 roberto Exp roberto $ |
3 | ** Lexical Analizer | 3 | ** Lexical Analizer |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -12,35 +12,32 @@ | |||
12 | #include "lmem.h" | 12 | #include "lmem.h" |
13 | #include "lobject.h" | 13 | #include "lobject.h" |
14 | #include "lparser.h" | 14 | #include "lparser.h" |
15 | #include "lstate.h" | ||
15 | #include "lstring.h" | 16 | #include "lstring.h" |
16 | #include "lstx.h" | 17 | #include "lstx.h" |
17 | #include "luadebug.h" | 18 | #include "luadebug.h" |
18 | #include "lzio.h" | 19 | #include "lzio.h" |
19 | 20 | ||
20 | 21 | ||
21 | static int current; /* look ahead character */ | ||
22 | static ZIO *lex_z; | ||
23 | 22 | ||
24 | |||
25 | int luaX_linenumber; | ||
26 | int lua_debug=0; | 23 | int lua_debug=0; |
27 | 24 | ||
28 | 25 | ||
29 | #define next() (current = zgetc(lex_z)) | 26 | #define next(LL) (LL->current = zgetc(LL->lex_z)) |
30 | 27 | ||
31 | 28 | ||
29 | static struct { | ||
30 | char *name; | ||
31 | int token; | ||
32 | } reserved [] = { | ||
33 | {"and", AND}, {"do", DO}, {"else", ELSE}, {"elseif", ELSEIF}, | ||
34 | {"end", END}, {"function", FUNCTION}, {"if", IF}, {"local", LOCAL}, | ||
35 | {"nil", NIL}, {"not", NOT}, {"or", OR}, {"repeat", REPEAT}, | ||
36 | {"return", RETURN}, {"then", THEN}, {"until", UNTIL}, {"while", WHILE} | ||
37 | }; | ||
32 | 38 | ||
33 | void luaX_init (void) | 39 | void luaX_init (void) |
34 | { | 40 | { |
35 | static struct { | ||
36 | char *name; | ||
37 | int token; | ||
38 | } reserved [] = { | ||
39 | {"and", AND}, {"do", DO}, {"else", ELSE}, {"elseif", ELSEIF}, | ||
40 | {"end", END}, {"function", FUNCTION}, {"if", IF}, {"local", LOCAL}, | ||
41 | {"nil", NIL}, {"not", NOT}, {"or", OR}, {"repeat", REPEAT}, | ||
42 | {"return", RETURN}, {"then", THEN}, {"until", UNTIL}, {"while", WHILE} | ||
43 | }; | ||
44 | int i; | 41 | int i; |
45 | for (i=0; i<(sizeof(reserved)/sizeof(reserved[0])); i++) { | 42 | for (i=0; i<(sizeof(reserved)/sizeof(reserved[0])); i++) { |
46 | TaggedString *ts = luaS_new(reserved[i].name); | 43 | TaggedString *ts = luaS_new(reserved[i].name); |
@@ -49,47 +46,29 @@ void luaX_init (void) | |||
49 | } | 46 | } |
50 | 47 | ||
51 | 48 | ||
52 | 49 | static void firstline (LexState *LL) | |
53 | #define MAX_IFS 5 | ||
54 | |||
55 | /* "ifstate" keeps the state of each nested $if the lexical is dealing with. */ | ||
56 | |||
57 | static struct { | ||
58 | int elsepart; /* true if its in the $else part */ | ||
59 | int condition; /* true if $if condition is true */ | ||
60 | int skip; /* true if part must be skiped */ | ||
61 | } ifstate[MAX_IFS]; | ||
62 | |||
63 | static int iflevel; /* level of nested $if's */ | ||
64 | |||
65 | |||
66 | static struct textbuff { | ||
67 | char *text; | ||
68 | int tokensize; | ||
69 | int buffsize; | ||
70 | } textbuff; | ||
71 | |||
72 | |||
73 | static void firstline (void) | ||
74 | { | 50 | { |
75 | int c = zgetc(lex_z); | 51 | int c = zgetc(LL->lex_z); |
76 | if (c == '#') | 52 | if (c == '#') |
77 | while((c=zgetc(lex_z)) != '\n' && c != EOZ) /* skip first line */; | 53 | while((c=zgetc(LL->lex_z)) != '\n' && c != EOZ) /* skip first line */; |
78 | zungetc(lex_z); | 54 | zungetc(LL->lex_z); |
79 | } | 55 | } |
80 | 56 | ||
81 | 57 | ||
82 | void luaX_setinput (ZIO *z) | 58 | void luaX_setinput (ZIO *z) |
83 | { | 59 | { |
84 | current = '\n'; | 60 | LexState *LL = L->lexstate; |
85 | luaX_linenumber = 0; | 61 | LL->current = '\n'; |
86 | iflevel = 0; | 62 | LL->linelasttoken = 0; |
87 | ifstate[0].skip = 0; | 63 | LL->lastline = 0; |
88 | ifstate[0].elsepart = 1; /* to avoid a free $else */ | 64 | LL->linenumber = 0; |
89 | lex_z = z; | 65 | LL->iflevel = 0; |
90 | firstline(); | 66 | LL->ifstate[0].skip = 0; |
91 | textbuff.buffsize = 20; | 67 | LL->ifstate[0].elsepart = 1; /* to avoid a free $else */ |
92 | textbuff.text = luaM_buffer(textbuff.buffsize); | 68 | LL->lex_z = z; |
69 | firstline(LL); | ||
70 | LL->textbuff.buffsize = 20; | ||
71 | LL->textbuff.text = luaM_buffer(LL->textbuff.buffsize); | ||
93 | } | 72 | } |
94 | 73 | ||
95 | 74 | ||
@@ -102,9 +81,9 @@ void luaX_setinput (ZIO *z) | |||
102 | 81 | ||
103 | #define PRAGMASIZE 20 | 82 | #define PRAGMASIZE 20 |
104 | 83 | ||
105 | static void skipspace (void) | 84 | static void skipspace (LexState *LL) |
106 | { | 85 | { |
107 | while (current == ' ' || current == '\t') next(); | 86 | while (LL->current == ' ' || LL->current == '\t') next(LL); |
108 | } | 87 | } |
109 | 88 | ||
110 | 89 | ||
@@ -122,49 +101,49 @@ static int checkcond (char *buff) | |||
122 | } | 101 | } |
123 | 102 | ||
124 | 103 | ||
125 | static void readname (char *buff) | 104 | static void readname (LexState *LL, char *buff) |
126 | { | 105 | { |
127 | int i = 0; | 106 | int i = 0; |
128 | skipspace(); | 107 | skipspace(LL); |
129 | while (isalnum(current) || current == '_') { | 108 | while (isalnum(LL->current) || LL->current == '_') { |
130 | if (i >= PRAGMASIZE) { | 109 | if (i >= PRAGMASIZE) { |
131 | buff[PRAGMASIZE] = 0; | 110 | buff[PRAGMASIZE] = 0; |
132 | luaY_syntaxerror("pragma too long", buff); | 111 | luaY_syntaxerror("pragma too long", buff); |
133 | } | 112 | } |
134 | buff[i++] = current; | 113 | buff[i++] = LL->current; |
135 | next(); | 114 | next(LL); |
136 | } | 115 | } |
137 | buff[i] = 0; | 116 | buff[i] = 0; |
138 | } | 117 | } |
139 | 118 | ||
140 | 119 | ||
141 | static void inclinenumber (void); | 120 | static void inclinenumber (LexState *LL); |
142 | 121 | ||
143 | 122 | ||
144 | static void ifskip (void) | 123 | static void ifskip (LexState *LL) |
145 | { | 124 | { |
146 | while (ifstate[iflevel].skip) { | 125 | while (LL->ifstate[LL->iflevel].skip) { |
147 | if (current == '\n') | 126 | if (LL->current == '\n') |
148 | inclinenumber(); | 127 | inclinenumber(LL); |
149 | else if (current == EOZ) | 128 | else if (LL->current == EOZ) |
150 | luaY_syntaxerror("input ends inside a $if", ""); | 129 | luaY_syntaxerror("input ends inside a $if", ""); |
151 | else next(); | 130 | else next(LL); |
152 | } | 131 | } |
153 | } | 132 | } |
154 | 133 | ||
155 | 134 | ||
156 | static void inclinenumber (void) | 135 | static void inclinenumber (LexState *LL) |
157 | { | 136 | { |
158 | static char *pragmas [] = | 137 | static char *pragmas [] = |
159 | {"debug", "nodebug", "endinput", "end", "ifnot", "if", "else", NULL}; | 138 | {"debug", "nodebug", "endinput", "end", "ifnot", "if", "else", NULL}; |
160 | next(); /* skip '\n' */ | 139 | next(LL); /* skip '\n' */ |
161 | ++luaX_linenumber; | 140 | ++LL->linenumber; |
162 | if (current == '$') { /* is a pragma? */ | 141 | if (LL->current == '$') { /* is a pragma? */ |
163 | char buff[PRAGMASIZE+1]; | 142 | char buff[PRAGMASIZE+1]; |
164 | int ifnot = 0; | 143 | int ifnot = 0; |
165 | int skip = ifstate[iflevel].skip; | 144 | int skip = LL->ifstate[LL->iflevel].skip; |
166 | next(); /* skip $ */ | 145 | next(LL); /* skip $ */ |
167 | readname(buff); | 146 | readname(LL, buff); |
168 | switch (luaO_findstring(buff, pragmas)) { | 147 | switch (luaO_findstring(buff, pragmas)) { |
169 | case 0: /* debug */ | 148 | case 0: /* debug */ |
170 | if (!skip) lua_debug = 1; | 149 | if (!skip) lua_debug = 1; |
@@ -174,42 +153,42 @@ static void inclinenumber (void) | |||
174 | break; | 153 | break; |
175 | case 2: /* endinput */ | 154 | case 2: /* endinput */ |
176 | if (!skip) { | 155 | if (!skip) { |
177 | current = EOZ; | 156 | LL->current = EOZ; |
178 | iflevel = 0; /* to allow $endinput inside a $if */ | 157 | LL->iflevel = 0; /* to allow $endinput inside a $if */ |
179 | } | 158 | } |
180 | break; | 159 | break; |
181 | case 3: /* end */ | 160 | case 3: /* end */ |
182 | if (iflevel-- == 0) | 161 | if (LL->iflevel-- == 0) |
183 | luaY_syntaxerror("unmatched $end", "$end"); | 162 | luaY_syntaxerror("unmatched $end", "$end"); |
184 | break; | 163 | break; |
185 | case 4: /* ifnot */ | 164 | case 4: /* ifnot */ |
186 | ifnot = 1; | 165 | ifnot = 1; |
187 | /* go through */ | 166 | /* go through */ |
188 | case 5: /* if */ | 167 | case 5: /* if */ |
189 | if (iflevel == MAX_IFS-1) | 168 | if (LL->iflevel == MAX_IFS-1) |
190 | luaY_syntaxerror("too many nested `$ifs'", "$if"); | 169 | luaY_syntaxerror("too many nested `$ifs'", "$if"); |
191 | readname(buff); | 170 | readname(LL, buff); |
192 | iflevel++; | 171 | LL->iflevel++; |
193 | ifstate[iflevel].elsepart = 0; | 172 | LL->ifstate[LL->iflevel].elsepart = 0; |
194 | ifstate[iflevel].condition = checkcond(buff) ? !ifnot : ifnot; | 173 | LL->ifstate[LL->iflevel].condition = checkcond(buff) ? !ifnot : ifnot; |
195 | ifstate[iflevel].skip = skip || !ifstate[iflevel].condition; | 174 | LL->ifstate[LL->iflevel].skip = skip || !LL->ifstate[LL->iflevel].condition; |
196 | break; | 175 | break; |
197 | case 6: /* else */ | 176 | case 6: /* else */ |
198 | if (ifstate[iflevel].elsepart) | 177 | if (LL->ifstate[LL->iflevel].elsepart) |
199 | luaY_syntaxerror("unmatched $else", "$else"); | 178 | luaY_syntaxerror("unmatched $else", "$else"); |
200 | ifstate[iflevel].elsepart = 1; | 179 | LL->ifstate[LL->iflevel].elsepart = 1; |
201 | ifstate[iflevel].skip = | 180 | LL->ifstate[LL->iflevel].skip = LL->ifstate[LL->iflevel-1].skip || |
202 | ifstate[iflevel-1].skip || ifstate[iflevel].condition; | 181 | LL->ifstate[LL->iflevel].condition; |
203 | break; | 182 | break; |
204 | default: | 183 | default: |
205 | luaY_syntaxerror("invalid pragma", buff); | 184 | luaY_syntaxerror("invalid pragma", buff); |
206 | } | 185 | } |
207 | skipspace(); | 186 | skipspace(LL); |
208 | if (current == '\n') /* pragma must end with a '\n' ... */ | 187 | if (LL->current == '\n') /* pragma must end with a '\n' ... */ |
209 | inclinenumber(); | 188 | inclinenumber(LL); |
210 | else if (current != EOZ) /* or eof */ | 189 | else if (LL->current != EOZ) /* or eof */ |
211 | luaY_syntaxerror("invalid pragma format", buff); | 190 | luaY_syntaxerror("invalid pragma format", buff); |
212 | ifskip(); | 191 | ifskip(LL); |
213 | } | 192 | } |
214 | } | 193 | } |
215 | 194 | ||
@@ -222,162 +201,167 @@ static void inclinenumber (void) | |||
222 | 201 | ||
223 | 202 | ||
224 | 203 | ||
225 | static void save (int c) | 204 | static void save (LexState *LL, int c) |
226 | { | 205 | { |
227 | if (textbuff.tokensize >= textbuff.buffsize) | 206 | if (LL->textbuff.tokensize >= LL->textbuff.buffsize) |
228 | textbuff.text = luaM_buffer(textbuff.buffsize *= 2); | 207 | LL->textbuff.text = luaM_buffer(LL->textbuff.buffsize *= 2); |
229 | textbuff.text[textbuff.tokensize++] = c; | 208 | LL->textbuff.text[LL->textbuff.tokensize++] = c; |
230 | } | 209 | } |
231 | 210 | ||
232 | 211 | ||
233 | char *luaX_lasttoken (void) | 212 | char *luaX_lasttoken (void) |
234 | { | 213 | { |
235 | save(0); | 214 | save(L->lexstate, 0); |
236 | return textbuff.text; | 215 | return L->lexstate->textbuff.text; |
237 | } | 216 | } |
238 | 217 | ||
239 | 218 | ||
240 | #define save_and_next() (save(current), next()) | 219 | #define save_and_next(LL) (save(LL, LL->current), next(LL)) |
241 | 220 | ||
242 | 221 | ||
243 | static int read_long_string (void) | 222 | static int read_long_string (LexState *LL, YYSTYPE *l) |
244 | { | 223 | { |
245 | int cont = 0; | 224 | int cont = 0; |
246 | while (1) { | 225 | while (1) { |
247 | switch (current) { | 226 | switch (LL->current) { |
248 | case EOZ: | 227 | case EOZ: |
249 | save(0); | 228 | save(LL, 0); |
250 | return WRONGTOKEN; | 229 | return WRONGTOKEN; |
251 | case '[': | 230 | case '[': |
252 | save_and_next(); | 231 | save_and_next(LL); |
253 | if (current == '[') { | 232 | if (LL->current == '[') { |
254 | cont++; | 233 | cont++; |
255 | save_and_next(); | 234 | save_and_next(LL); |
256 | } | 235 | } |
257 | continue; | 236 | continue; |
258 | case ']': | 237 | case ']': |
259 | save_and_next(); | 238 | save_and_next(LL); |
260 | if (current == ']') { | 239 | if (LL->current == ']') { |
261 | if (cont == 0) goto endloop; | 240 | if (cont == 0) goto endloop; |
262 | cont--; | 241 | cont--; |
263 | save_and_next(); | 242 | save_and_next(LL); |
264 | } | 243 | } |
265 | continue; | 244 | continue; |
266 | case '\n': | 245 | case '\n': |
267 | save('\n'); | 246 | save(LL, '\n'); |
268 | inclinenumber(); | 247 | inclinenumber(LL); |
269 | continue; | 248 | continue; |
270 | default: | 249 | default: |
271 | save_and_next(); | 250 | save_and_next(LL); |
272 | } | 251 | } |
273 | } endloop: | 252 | } endloop: |
274 | save_and_next(); /* pass the second ']' */ | 253 | save_and_next(LL); /* pass the second ']' */ |
275 | textbuff.text[textbuff.tokensize-2] = 0; /* erases ']]' */ | 254 | LL->textbuff.text[LL->textbuff.tokensize-2] = 0; /* erases ']]' */ |
276 | luaY_lval.pTStr = luaS_new(textbuff.text+2); | 255 | l->pTStr = luaS_new(LL->textbuff.text+2); |
277 | textbuff.text[textbuff.tokensize-2] = ']'; /* restores ']]' */ | 256 | LL->textbuff.text[LL->textbuff.tokensize-2] = ']'; /* restores ']]' */ |
278 | return STRING; | 257 | return STRING; |
279 | } | 258 | } |
280 | 259 | ||
281 | 260 | ||
282 | int luaY_lex (void) | 261 | /* to avoid warnings; this declaration cannot be public since YYSTYPE |
262 | ** cannot be visible in llex.h (otherwise there is an error, since | ||
263 | ** the parser body redefines it!) | ||
264 | */ | ||
265 | int luaY_lex (YYSTYPE *l); | ||
266 | int luaY_lex (YYSTYPE *l) | ||
283 | { | 267 | { |
284 | static int linelasttoken = 0; | 268 | LexState *LL = L->lexstate; |
285 | double a; | 269 | double a; |
286 | textbuff.tokensize = 0; | 270 | LL->textbuff.tokensize = 0; |
287 | if (lua_debug) | 271 | if (lua_debug) |
288 | luaY_codedebugline(linelasttoken); | 272 | luaY_codedebugline(LL->linelasttoken); |
289 | linelasttoken = luaX_linenumber; | 273 | LL->linelasttoken = LL->linenumber; |
290 | while (1) { | 274 | while (1) { |
291 | switch (current) { | 275 | switch (LL->current) { |
292 | case '\n': | 276 | case '\n': |
293 | inclinenumber(); | 277 | inclinenumber(LL); |
294 | linelasttoken = luaX_linenumber; | 278 | LL->linelasttoken = LL->linenumber; |
295 | continue; | 279 | continue; |
296 | 280 | ||
297 | case ' ': case '\t': case '\r': /* CR: to avoid problems with DOS */ | 281 | case ' ': case '\t': case '\r': /* CR: to avoid problems with DOS */ |
298 | next(); | 282 | next(LL); |
299 | continue; | 283 | continue; |
300 | 284 | ||
301 | case '-': | 285 | case '-': |
302 | save_and_next(); | 286 | save_and_next(LL); |
303 | if (current != '-') return '-'; | 287 | if (LL->current != '-') return '-'; |
304 | do { next(); } while (current != '\n' && current != EOZ); | 288 | do { next(LL); } while (LL->current != '\n' && LL->current != EOZ); |
305 | textbuff.tokensize = 0; | 289 | LL->textbuff.tokensize = 0; |
306 | continue; | 290 | continue; |
307 | 291 | ||
308 | case '[': | 292 | case '[': |
309 | save_and_next(); | 293 | save_and_next(LL); |
310 | if (current != '[') return '['; | 294 | if (LL->current != '[') return '['; |
311 | else { | 295 | else { |
312 | save_and_next(); /* pass the second '[' */ | 296 | save_and_next(LL); /* pass the second '[' */ |
313 | return read_long_string(); | 297 | return read_long_string(LL, l); |
314 | } | 298 | } |
315 | 299 | ||
316 | case '=': | 300 | case '=': |
317 | save_and_next(); | 301 | save_and_next(LL); |
318 | if (current != '=') return '='; | 302 | if (LL->current != '=') return '='; |
319 | else { save_and_next(); return EQ; } | 303 | else { save_and_next(LL); return EQ; } |
320 | 304 | ||
321 | case '<': | 305 | case '<': |
322 | save_and_next(); | 306 | save_and_next(LL); |
323 | if (current != '=') return '<'; | 307 | if (LL->current != '=') return '<'; |
324 | else { save_and_next(); return LE; } | 308 | else { save_and_next(LL); return LE; } |
325 | 309 | ||
326 | case '>': | 310 | case '>': |
327 | save_and_next(); | 311 | save_and_next(LL); |
328 | if (current != '=') return '>'; | 312 | if (LL->current != '=') return '>'; |
329 | else { save_and_next(); return GE; } | 313 | else { save_and_next(LL); return GE; } |
330 | 314 | ||
331 | case '~': | 315 | case '~': |
332 | save_and_next(); | 316 | save_and_next(LL); |
333 | if (current != '=') return '~'; | 317 | if (LL->current != '=') return '~'; |
334 | else { save_and_next(); return NE; } | 318 | else { save_and_next(LL); return NE; } |
335 | 319 | ||
336 | case '"': | 320 | case '"': |
337 | case '\'': { | 321 | case '\'': { |
338 | int del = current; | 322 | int del = LL->current; |
339 | save_and_next(); | 323 | save_and_next(LL); |
340 | while (current != del) { | 324 | while (LL->current != del) { |
341 | switch (current) { | 325 | switch (LL->current) { |
342 | case EOZ: | 326 | case EOZ: |
343 | case '\n': | 327 | case '\n': |
344 | save(0); | 328 | save(LL, 0); |
345 | return WRONGTOKEN; | 329 | return WRONGTOKEN; |
346 | case '\\': | 330 | case '\\': |
347 | next(); /* do not save the '\' */ | 331 | next(LL); /* do not save the '\' */ |
348 | switch (current) { | 332 | switch (LL->current) { |
349 | case 'n': save('\n'); next(); break; | 333 | case 'n': save(LL, '\n'); next(LL); break; |
350 | case 't': save('\t'); next(); break; | 334 | case 't': save(LL, '\t'); next(LL); break; |
351 | case 'r': save('\r'); next(); break; | 335 | case 'r': save(LL, '\r'); next(LL); break; |
352 | case '\n': save('\n'); inclinenumber(); break; | 336 | case '\n': save(LL, '\n'); inclinenumber(LL); break; |
353 | default : save_and_next(); break; | 337 | default : save_and_next(LL); break; |
354 | } | 338 | } |
355 | break; | 339 | break; |
356 | default: | 340 | default: |
357 | save_and_next(); | 341 | save_and_next(LL); |
358 | } | 342 | } |
359 | } | 343 | } |
360 | next(); /* skip delimiter */ | 344 | next(LL); /* skip delimiter */ |
361 | save(0); | 345 | save(LL, 0); |
362 | luaY_lval.pTStr = luaS_new(textbuff.text+1); | 346 | l->pTStr = luaS_new(LL->textbuff.text+1); |
363 | textbuff.text[textbuff.tokensize-1] = del; /* restore delimiter */ | 347 | LL->textbuff.text[LL->textbuff.tokensize-1] = del; /* restore delimiter */ |
364 | return STRING; | 348 | return STRING; |
365 | } | 349 | } |
366 | 350 | ||
367 | case '.': | 351 | case '.': |
368 | save_and_next(); | 352 | save_and_next(LL); |
369 | if (current == '.') | 353 | if (LL->current == '.') |
370 | { | 354 | { |
371 | save_and_next(); | 355 | save_and_next(LL); |
372 | if (current == '.') | 356 | if (LL->current == '.') |
373 | { | 357 | { |
374 | save_and_next(); | 358 | save_and_next(LL); |
375 | return DOTS; /* ... */ | 359 | return DOTS; /* ... */ |
376 | } | 360 | } |
377 | else return CONC; /* .. */ | 361 | else return CONC; /* .. */ |
378 | } | 362 | } |
379 | else if (!isdigit(current)) return '.'; | 363 | else if (!isdigit(LL->current)) return '.'; |
380 | /* current is a digit: goes through to number */ | 364 | /* LL->current is a digit: goes through to number */ |
381 | a=0.0; | 365 | a=0.0; |
382 | goto fraction; | 366 | goto fraction; |
383 | 367 | ||
@@ -385,69 +369,69 @@ int luaY_lex (void) | |||
385 | case '5': case '6': case '7': case '8': case '9': | 369 | case '5': case '6': case '7': case '8': case '9': |
386 | a=0.0; | 370 | a=0.0; |
387 | do { | 371 | do { |
388 | a=10.0*a+(current-'0'); | 372 | a=10.0*a+(LL->current-'0'); |
389 | save_and_next(); | 373 | save_and_next(LL); |
390 | } while (isdigit(current)); | 374 | } while (isdigit(LL->current)); |
391 | if (current == '.') { | 375 | if (LL->current == '.') { |
392 | save_and_next(); | 376 | save_and_next(LL); |
393 | if (current == '.') { | 377 | if (LL->current == '.') { |
394 | save(0); | 378 | save(LL, 0); |
395 | luaY_error( | 379 | luaY_error( |
396 | "ambiguous syntax (decimal point x string concatenation)"); | 380 | "ambiguous syntax (decimal point x string concatenation)"); |
397 | } | 381 | } |
398 | } | 382 | } |
399 | fraction: | 383 | fraction: |
400 | { double da=0.1; | 384 | { double da=0.1; |
401 | while (isdigit(current)) | 385 | while (isdigit(LL->current)) |
402 | { | 386 | { |
403 | a+=(current-'0')*da; | 387 | a+=(LL->current-'0')*da; |
404 | da/=10.0; | 388 | da/=10.0; |
405 | save_and_next(); | 389 | save_and_next(LL); |
406 | } | 390 | } |
407 | if (toupper(current) == 'E') { | 391 | if (toupper(LL->current) == 'E') { |
408 | int e=0; | 392 | int e=0; |
409 | int neg; | 393 | int neg; |
410 | double ea; | 394 | double ea; |
411 | save_and_next(); | 395 | save_and_next(LL); |
412 | neg=(current=='-'); | 396 | neg=(LL->current=='-'); |
413 | if (current == '+' || current == '-') save_and_next(); | 397 | if (LL->current == '+' || LL->current == '-') save_and_next(LL); |
414 | if (!isdigit(current)) { | 398 | if (!isdigit(LL->current)) { |
415 | save(0); return WRONGTOKEN; } | 399 | save(LL, 0); return WRONGTOKEN; } |
416 | do { | 400 | do { |
417 | e=10.0*e+(current-'0'); | 401 | e=10.0*e+(LL->current-'0'); |
418 | save_and_next(); | 402 | save_and_next(LL); |
419 | } while (isdigit(current)); | 403 | } while (isdigit(LL->current)); |
420 | for (ea=neg?0.1:10.0; e>0; e>>=1) | 404 | for (ea=neg?0.1:10.0; e>0; e>>=1) |
421 | { | 405 | { |
422 | if (e & 1) a*=ea; | 406 | if (e & 1) a*=ea; |
423 | ea*=ea; | 407 | ea*=ea; |
424 | } | 408 | } |
425 | } | 409 | } |
426 | luaY_lval.vReal = a; | 410 | l->vReal = a; |
427 | return NUMBER; | 411 | return NUMBER; |
428 | } | 412 | } |
429 | 413 | ||
430 | case EOZ: | 414 | case EOZ: |
431 | save(0); | 415 | save(LL, 0); |
432 | if (iflevel > 0) | 416 | if (LL->iflevel > 0) |
433 | luaY_error("missing $endif"); | 417 | luaY_error("missing $endif"); |
434 | return 0; | 418 | return 0; |
435 | 419 | ||
436 | default: | 420 | default: |
437 | if (current != '_' && !isalpha(current)) { | 421 | if (LL->current != '_' && !isalpha(LL->current)) { |
438 | save_and_next(); | 422 | save_and_next(LL); |
439 | return textbuff.text[0]; | 423 | return LL->textbuff.text[0]; |
440 | } | 424 | } |
441 | else { /* identifier or reserved word */ | 425 | else { /* identifier or reserved word */ |
442 | TaggedString *ts; | 426 | TaggedString *ts; |
443 | do { | 427 | do { |
444 | save_and_next(); | 428 | save_and_next(LL); |
445 | } while (isalnum(current) || current == '_'); | 429 | } while (isalnum(LL->current) || LL->current == '_'); |
446 | save(0); | 430 | save(LL, 0); |
447 | ts = luaS_new(textbuff.text); | 431 | ts = luaS_new(LL->textbuff.text); |
448 | if (ts->head.marked > 255) | 432 | if (ts->head.marked > 255) |
449 | return ts->head.marked; /* reserved word */ | 433 | return ts->head.marked; /* reserved word */ |
450 | luaY_lval.pTStr = ts; | 434 | l->pTStr = ts; |
451 | return NAME; | 435 | return NAME; |
452 | } | 436 | } |
453 | } | 437 | } |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: llex.h,v 1.1 1997/09/16 19:25:59 roberto Exp roberto $ | 2 | ** $Id: llex.h,v 1.2 1997/11/04 15:27:53 roberto Exp roberto $ |
3 | ** Lexical Analizer | 3 | ** Lexical Analizer |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -11,11 +11,39 @@ | |||
11 | #include "lzio.h" | 11 | #include "lzio.h" |
12 | 12 | ||
13 | 13 | ||
14 | #define MAX_IFS 5 | ||
15 | |||
16 | /* "ifstate" keeps the state of each nested $if the lexical is dealing with. */ | ||
17 | |||
18 | struct ifState { | ||
19 | int elsepart; /* true if its in the $else part */ | ||
20 | int condition; /* true if $if condition is true */ | ||
21 | int skip; /* true if part must be skiped */ | ||
22 | }; | ||
23 | |||
24 | struct textBuff { | ||
25 | char *text; | ||
26 | int tokensize; | ||
27 | int buffsize; | ||
28 | }; | ||
29 | |||
30 | |||
31 | typedef struct LexState { | ||
32 | int current; /* look ahead character */ | ||
33 | struct zio *lex_z; | ||
34 | int linenumber; | ||
35 | struct ifState ifstate[MAX_IFS]; | ||
36 | int iflevel; /* level of nested $if's (for lexical analysis) */ | ||
37 | struct textBuff textbuff; | ||
38 | int linelasttoken; | ||
39 | int lastline; | ||
40 | } LexState; | ||
41 | |||
42 | |||
14 | extern int luaX_linenumber; | 43 | extern int luaX_linenumber; |
15 | 44 | ||
16 | 45 | ||
17 | void luaX_init (void); | 46 | void luaX_init (void); |
18 | int luaY_lex (void); | ||
19 | void luaX_setinput (ZIO *z); | 47 | void luaX_setinput (ZIO *z); |
20 | char *luaX_lasttoken (void); | 48 | char *luaX_lasttoken (void); |
21 | 49 | ||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: $ | 2 | ** $Id: lmem.c,v 1.1 1997/09/16 19:25:59 roberto Exp roberto $ |
3 | ** Interface to Memory Manager | 3 | ** Interface to Memory Manager |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -8,6 +8,7 @@ | |||
8 | #include <stdlib.h> | 8 | #include <stdlib.h> |
9 | 9 | ||
10 | #include "lmem.h" | 10 | #include "lmem.h" |
11 | #include "lstate.h" | ||
11 | #include "lua.h" | 12 | #include "lua.h" |
12 | 13 | ||
13 | 14 | ||
@@ -25,24 +26,21 @@ int luaM_growaux (void **block, unsigned long nelems, int size, | |||
25 | } | 26 | } |
26 | 27 | ||
27 | 28 | ||
28 | static unsigned long Mbuffsize = 0; | ||
29 | static char *Mbuffer = NULL; | ||
30 | |||
31 | 29 | ||
32 | void *luaM_buffer (unsigned long size) | 30 | void *luaM_buffer (unsigned long size) |
33 | { | 31 | { |
34 | if (size > Mbuffsize) { | 32 | if (size > L->Mbuffsize) { |
35 | Mbuffsize = size; | 33 | L->Mbuffsize = size; |
36 | Mbuffer = luaM_realloc(Mbuffer, Mbuffsize); | 34 | L->Mbuffer = luaM_realloc(L->Mbuffer, L->Mbuffsize); |
37 | } | 35 | } |
38 | return Mbuffer; | 36 | return L->Mbuffer; |
39 | } | 37 | } |
40 | 38 | ||
41 | 39 | ||
42 | void luaM_clearbuffer (void) | 40 | void luaM_clearbuffer (void) |
43 | { | 41 | { |
44 | Mbuffsize /= 2; | 42 | L->Mbuffsize /= 2; |
45 | Mbuffer = luaM_realloc(Mbuffer, Mbuffsize); | 43 | L->Mbuffer = luaM_realloc(L->Mbuffer, L->Mbuffsize); |
46 | } | 44 | } |
47 | 45 | ||
48 | 46 | ||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lobject.c,v 1.5 1997/10/24 17:17:24 roberto Exp roberto $ | 2 | ** $Id: lobject.c,v 1.6 1997/11/03 20:45:23 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 | */ |
@@ -21,9 +21,6 @@ TObject luaO_nilobject = {LUA_T_NIL, {NULL}}; | |||
21 | 21 | ||
22 | 22 | ||
23 | 23 | ||
24 | unsigned long luaO_nblocks = 0; | ||
25 | |||
26 | |||
27 | /* hash dimensions values */ | 24 | /* hash dimensions values */ |
28 | static long dimensions[] = | 25 | static long dimensions[] = |
29 | {5L, 11L, 23L, 47L, 97L, 197L, 397L, 797L, 1597L, 3203L, 6421L, | 26 | {5L, 11L, 23L, 47L, 97L, 197L, 397L, 797L, 1597L, 3203L, 6421L, |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lobject.h,v 1.7 1997/10/24 17:17:24 roberto Exp roberto $ | 2 | ** $Id: lobject.h,v 1.8 1997/11/03 20:45:23 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 | */ |
@@ -162,7 +162,6 @@ typedef struct Hash { | |||
162 | ** a gross estimation of number of memory "blocks" allocated | 162 | ** a gross estimation of number of memory "blocks" allocated |
163 | ** (a block is *roughly* 32 bytes) | 163 | ** (a block is *roughly* 32 bytes) |
164 | */ | 164 | */ |
165 | extern unsigned long luaO_nblocks; | ||
166 | 165 | ||
167 | extern char *luaO_typenames[]; | 166 | extern char *luaO_typenames[]; |
168 | 167 | ||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lstring.c,v 1.3 1997/10/23 16:26:37 roberto Exp roberto $ | 2 | ** $Id: lstring.c,v 1.4 1997/11/04 15:27:53 roberto Exp roberto $ |
3 | ** String table (keep all strings handled by Lua) | 3 | ** String table (keep all strings handled by Lua) |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -9,6 +9,7 @@ | |||
9 | 9 | ||
10 | #include "lmem.h" | 10 | #include "lmem.h" |
11 | #include "lobject.h" | 11 | #include "lobject.h" |
12 | #include "lstate.h" | ||
12 | #include "lstring.h" | 13 | #include "lstring.h" |
13 | #include "lua.h" | 14 | #include "lua.h" |
14 | 15 | ||
@@ -19,18 +20,6 @@ | |||
19 | #define gcsizestring(l) (1+(l/64)) | 20 | #define gcsizestring(l) (1+(l/64)) |
20 | 21 | ||
21 | 22 | ||
22 | GCnode luaS_root = {NULL, 0}; /* list of global variables */ | ||
23 | |||
24 | |||
25 | typedef struct { | ||
26 | int size; | ||
27 | int nuse; /* number of elements (including EMPTYs) */ | ||
28 | TaggedString **hash; | ||
29 | } stringtable; | ||
30 | |||
31 | |||
32 | static stringtable string_root[NUM_HASHS]; | ||
33 | |||
34 | 23 | ||
35 | static TaggedString EMPTY = {{NULL, 2}, 0, 0L, {{LUA_T_NIL, {NULL}}}, {0}}; | 24 | static TaggedString EMPTY = {{NULL, 2}, 0, 0L, {{LUA_T_NIL, {NULL}}}, {0}}; |
36 | 25 | ||
@@ -38,10 +27,11 @@ static TaggedString EMPTY = {{NULL, 2}, 0, 0L, {{LUA_T_NIL, {NULL}}}, {0}}; | |||
38 | void luaS_init (void) | 27 | void luaS_init (void) |
39 | { | 28 | { |
40 | int i; | 29 | int i; |
30 | L->string_root = luaM_newvector(NUM_HASHS, stringtable); | ||
41 | for (i=0; i<NUM_HASHS; i++) { | 31 | for (i=0; i<NUM_HASHS; i++) { |
42 | string_root[i].size = 0; | 32 | L->string_root[i].size = 0; |
43 | string_root[i].nuse = 0; | 33 | L->string_root[i].nuse = 0; |
44 | string_root[i].hash = NULL; | 34 | L->string_root[i].hash = NULL; |
45 | } | 35 | } |
46 | } | 36 | } |
47 | 37 | ||
@@ -93,14 +83,14 @@ static TaggedString *newone(char *buff, int tag, unsigned long h) | |||
93 | strcpy(ts->str, buff); | 83 | strcpy(ts->str, buff); |
94 | ts->u.globalval.ttype = LUA_T_NIL; /* initialize global value */ | 84 | ts->u.globalval.ttype = LUA_T_NIL; /* initialize global value */ |
95 | ts->constindex = 0; | 85 | ts->constindex = 0; |
96 | luaO_nblocks += gcsizestring(l); | 86 | L->nblocks += gcsizestring(l); |
97 | } | 87 | } |
98 | else { | 88 | else { |
99 | ts = (TaggedString *)luaM_malloc(sizeof(TaggedString)); | 89 | ts = (TaggedString *)luaM_malloc(sizeof(TaggedString)); |
100 | ts->u.d.v = buff; | 90 | ts->u.d.v = buff; |
101 | ts->u.d.tag = tag == LUA_ANYTAG ? 0 : tag; | 91 | ts->u.d.tag = tag == LUA_ANYTAG ? 0 : tag; |
102 | ts->constindex = -1; /* tag -> this is a userdata */ | 92 | ts->constindex = -1; /* tag -> this is a userdata */ |
103 | luaO_nblocks++; | 93 | L->nblocks++; |
104 | } | 94 | } |
105 | ts->head.marked = 0; | 95 | ts->head.marked = 0; |
106 | ts->head.next = (GCnode *)ts; /* signal it is in no list */ | 96 | ts->head.next = (GCnode *)ts; /* signal it is in no list */ |
@@ -138,12 +128,12 @@ static TaggedString *insert (char *buff, int tag, stringtable *tb) | |||
138 | 128 | ||
139 | TaggedString *luaS_createudata (void *udata, int tag) | 129 | TaggedString *luaS_createudata (void *udata, int tag) |
140 | { | 130 | { |
141 | return insert(udata, tag, &string_root[(unsigned)udata%NUM_HASHS]); | 131 | return insert(udata, tag, &L->string_root[(unsigned)udata%NUM_HASHS]); |
142 | } | 132 | } |
143 | 133 | ||
144 | TaggedString *luaS_new (char *str) | 134 | TaggedString *luaS_new (char *str) |
145 | { | 135 | { |
146 | return insert(str, LUA_T_STRING, &string_root[(unsigned)str[0]%NUM_HASHS]); | 136 | return insert(str, LUA_T_STRING, &L->string_root[(unsigned)str[0]%NUM_HASHS]); |
147 | } | 137 | } |
148 | 138 | ||
149 | TaggedString *luaS_newfixedstring (char *str) | 139 | TaggedString *luaS_newfixedstring (char *str) |
@@ -159,7 +149,7 @@ void luaS_free (TaggedString *l) | |||
159 | { | 149 | { |
160 | while (l) { | 150 | while (l) { |
161 | TaggedString *next = (TaggedString *)l->head.next; | 151 | TaggedString *next = (TaggedString *)l->head.next; |
162 | luaO_nblocks -= (l->constindex == -1) ? 1 : gcsizestring(strlen(l->str)); | 152 | L->nblocks -= (l->constindex == -1) ? 1 : gcsizestring(strlen(l->str)); |
163 | luaM_free(l); | 153 | luaM_free(l); |
164 | l = next; | 154 | l = next; |
165 | } | 155 | } |
@@ -185,9 +175,9 @@ TaggedString *luaS_collector (void) | |||
185 | { | 175 | { |
186 | TaggedString *frees = NULL; | 176 | TaggedString *frees = NULL; |
187 | int i; | 177 | int i; |
188 | remove_from_list(&luaS_root); | 178 | remove_from_list(&(L->rootglobal)); |
189 | for (i=0; i<NUM_HASHS; i++) { | 179 | for (i=0; i<NUM_HASHS; i++) { |
190 | stringtable *tb = &string_root[i]; | 180 | stringtable *tb = &L->string_root[i]; |
191 | int j; | 181 | int j; |
192 | for (j=0; j<tb->size; j++) { | 182 | for (j=0; j<tb->size; j++) { |
193 | TaggedString *t = tb->hash[j]; | 183 | TaggedString *t = tb->hash[j]; |
@@ -209,8 +199,8 @@ void luaS_rawsetglobal (TaggedString *ts, TObject *newval) | |||
209 | { | 199 | { |
210 | ts->u.globalval = *newval; | 200 | ts->u.globalval = *newval; |
211 | if (ts->head.next == (GCnode *)ts) { /* is not in list? */ | 201 | if (ts->head.next == (GCnode *)ts) { /* is not in list? */ |
212 | ts->head.next = luaS_root.next; | 202 | ts->head.next = L->rootglobal.next; |
213 | luaS_root.next = (GCnode *)ts; | 203 | L->rootglobal.next = (GCnode *)ts; |
214 | } | 204 | } |
215 | } | 205 | } |
216 | 206 | ||
@@ -218,7 +208,7 @@ void luaS_rawsetglobal (TaggedString *ts, TObject *newval) | |||
218 | char *luaS_travsymbol (int (*fn)(TObject *)) | 208 | char *luaS_travsymbol (int (*fn)(TObject *)) |
219 | { | 209 | { |
220 | TaggedString *g; | 210 | TaggedString *g; |
221 | for (g=(TaggedString *)luaS_root.next; g; g=(TaggedString *)g->head.next) | 211 | for (g=(TaggedString *)L->rootglobal.next; g; g=(TaggedString *)g->head.next) |
222 | if (fn(&g->u.globalval)) | 212 | if (fn(&g->u.globalval)) |
223 | return g->str; | 213 | return g->str; |
224 | return NULL; | 214 | return NULL; |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lstring.h,v 1.2 1997/09/26 15:02:26 roberto Exp roberto $ | 2 | ** $Id: lstring.h,v 1.3 1997/11/04 15:27:53 roberto Exp roberto $ |
3 | ** String table (keep all strings handled by Lua) | 3 | ** String table (keep all strings handled by Lua) |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -10,8 +10,6 @@ | |||
10 | 10 | ||
11 | #include "lobject.h" | 11 | #include "lobject.h" |
12 | 12 | ||
13 | extern GCnode luaS_root; | ||
14 | |||
15 | 13 | ||
16 | void luaS_init (void); | 14 | void luaS_init (void); |
17 | TaggedString *luaS_createudata (void *udata, int tag); | 15 | TaggedString *luaS_createudata (void *udata, int tag); |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: ltable.c,v 1.4 1997/10/23 16:26:37 roberto Exp roberto $ | 2 | ** $Id: ltable.c,v 1.5 1997/10/24 17:17:24 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 | */ |
@@ -9,6 +9,7 @@ | |||
9 | #include "lauxlib.h" | 9 | #include "lauxlib.h" |
10 | #include "lmem.h" | 10 | #include "lmem.h" |
11 | #include "lobject.h" | 11 | #include "lobject.h" |
12 | #include "lstate.h" | ||
12 | #include "ltable.h" | 13 | #include "ltable.h" |
13 | #include "lua.h" | 14 | #include "lua.h" |
14 | 15 | ||
@@ -24,9 +25,6 @@ | |||
24 | #define TagDefault LUA_T_ARRAY; | 25 | #define TagDefault LUA_T_ARRAY; |
25 | 26 | ||
26 | 27 | ||
27 | GCnode luaH_root = {NULL, 0}; | ||
28 | |||
29 | |||
30 | 28 | ||
31 | static long int hashindex (TObject *ref) | 29 | static long int hashindex (TObject *ref) |
32 | { | 30 | { |
@@ -95,7 +93,7 @@ void luaH_free (Hash *frees) | |||
95 | { | 93 | { |
96 | while (frees) { | 94 | while (frees) { |
97 | Hash *next = (Hash *)frees->head.next; | 95 | Hash *next = (Hash *)frees->head.next; |
98 | luaO_nblocks -= gcsize(frees->nhash); | 96 | L->nblocks -= gcsize(frees->nhash); |
99 | hashdelete(frees); | 97 | hashdelete(frees); |
100 | frees = next; | 98 | frees = next; |
101 | } | 99 | } |
@@ -110,8 +108,8 @@ Hash *luaH_new (int nhash) | |||
110 | nhash(t) = nhash; | 108 | nhash(t) = nhash; |
111 | nuse(t) = 0; | 109 | nuse(t) = 0; |
112 | t->htag = TagDefault; | 110 | t->htag = TagDefault; |
113 | luaO_insertlist(&luaH_root, (GCnode *)t); | 111 | luaO_insertlist(&(L->roottable), (GCnode *)t); |
114 | luaO_nblocks += gcsize(nhash); | 112 | L->nblocks += gcsize(nhash); |
115 | return t; | 113 | return t; |
116 | } | 114 | } |
117 | 115 | ||
@@ -145,7 +143,7 @@ static void rehash (Hash *t) | |||
145 | if (ttype(ref(n)) != LUA_T_NIL && ttype(val(n)) != LUA_T_NIL) | 143 | if (ttype(ref(n)) != LUA_T_NIL && ttype(val(n)) != LUA_T_NIL) |
146 | *node(t, present(t, ref(n))) = *n; /* copy old node to luaM_new hash */ | 144 | *node(t, present(t, ref(n))) = *n; /* copy old node to luaM_new hash */ |
147 | } | 145 | } |
148 | luaO_nblocks += gcsize(t->nhash)-gcsize(nold); | 146 | L->nblocks += gcsize(t->nhash)-gcsize(nold); |
149 | luaM_free(vold); | 147 | luaM_free(vold); |
150 | } | 148 | } |
151 | 149 | ||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: ltable.h,v 1.2 1997/09/26 16:46:20 roberto Exp roberto $ | 2 | ** $Id: ltable.h,v 1.3 1997/10/18 16:29:15 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 | */ |
@@ -10,9 +10,6 @@ | |||
10 | #include "lobject.h" | 10 | #include "lobject.h" |
11 | 11 | ||
12 | 12 | ||
13 | extern GCnode luaH_root; | ||
14 | |||
15 | |||
16 | #define node(t,i) (&(t)->node[i]) | 13 | #define node(t,i) (&(t)->node[i]) |
17 | #define ref(n) (&(n)->ref) | 14 | #define ref(n) (&(n)->ref) |
18 | #define val(n) (&(n)->val) | 15 | #define val(n) (&(n)->val) |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: ltm.c,v 1.6 1997/11/04 15:27:53 roberto Exp roberto $ | 2 | ** $Id: ltm.c,v 1.7 1997/11/10 17:47:01 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 | */ |
@@ -9,9 +9,9 @@ | |||
9 | #include <string.h> | 9 | #include <string.h> |
10 | 10 | ||
11 | #include "lauxlib.h" | 11 | #include "lauxlib.h" |
12 | #include "ldo.h" | ||
13 | #include "lmem.h" | 12 | #include "lmem.h" |
14 | #include "lobject.h" | 13 | #include "lobject.h" |
14 | #include "lstate.h" | ||
15 | #include "ltm.h" | 15 | #include "ltm.h" |
16 | 16 | ||
17 | 17 | ||
@@ -31,10 +31,6 @@ static int luaI_checkevent (char *name, char *list[]) | |||
31 | } | 31 | } |
32 | 32 | ||
33 | 33 | ||
34 | struct IM *luaT_IMtable; | ||
35 | static int IMtable_size; | ||
36 | static int last_tag; | ||
37 | |||
38 | 34 | ||
39 | /* events in LUA_T_NIL are all allowed, since this is used as a | 35 | /* events in LUA_T_NIL are all allowed, since this is used as a |
40 | * 'placeholder' for "default" fallbacks | 36 | * 'placeholder' for "default" fallbacks |
@@ -67,34 +63,34 @@ static void init_entry (int tag) | |||
67 | void luaT_init (void) | 63 | void luaT_init (void) |
68 | { | 64 | { |
69 | int t; | 65 | int t; |
70 | IMtable_size = NUM_TAGS*2; | 66 | L->IMtable_size = NUM_TAGS*2; |
71 | last_tag = -(NUM_TAGS-1); | 67 | L->last_tag = -(NUM_TAGS-1); |
72 | luaT_IMtable = luaM_newvector(IMtable_size, struct IM); | 68 | L->IMtable = luaM_newvector(L->IMtable_size, struct IM); |
73 | for (t=last_tag; t<=0; t++) | 69 | for (t=L->last_tag; t<=0; t++) |
74 | init_entry(t); | 70 | init_entry(t); |
75 | } | 71 | } |
76 | 72 | ||
77 | 73 | ||
78 | int lua_newtag (void) | 74 | int lua_newtag (void) |
79 | { | 75 | { |
80 | --last_tag; | 76 | --L->last_tag; |
81 | if ((-last_tag) >= IMtable_size) | 77 | if ((-L->last_tag) >= L->IMtable_size) |
82 | IMtable_size = luaM_growvector(&luaT_IMtable, IMtable_size, | 78 | L->IMtable_size = luaM_growvector(&L->IMtable, L->IMtable_size, |
83 | struct IM, memEM, MAX_INT); | 79 | struct IM, memEM, MAX_INT); |
84 | init_entry(last_tag); | 80 | init_entry(L->last_tag); |
85 | return last_tag; | 81 | return L->last_tag; |
86 | } | 82 | } |
87 | 83 | ||
88 | 84 | ||
89 | static void checktag (int tag) | 85 | static void checktag (int tag) |
90 | { | 86 | { |
91 | if (!(last_tag <= tag && tag <= 0)) | 87 | if (!(L->last_tag <= tag && tag <= 0)) |
92 | luaL_verror("%d is not a valid tag", tag); | 88 | luaL_verror("%d is not a valid tag", tag); |
93 | } | 89 | } |
94 | 90 | ||
95 | void luaT_realtag (int tag) | 91 | void luaT_realtag (int tag) |
96 | { | 92 | { |
97 | if (!(last_tag <= tag && tag < LUA_T_NIL)) | 93 | if (!(L->last_tag <= tag && tag < LUA_T_NIL)) |
98 | luaL_verror("tag %d is not result of `newtag'", tag); | 94 | luaL_verror("tag %d is not result of `newtag'", tag); |
99 | } | 95 | } |
100 | 96 | ||
@@ -145,11 +141,11 @@ void luaT_settagmethod (int t, char *event, TObject *func) | |||
145 | char *luaT_travtagmethods (int (*fn)(TObject *)) | 141 | char *luaT_travtagmethods (int (*fn)(TObject *)) |
146 | { | 142 | { |
147 | int e; | 143 | int e; |
148 | if (fn(&luaD_errorim)) | 144 | if (fn(&L->errorim)) |
149 | return "error"; | 145 | return "error"; |
150 | for (e=IM_GETTABLE; e<=IM_FUNCTION; e++) { /* ORDER IM */ | 146 | for (e=IM_GETTABLE; e<=IM_FUNCTION; e++) { /* ORDER IM */ |
151 | int t; | 147 | int t; |
152 | for (t=0; t>=last_tag; t--) | 148 | for (t=0; t>=L->last_tag; t--) |
153 | if (fn(luaT_getim(t,e))) | 149 | if (fn(luaT_getim(t,e))) |
154 | return luaT_eventname[e]; | 150 | return luaT_eventname[e]; |
155 | } | 151 | } |
@@ -203,8 +199,8 @@ void luaT_setfallback (void) | |||
203 | luaL_arg_check(lua_isfunction(func), 2, "function expected"); | 199 | luaL_arg_check(lua_isfunction(func), 2, "function expected"); |
204 | switch (luaO_findstring(name, oldnames)) { | 200 | switch (luaO_findstring(name, oldnames)) { |
205 | case 0: /* old error fallback */ | 201 | case 0: /* old error fallback */ |
206 | oldfunc = luaD_errorim; | 202 | oldfunc = L->errorim; |
207 | luaD_errorim = *luaA_Address(func); | 203 | L->errorim = *luaA_Address(func); |
208 | replace = errorFB; | 204 | replace = errorFB; |
209 | break; | 205 | break; |
210 | case 1: /* old getglobal fallback */ | 206 | case 1: /* old getglobal fallback */ |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: ltm.h,v 1.1 1997/09/16 19:25:59 roberto Exp roberto $ | 2 | ** $Id: ltm.h,v 1.2 1997/11/04 15:27:53 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 | */ |
@@ -9,6 +9,7 @@ | |||
9 | 9 | ||
10 | 10 | ||
11 | #include "lobject.h" | 11 | #include "lobject.h" |
12 | #include "lstate.h" | ||
12 | 13 | ||
13 | /* | 14 | /* |
14 | * WARNING: if you change the order of this enumeration, | 15 | * WARNING: if you change the order of this enumeration, |
@@ -38,12 +39,12 @@ typedef enum { | |||
38 | #define IM_N 18 | 39 | #define IM_N 18 |
39 | 40 | ||
40 | 41 | ||
41 | extern struct IM { | 42 | struct IM { |
42 | TObject int_method[IM_N]; | 43 | TObject int_method[IM_N]; |
43 | } *luaT_IMtable; | 44 | }; |
44 | 45 | ||
45 | 46 | ||
46 | #define luaT_getim(tag,event) (&luaT_IMtable[-(tag)].int_method[event]) | 47 | #define luaT_getim(tag,event) (&L->IMtable[-(tag)].int_method[event]) |
47 | #define luaT_getimbyObj(o,e) (luaT_getim(luaT_efectivetag(o),(e))) | 48 | #define luaT_getimbyObj(o,e) (luaT_getim(luaT_efectivetag(o),(e))) |
48 | 49 | ||
49 | extern char *luaT_eventname[]; | 50 | extern char *luaT_eventname[]; |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lua.c,v 1.2 1997/10/06 14:51:32 roberto Exp roberto $ | 2 | ** $Id: lua.c,v 1.3 1997/10/16 18:35:59 roberto Exp roberto $ |
3 | ** Lua stand-alone interpreter | 3 | ** Lua stand-alone interpreter |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -82,6 +82,7 @@ int main (int argc, char *argv[]) | |||
82 | } | 82 | } |
83 | } | 83 | } |
84 | } | 84 | } |
85 | /* lua_close(); */ | ||
85 | return 0; | 86 | return 0; |
86 | } | 87 | } |
87 | 88 | ||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lua.h,v 1.2 1997/10/24 17:17:24 roberto Exp roberto $ | 2 | ** $Id: lua.h,v 1.3 1997/11/04 15:27:53 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 |
@@ -117,6 +117,8 @@ int lua_ref (int lock); /* In: value */ | |||
117 | lua_Object lua_getref (int ref); | 117 | lua_Object lua_getref (int ref); |
118 | void lua_unref (int ref); | 118 | void lua_unref (int ref); |
119 | 119 | ||
120 | lua_Object lua_globalbag (void); | ||
121 | |||
120 | lua_Object lua_createtable (void); | 122 | lua_Object lua_createtable (void); |
121 | 123 | ||
122 | long lua_collectgarbage (long limit); | 124 | long lua_collectgarbage (long limit); |
@@ -1,6 +1,6 @@ | |||
1 | %{ | 1 | %{ |
2 | /* | 2 | /* |
3 | ** $Id: lua.stx,v 1.16 1997/10/30 18:47:19 roberto Exp roberto $ | 3 | ** $Id: lua.stx,v 1.17 1997/11/07 15:09:49 roberto Exp roberto $ |
4 | ** Syntax analizer and code generator | 4 | ** Syntax analizer and code generator |
5 | ** See Copyright Notice in lua.h | 5 | ** See Copyright Notice in lua.h |
6 | */ | 6 | */ |
@@ -16,13 +16,13 @@ | |||
16 | #include "lmem.h" | 16 | #include "lmem.h" |
17 | #include "lopcodes.h" | 17 | #include "lopcodes.h" |
18 | #include "lparser.h" | 18 | #include "lparser.h" |
19 | #include "lstate.h" | ||
19 | #include "lstring.h" | 20 | #include "lstring.h" |
20 | #include "lua.h" | 21 | #include "lua.h" |
21 | #include "luadebug.h" | 22 | #include "luadebug.h" |
22 | #include "lzio.h" | 23 | #include "lzio.h" |
23 | 24 | ||
24 | 25 | ||
25 | /* to avoid warnings generated by yacc */ | ||
26 | int luaY_parse (void); | 26 | int luaY_parse (void); |
27 | 27 | ||
28 | 28 | ||
@@ -61,7 +61,7 @@ typedef long vardesc; | |||
61 | #define dotindex(v) ((-(v))-1) | 61 | #define dotindex(v) ((-(v))-1) |
62 | 62 | ||
63 | /* state needed to generate code for a given function */ | 63 | /* state needed to generate code for a given function */ |
64 | typedef struct State { | 64 | typedef struct FuncState { |
65 | TProtoFunc *f; /* current function header */ | 65 | TProtoFunc *f; /* current function header */ |
66 | int pc; /* next position to code */ | 66 | int pc; /* next position to code */ |
67 | TaggedString *localvar[MAXLOCALS]; /* store local variable names */ | 67 | TaggedString *localvar[MAXLOCALS]; /* store local variable names */ |
@@ -75,11 +75,11 @@ typedef struct State { | |||
75 | int maxconsts; /* size of f->consts */ | 75 | int maxconsts; /* size of f->consts */ |
76 | vardesc varbuffer[MAXVAR]; /* variables in an assignment list */ | 76 | vardesc varbuffer[MAXVAR]; /* variables in an assignment list */ |
77 | vardesc upvalues[MAXUPVALUES]; /* upvalues */ | 77 | vardesc upvalues[MAXUPVALUES]; /* upvalues */ |
78 | } State; | 78 | } FuncState; |
79 | 79 | ||
80 | static State *mainState, *currState; | ||
81 | 80 | ||
82 | 81 | ||
82 | #define YYPURE 1 | ||
83 | 83 | ||
84 | 84 | ||
85 | void luaY_syntaxerror (char *s, char *token) | 85 | void luaY_syntaxerror (char *s, char *token) |
@@ -87,7 +87,7 @@ void luaY_syntaxerror (char *s, char *token) | |||
87 | if (token[0] == 0) | 87 | if (token[0] == 0) |
88 | token = "<eof>"; | 88 | token = "<eof>"; |
89 | luaL_verror("%.100s;\n> last token read: \"%.50s\" at line %d in file %.50s", | 89 | luaL_verror("%.100s;\n> last token read: \"%.50s\" at line %d in file %.50s", |
90 | s, token, luaX_linenumber, mainState->f->fileName->str); | 90 | s, token, L->lexstate->linenumber, L->mainState->f->fileName->str); |
91 | } | 91 | } |
92 | 92 | ||
93 | 93 | ||
@@ -99,16 +99,16 @@ void luaY_error (char *s) | |||
99 | 99 | ||
100 | static void check_pc (int n) | 100 | static void check_pc (int n) |
101 | { | 101 | { |
102 | if (currState->pc+n > currState->maxcode) | 102 | if (L->currState->pc+n > L->currState->maxcode) |
103 | currState->maxcode = luaM_growvector(&currState->f->code, | 103 | L->currState->maxcode = luaM_growvector(&L->currState->f->code, |
104 | currState->maxcode, Byte, codeEM, MAX_INT); | 104 | L->currState->maxcode, Byte, codeEM, MAX_INT); |
105 | } | 105 | } |
106 | 106 | ||
107 | 107 | ||
108 | static void movecode_up (int d, int s, int n) | 108 | static void movecode_up (int d, int s, int n) |
109 | { | 109 | { |
110 | while (n--) | 110 | while (n--) |
111 | currState->f->code[d+n] = currState->f->code[s+n]; | 111 | L->currState->f->code[d+n] = L->currState->f->code[s+n]; |
112 | } | 112 | } |
113 | 113 | ||
114 | 114 | ||
@@ -116,24 +116,24 @@ static void movecode_down (int d, int s, int n) | |||
116 | { | 116 | { |
117 | int i; | 117 | int i; |
118 | for (i=0; i<n; i++) | 118 | for (i=0; i<n; i++) |
119 | currState->f->code[d+i] = currState->f->code[s+i]; | 119 | L->currState->f->code[d+i] = L->currState->f->code[s+i]; |
120 | } | 120 | } |
121 | 121 | ||
122 | 122 | ||
123 | static void code_byte (Byte c) | 123 | static void code_byte (Byte c) |
124 | { | 124 | { |
125 | check_pc(1); | 125 | check_pc(1); |
126 | currState->f->code[currState->pc++] = c; | 126 | L->currState->f->code[L->currState->pc++] = c; |
127 | } | 127 | } |
128 | 128 | ||
129 | 129 | ||
130 | static void deltastack (int delta) | 130 | static void deltastack (int delta) |
131 | { | 131 | { |
132 | currState->stacksize += delta; | 132 | L->currState->stacksize += delta; |
133 | if (currState->stacksize > currState->maxstacksize) { | 133 | if (L->currState->stacksize > L->currState->maxstacksize) { |
134 | if (currState->stacksize > 255) | 134 | if (L->currState->stacksize > 255) |
135 | luaY_error("function/expression too complex (limit 256)"); | 135 | luaY_error("function/expression too complex (limit 256)"); |
136 | currState->maxstacksize = currState->stacksize; | 136 | L->currState->maxstacksize = L->currState->stacksize; |
137 | } | 137 | } |
138 | } | 138 | } |
139 | 139 | ||
@@ -142,18 +142,18 @@ static int code_oparg_at (int pc, OpCode op, int builtin, int arg, int delta) | |||
142 | { | 142 | { |
143 | deltastack(delta); | 143 | deltastack(delta); |
144 | if (arg < builtin) { | 144 | if (arg < builtin) { |
145 | currState->f->code[pc] = op+1+arg; | 145 | L->currState->f->code[pc] = op+1+arg; |
146 | return 1; | 146 | return 1; |
147 | } | 147 | } |
148 | else if (arg <= 255) { | 148 | else if (arg <= 255) { |
149 | currState->f->code[pc] = op; | 149 | L->currState->f->code[pc] = op; |
150 | currState->f->code[pc+1] = arg; | 150 | L->currState->f->code[pc+1] = arg; |
151 | return 2; | 151 | return 2; |
152 | } | 152 | } |
153 | else if (arg <= MAX_WORD) { | 153 | else if (arg <= MAX_WORD) { |
154 | currState->f->code[pc] = op+1+builtin; | 154 | L->currState->f->code[pc] = op+1+builtin; |
155 | currState->f->code[pc+1] = arg&0xFF; | 155 | L->currState->f->code[pc+1] = arg&0xFF; |
156 | currState->f->code[pc+2] = arg>>8; | 156 | L->currState->f->code[pc+2] = arg>>8; |
157 | return 3; | 157 | return 3; |
158 | } | 158 | } |
159 | else luaY_error("code too long (limit 64K)"); | 159 | else luaY_error("code too long (limit 64K)"); |
@@ -164,13 +164,13 @@ static int code_oparg_at (int pc, OpCode op, int builtin, int arg, int delta) | |||
164 | static int fix_opcode (int pc, OpCode op, int builtin, int arg) | 164 | static int fix_opcode (int pc, OpCode op, int builtin, int arg) |
165 | { | 165 | { |
166 | if (arg < builtin) { /* close space */ | 166 | if (arg < builtin) { /* close space */ |
167 | movecode_down(pc+1, pc+2, currState->pc-(pc+2)); | 167 | movecode_down(pc+1, pc+2, L->currState->pc-(pc+2)); |
168 | currState->pc--; | 168 | L->currState->pc--; |
169 | } | 169 | } |
170 | else if (arg > 255) { /* open space */ | 170 | else if (arg > 255) { /* open space */ |
171 | check_pc(1); | 171 | check_pc(1); |
172 | movecode_up(pc+1, pc, currState->pc-pc); | 172 | movecode_up(pc+1, pc, L->currState->pc-pc); |
173 | currState->pc++; | 173 | L->currState->pc++; |
174 | } | 174 | } |
175 | return code_oparg_at(pc, op, builtin, arg, 0) - 2; | 175 | return code_oparg_at(pc, op, builtin, arg, 0) - 2; |
176 | } | 176 | } |
@@ -179,7 +179,7 @@ static int fix_opcode (int pc, OpCode op, int builtin, int arg) | |||
179 | static void code_oparg (OpCode op, int builtin, int arg, int delta) | 179 | static void code_oparg (OpCode op, int builtin, int arg, int delta) |
180 | { | 180 | { |
181 | check_pc(3); /* maximum code size */ | 181 | check_pc(3); /* maximum code size */ |
182 | currState->pc += code_oparg_at(currState->pc, op, builtin, arg, delta); | 182 | L->currState->pc += code_oparg_at(L->currState->pc, op, builtin, arg, delta); |
183 | } | 183 | } |
184 | 184 | ||
185 | 185 | ||
@@ -214,7 +214,7 @@ static void code_constant (int c) | |||
214 | } | 214 | } |
215 | 215 | ||
216 | 216 | ||
217 | static int next_constant (State *cs) | 217 | static int next_constant (FuncState *cs) |
218 | { | 218 | { |
219 | TProtoFunc *f = cs->f; | 219 | TProtoFunc *f = cs->f; |
220 | if (f->nconsts >= cs->maxconsts) { | 220 | if (f->nconsts >= cs->maxconsts) { |
@@ -225,7 +225,7 @@ static int next_constant (State *cs) | |||
225 | } | 225 | } |
226 | 226 | ||
227 | 227 | ||
228 | static int string_constant (TaggedString *s, State *cs) | 228 | static int string_constant (TaggedString *s, FuncState *cs) |
229 | { | 229 | { |
230 | TProtoFunc *f = cs->f; | 230 | TProtoFunc *f = cs->f; |
231 | int c = s->constindex; | 231 | int c = s->constindex; |
@@ -242,7 +242,7 @@ static int string_constant (TaggedString *s, State *cs) | |||
242 | 242 | ||
243 | static void code_string (TaggedString *s) | 243 | static void code_string (TaggedString *s) |
244 | { | 244 | { |
245 | code_constant(string_constant(s, currState)); | 245 | code_constant(string_constant(s, L->currState)); |
246 | } | 246 | } |
247 | 247 | ||
248 | 248 | ||
@@ -250,16 +250,16 @@ static void code_string (TaggedString *s) | |||
250 | static int real_constant (real r) | 250 | static int real_constant (real r) |
251 | { | 251 | { |
252 | /* check whether 'r' has appeared within the last LIM entries */ | 252 | /* check whether 'r' has appeared within the last LIM entries */ |
253 | TObject *cnt = currState->f->consts; | 253 | TObject *cnt = L->currState->f->consts; |
254 | int c = currState->f->nconsts; | 254 | int c = L->currState->f->nconsts; |
255 | int lim = c < LIM ? 0 : c-LIM; | 255 | int lim = c < LIM ? 0 : c-LIM; |
256 | while (--c >= lim) { | 256 | while (--c >= lim) { |
257 | if (ttype(&cnt[c]) == LUA_T_NUMBER && nvalue(&cnt[c]) == r) | 257 | if (ttype(&cnt[c]) == LUA_T_NUMBER && nvalue(&cnt[c]) == r) |
258 | return c; | 258 | return c; |
259 | } | 259 | } |
260 | /* not found; create a luaM_new entry */ | 260 | /* not found; create a luaM_new entry */ |
261 | c = next_constant(currState); | 261 | c = next_constant(L->currState); |
262 | cnt = currState->f->consts; /* 'next_constant' may reallocate this vector */ | 262 | cnt = L->currState->f->consts; /* 'next_constant' may reallocate this vector */ |
263 | ttype(&cnt[c]) = LUA_T_NUMBER; | 263 | ttype(&cnt[c]) = LUA_T_NUMBER; |
264 | nvalue(&cnt[c]) = r; | 264 | nvalue(&cnt[c]) = r; |
265 | return c; | 265 | return c; |
@@ -292,13 +292,13 @@ static void flush_list (int m, int n) | |||
292 | 292 | ||
293 | static void luaI_registerlocalvar (TaggedString *varname, int line) | 293 | static void luaI_registerlocalvar (TaggedString *varname, int line) |
294 | { | 294 | { |
295 | if (currState->maxvars != -1) { /* debug information? */ | 295 | if (L->currState->maxvars != -1) { /* debug information? */ |
296 | if (currState->nvars >= currState->maxvars) | 296 | if (L->currState->nvars >= L->currState->maxvars) |
297 | currState->maxvars = luaM_growvector(&currState->f->locvars, | 297 | L->currState->maxvars = luaM_growvector(&L->currState->f->locvars, |
298 | currState->maxvars, LocVar, "", MAX_WORD); | 298 | L->currState->maxvars, LocVar, "", MAX_WORD); |
299 | currState->f->locvars[currState->nvars].varname = varname; | 299 | L->currState->f->locvars[L->currState->nvars].varname = varname; |
300 | currState->f->locvars[currState->nvars].line = line; | 300 | L->currState->f->locvars[L->currState->nvars].line = line; |
301 | currState->nvars++; | 301 | L->currState->nvars++; |
302 | } | 302 | } |
303 | } | 303 | } |
304 | 304 | ||
@@ -311,17 +311,17 @@ static void luaI_unregisterlocalvar (int line) | |||
311 | 311 | ||
312 | static void store_localvar (TaggedString *name, int n) | 312 | static void store_localvar (TaggedString *name, int n) |
313 | { | 313 | { |
314 | if (currState->nlocalvar+n < MAXLOCALS) | 314 | if (L->currState->nlocalvar+n < MAXLOCALS) |
315 | currState->localvar[currState->nlocalvar+n] = name; | 315 | L->currState->localvar[L->currState->nlocalvar+n] = name; |
316 | else | 316 | else |
317 | luaY_error("too many local variables (limit 32)"); | 317 | luaY_error("too many local variables (limit 32)"); |
318 | luaI_registerlocalvar(name, luaX_linenumber); | 318 | luaI_registerlocalvar(name, L->lexstate->linenumber); |
319 | } | 319 | } |
320 | 320 | ||
321 | static void add_localvar (TaggedString *name) | 321 | static void add_localvar (TaggedString *name) |
322 | { | 322 | { |
323 | store_localvar(name, 0); | 323 | store_localvar(name, 0); |
324 | currState->nlocalvar++; | 324 | L->currState->nlocalvar++; |
325 | } | 325 | } |
326 | 326 | ||
327 | 327 | ||
@@ -342,11 +342,11 @@ static void add_varbuffer (vardesc var, int n) | |||
342 | { | 342 | { |
343 | if (n >= MAXVAR) | 343 | if (n >= MAXVAR) |
344 | luaY_error("variable buffer overflow (limit 32)"); | 344 | luaY_error("variable buffer overflow (limit 32)"); |
345 | currState->varbuffer[n] = var2store(var); | 345 | L->currState->varbuffer[n] = var2store(var); |
346 | } | 346 | } |
347 | 347 | ||
348 | 348 | ||
349 | static int aux_localname (TaggedString *n, State *st) | 349 | static int aux_localname (TaggedString *n, FuncState *st) |
350 | { | 350 | { |
351 | int i; | 351 | int i; |
352 | for (i=st->nlocalvar-1; i >= 0; i--) | 352 | for (i=st->nlocalvar-1; i >= 0; i--) |
@@ -355,12 +355,12 @@ static int aux_localname (TaggedString *n, State *st) | |||
355 | } | 355 | } |
356 | 356 | ||
357 | 357 | ||
358 | static vardesc singlevar (TaggedString *n, State *st) | 358 | static vardesc singlevar (TaggedString *n, FuncState *st) |
359 | { | 359 | { |
360 | int i = aux_localname(n, st); | 360 | int i = aux_localname(n, st); |
361 | if (i == -1) { /* check shadowing */ | 361 | if (i == -1) { /* check shadowing */ |
362 | int l; | 362 | int l; |
363 | for (l=1; l<=(st-mainState); l++) | 363 | for (l=1; l<=(st-L->mainState); l++) |
364 | if (aux_localname(n, st-l) >= 0) | 364 | if (aux_localname(n, st-l) >= 0) |
365 | luaY_syntaxerror("cannot access a variable in outer scope", n->str); | 365 | luaY_syntaxerror("cannot access a variable in outer scope", n->str); |
366 | return string_constant(n, st)+MINGLOBAL; /* global value */ | 366 | return string_constant(n, st)+MINGLOBAL; /* global value */ |
@@ -371,16 +371,16 @@ static vardesc singlevar (TaggedString *n, State *st) | |||
371 | 371 | ||
372 | static int indexupvalue (TaggedString *n) | 372 | static int indexupvalue (TaggedString *n) |
373 | { | 373 | { |
374 | vardesc v = singlevar(n, currState-1); | 374 | vardesc v = singlevar(n, L->currState-1); |
375 | int i; | 375 | int i; |
376 | for (i=0; i<currState->nupvalues; i++) { | 376 | for (i=0; i<L->currState->nupvalues; i++) { |
377 | if (currState->upvalues[i] == v) | 377 | if (L->currState->upvalues[i] == v) |
378 | return i; | 378 | return i; |
379 | } | 379 | } |
380 | /* new one */ | 380 | /* new one */ |
381 | if (++(currState->nupvalues) > MAXUPVALUES) | 381 | if (++(L->currState->nupvalues) > MAXUPVALUES) |
382 | luaY_error("too many upvalues in a single function (limit 16)"); | 382 | luaY_error("too many upvalues in a single function (limit 16)"); |
383 | currState->upvalues[i] = v; /* i = currState->nupvalues - 1 */ | 383 | L->currState->upvalues[i] = v; /* i = L->currState->nupvalues - 1 */ |
384 | return i; | 384 | return i; |
385 | } | 385 | } |
386 | 386 | ||
@@ -388,9 +388,9 @@ static int indexupvalue (TaggedString *n) | |||
388 | static void pushupvalue (TaggedString *n) | 388 | static void pushupvalue (TaggedString *n) |
389 | { | 389 | { |
390 | int i; | 390 | int i; |
391 | if (currState == mainState) | 391 | if (L->currState == L->mainState) |
392 | luaY_error("cannot access upvalue in main"); | 392 | luaY_error("cannot access upvalue in main"); |
393 | if (aux_localname(n, currState) >= 0) | 393 | if (aux_localname(n, L->currState) >= 0) |
394 | luaY_syntaxerror("cannot access an upvalue in current scope", n->str); | 394 | luaY_syntaxerror("cannot access an upvalue in current scope", n->str); |
395 | i = indexupvalue(n); | 395 | i = indexupvalue(n); |
396 | code_oparg(PUSHUPVALUE, 2, i, 1); | 396 | code_oparg(PUSHUPVALUE, 2, i, 1); |
@@ -399,10 +399,9 @@ static void pushupvalue (TaggedString *n) | |||
399 | 399 | ||
400 | void luaY_codedebugline (int line) | 400 | void luaY_codedebugline (int line) |
401 | { | 401 | { |
402 | static int lastline = 0; | 402 | if (lua_debug && line != L->lexstate->lastline) { |
403 | if (lua_debug && line != lastline) { | ||
404 | code_oparg(SETLINE, 0, line, 0); | 403 | code_oparg(SETLINE, 0, line, 0); |
405 | lastline = line; | 404 | L->lexstate->lastline = line; |
406 | } | 405 | } |
407 | } | 406 | } |
408 | 407 | ||
@@ -421,10 +420,10 @@ static long adjust_functioncall (long exp, int nresults) | |||
421 | if (exp <= 0) | 420 | if (exp <= 0) |
422 | return -exp; /* exp is -list length */ | 421 | return -exp; /* exp is -list length */ |
423 | else { | 422 | else { |
424 | int temp = currState->f->code[exp]; | 423 | int temp = L->currState->f->code[exp]; |
425 | int nparams = currState->f->code[exp-1]; | 424 | int nparams = L->currState->f->code[exp-1]; |
426 | exp += fix_opcode(exp-2, CALLFUNC, 2, nresults); | 425 | exp += fix_opcode(exp-2, CALLFUNC, 2, nresults); |
427 | currState->f->code[exp] = nparams; | 426 | L->currState->f->code[exp] = nparams; |
428 | if (nresults != MULT_RET) | 427 | if (nresults != MULT_RET) |
429 | deltastack(nresults); | 428 | deltastack(nresults); |
430 | deltastack(-(nparams+1)); | 429 | deltastack(-(nparams+1)); |
@@ -436,7 +435,7 @@ static long adjust_functioncall (long exp, int nresults) | |||
436 | static void adjust_mult_assign (int vars, long exps) | 435 | static void adjust_mult_assign (int vars, long exps) |
437 | { | 436 | { |
438 | if (exps > 0) { /* must correct function call */ | 437 | if (exps > 0) { /* must correct function call */ |
439 | int diff = currState->f->code[exps] - vars; | 438 | int diff = L->currState->f->code[exps] - vars; |
440 | if (diff < 0) | 439 | if (diff < 0) |
441 | adjust_functioncall(exps, -diff); | 440 | adjust_functioncall(exps, -diff); |
442 | else { | 441 | else { |
@@ -450,11 +449,11 @@ static void adjust_mult_assign (int vars, long exps) | |||
450 | 449 | ||
451 | static void code_args (int nparams, int dots) | 450 | static void code_args (int nparams, int dots) |
452 | { | 451 | { |
453 | currState->nlocalvar += nparams; | 452 | L->currState->nlocalvar += nparams; |
454 | if (!dots) | 453 | if (!dots) |
455 | code_oparg(ARGS, 0, currState->nlocalvar, currState->nlocalvar); | 454 | code_oparg(ARGS, 0, L->currState->nlocalvar, L->currState->nlocalvar); |
456 | else { | 455 | else { |
457 | code_oparg(VARARGS, 0, currState->nlocalvar, currState->nlocalvar+1); | 456 | code_oparg(VARARGS, 0, L->currState->nlocalvar, L->currState->nlocalvar+1); |
458 | add_localvar(luaS_new("arg")); | 457 | add_localvar(luaS_new("arg")); |
459 | } | 458 | } |
460 | } | 459 | } |
@@ -487,9 +486,9 @@ static void storevar (vardesc var) | |||
487 | /* returns how many elements are left as 'garbage' on the stack */ | 486 | /* returns how many elements are left as 'garbage' on the stack */ |
488 | static int lua_codestore (int i, int left) | 487 | static int lua_codestore (int i, int left) |
489 | { | 488 | { |
490 | if (currState->varbuffer[i] != 0 || /* global or local var or */ | 489 | if (L->currState->varbuffer[i] != 0 || /* global or local var or */ |
491 | left+i == 0) { /* indexed var without values in between */ | 490 | left+i == 0) { /* indexed var without values in between */ |
492 | storevar(currState->varbuffer[i]); | 491 | storevar(L->currState->varbuffer[i]); |
493 | return left; | 492 | return left; |
494 | } | 493 | } |
495 | else { /* indexed var with values in between*/ | 494 | else { /* indexed var with values in between*/ |
@@ -508,7 +507,7 @@ static int fix_jump (int pc, OpCode op, int n) | |||
508 | 507 | ||
509 | static void fix_upjmp (OpCode op, int pos) | 508 | static void fix_upjmp (OpCode op, int pos) |
510 | { | 509 | { |
511 | int delta = currState->pc+JMPSIZE - pos; /* jump is relative */ | 510 | int delta = L->currState->pc+JMPSIZE - pos; /* jump is relative */ |
512 | if (delta > 255) delta++; | 511 | if (delta > 255) delta++; |
513 | code_oparg(op, 0, delta, 0); | 512 | code_oparg(op, 0, delta, 0); |
514 | } | 513 | } |
@@ -517,38 +516,38 @@ static void fix_upjmp (OpCode op, int pos) | |||
517 | static void codeIf (int thenAdd, int elseAdd) | 516 | static void codeIf (int thenAdd, int elseAdd) |
518 | { | 517 | { |
519 | int elseinit = elseAdd+JMPSIZE; | 518 | int elseinit = elseAdd+JMPSIZE; |
520 | if (currState->pc == elseinit) { /* no else part */ | 519 | if (L->currState->pc == elseinit) { /* no else part */ |
521 | currState->pc -= JMPSIZE; | 520 | L->currState->pc -= JMPSIZE; |
522 | elseinit = currState->pc; | 521 | elseinit = L->currState->pc; |
523 | } | 522 | } |
524 | else | 523 | else |
525 | elseinit += fix_jump(elseAdd, JMP, currState->pc); | 524 | elseinit += fix_jump(elseAdd, JMP, L->currState->pc); |
526 | fix_jump(thenAdd, IFFJMP, elseinit); | 525 | fix_jump(thenAdd, IFFJMP, elseinit); |
527 | } | 526 | } |
528 | 527 | ||
529 | 528 | ||
530 | static void code_shortcircuit (int pc, OpCode op) | 529 | static void code_shortcircuit (int pc, OpCode op) |
531 | { | 530 | { |
532 | fix_jump(pc, op, currState->pc); | 531 | fix_jump(pc, op, L->currState->pc); |
533 | } | 532 | } |
534 | 533 | ||
535 | 534 | ||
536 | static void codereturn (void) | 535 | static void codereturn (void) |
537 | { | 536 | { |
538 | code_oparg(RETCODE, 0, currState->nlocalvar, 0); | 537 | code_oparg(RETCODE, 0, L->currState->nlocalvar, 0); |
539 | currState->stacksize = currState->nlocalvar; | 538 | L->currState->stacksize = L->currState->nlocalvar; |
540 | } | 539 | } |
541 | 540 | ||
542 | 541 | ||
543 | static void func_onstack (TProtoFunc *f) | 542 | static void func_onstack (TProtoFunc *f) |
544 | { | 543 | { |
545 | int i; | 544 | int i; |
546 | int nupvalues = (currState+1)->nupvalues; | 545 | int nupvalues = (L->currState+1)->nupvalues; |
547 | int c = next_constant(currState); | 546 | int c = next_constant(L->currState); |
548 | ttype(&currState->f->consts[c]) = LUA_T_PROTO; | 547 | ttype(&L->currState->f->consts[c]) = LUA_T_PROTO; |
549 | currState->f->consts[c].value.tf = (currState+1)->f; | 548 | L->currState->f->consts[c].value.tf = (L->currState+1)->f; |
550 | for (i=0; i<nupvalues; i++) | 549 | for (i=0; i<nupvalues; i++) |
551 | lua_pushvar((currState+1)->upvalues[i]); | 550 | lua_pushvar((L->currState+1)->upvalues[i]); |
552 | code_constant(c); | 551 | code_constant(c); |
553 | code_oparg(CLOSURE, 2, nupvalues, -nupvalues); | 552 | code_oparg(CLOSURE, 2, nupvalues, -nupvalues); |
554 | } | 553 | } |
@@ -557,48 +556,48 @@ static void func_onstack (TProtoFunc *f) | |||
557 | static void init_state (TaggedString *filename) | 556 | static void init_state (TaggedString *filename) |
558 | { | 557 | { |
559 | TProtoFunc *f = luaF_newproto(); | 558 | TProtoFunc *f = luaF_newproto(); |
560 | currState->stacksize = 0; | 559 | L->currState->stacksize = 0; |
561 | currState->maxstacksize = 0; | 560 | L->currState->maxstacksize = 0; |
562 | currState->nlocalvar = 0; | 561 | L->currState->nlocalvar = 0; |
563 | currState->nupvalues = 0; | 562 | L->currState->nupvalues = 0; |
564 | currState->f = f; | 563 | L->currState->f = f; |
565 | f->fileName = filename; | 564 | f->fileName = filename; |
566 | currState->pc = 0; | 565 | L->currState->pc = 0; |
567 | currState->maxcode = 0; | 566 | L->currState->maxcode = 0; |
568 | f->code = NULL; | 567 | f->code = NULL; |
569 | currState->maxconsts = 0; | 568 | L->currState->maxconsts = 0; |
570 | if (lua_debug) { | 569 | if (lua_debug) { |
571 | currState->nvars = 0; | 570 | L->currState->nvars = 0; |
572 | currState->maxvars = 0; | 571 | L->currState->maxvars = 0; |
573 | } | 572 | } |
574 | else | 573 | else |
575 | currState->maxvars = -1; /* flag no debug information */ | 574 | L->currState->maxvars = -1; /* flag no debug information */ |
576 | code_byte(0); /* to be filled with stacksize */ | 575 | code_byte(0); /* to be filled with stacksize */ |
577 | } | 576 | } |
578 | 577 | ||
579 | 578 | ||
580 | static void init_func (void) | 579 | static void init_func (void) |
581 | { | 580 | { |
582 | if (currState-mainState >= MAXSTATES-1) | 581 | if (L->currState-L->mainState >= MAXSTATES-1) |
583 | luaY_error("too many nested functions (limit 6)"); | 582 | luaY_error("too many nested functions (limit 6)"); |
584 | currState++; | 583 | L->currState++; |
585 | init_state(mainState->f->fileName); | 584 | init_state(L->mainState->f->fileName); |
586 | luaY_codedebugline(luaX_linenumber); | 585 | luaY_codedebugline(L->lexstate->linenumber); |
587 | currState->f->lineDefined = luaX_linenumber; | 586 | L->currState->f->lineDefined = L->lexstate->linenumber; |
588 | } | 587 | } |
589 | 588 | ||
590 | static TProtoFunc *close_func (void) | 589 | static TProtoFunc *close_func (void) |
591 | { | 590 | { |
592 | TProtoFunc *f = currState->f; | 591 | TProtoFunc *f = L->currState->f; |
593 | code_neutralop(ENDCODE); | 592 | code_neutralop(ENDCODE); |
594 | f->code[0] = currState->maxstacksize; | 593 | f->code[0] = L->currState->maxstacksize; |
595 | f->code = luaM_reallocvector(f->code, currState->pc, Byte); | 594 | f->code = luaM_reallocvector(f->code, L->currState->pc, Byte); |
596 | f->consts = luaM_reallocvector(f->consts, f->nconsts, TObject); | 595 | f->consts = luaM_reallocvector(f->consts, f->nconsts, TObject); |
597 | if (currState->maxvars != -1) { /* debug information? */ | 596 | if (L->currState->maxvars != -1) { /* debug information? */ |
598 | luaI_registerlocalvar(NULL, -1); /* flag end of vector */ | 597 | luaI_registerlocalvar(NULL, -1); /* flag end of vector */ |
599 | f->locvars = luaM_reallocvector(f->locvars, currState->nvars, LocVar); | 598 | f->locvars = luaM_reallocvector(f->locvars, L->currState->nvars, LocVar); |
600 | } | 599 | } |
601 | currState--; | 600 | L->currState--; |
602 | return f; | 601 | return f; |
603 | } | 602 | } |
604 | 603 | ||
@@ -608,8 +607,10 @@ static TProtoFunc *close_func (void) | |||
608 | */ | 607 | */ |
609 | TProtoFunc *luaY_parser (ZIO *z, char *chunkname) | 608 | TProtoFunc *luaY_parser (ZIO *z, char *chunkname) |
610 | { | 609 | { |
611 | State state[MAXSTATES]; | 610 | struct LexState lexstate; |
612 | currState = mainState = &state[0]; | 611 | FuncState state[MAXSTATES]; |
612 | L->currState = L->mainState = &state[0]; | ||
613 | L->lexstate = &lexstate; | ||
613 | luaX_setinput(z); | 614 | luaX_setinput(z); |
614 | init_state(luaS_new(chunkname)); | 615 | init_state(luaS_new(chunkname)); |
615 | if (luaY_parse ()) lua_error("parse error"); | 616 | if (luaY_parse ()) lua_error("parse error"); |
@@ -685,10 +686,10 @@ stat : IF cond THEN block SaveWord elsepart END { codeIf($2, $5); } | |||
685 | int expsize = $3-$2; | 686 | int expsize = $3-$2; |
686 | int newpos = $2+JMPSIZE; | 687 | int newpos = $2+JMPSIZE; |
687 | check_pc(expsize); | 688 | check_pc(expsize); |
688 | memcpy(&currState->f->code[currState->pc], | 689 | memcpy(&L->currState->f->code[L->currState->pc], |
689 | &currState->f->code[$2], expsize); | 690 | &L->currState->f->code[$2], expsize); |
690 | movecode_down($2, $3, currState->pc-$2); | 691 | movecode_down($2, $3, L->currState->pc-$2); |
691 | newpos += fix_jump($2, JMP, currState->pc-expsize); | 692 | newpos += fix_jump($2, JMP, L->currState->pc-expsize); |
692 | fix_upjmp(IFTUPJMP, newpos); | 693 | fix_upjmp(IFTUPJMP, newpos); |
693 | }} | 694 | }} |
694 | 695 | ||
@@ -712,18 +713,18 @@ stat : IF cond THEN block SaveWord elsepart END { codeIf($2, $5); } | |||
712 | 713 | ||
713 | | LOCAL localnamelist decinit | 714 | | LOCAL localnamelist decinit |
714 | { | 715 | { |
715 | currState->nlocalvar += $2; | 716 | L->currState->nlocalvar += $2; |
716 | adjust_mult_assign($2, $3); | 717 | adjust_mult_assign($2, $3); |
717 | } | 718 | } |
718 | 719 | ||
719 | | FUNCTION funcname body { func_onstack($3); storevar($2); } | 720 | | FUNCTION funcname body { func_onstack($3); storevar($2); } |
720 | ; | 721 | ; |
721 | 722 | ||
722 | block : {$<vInt>$ = currState->nlocalvar;} chunk | 723 | block : {$<vInt>$ = L->currState->nlocalvar;} chunk |
723 | { | 724 | { |
724 | adjuststack(currState->nlocalvar - $<vInt>1); | 725 | adjuststack(L->currState->nlocalvar - $<vInt>1); |
725 | for (; currState->nlocalvar > $<vInt>1; currState->nlocalvar--) | 726 | for (; L->currState->nlocalvar > $<vInt>1; L->currState->nlocalvar--) |
726 | luaI_unregisterlocalvar(luaX_linenumber); | 727 | luaI_unregisterlocalvar(L->lexstate->linenumber); |
727 | } | 728 | } |
728 | ; | 729 | ; |
729 | 730 | ||
@@ -753,13 +754,13 @@ ret : /* empty */ | |||
753 | } | 754 | } |
754 | ; | 755 | ; |
755 | 756 | ||
756 | GetPC : /* empty */ { $$ = currState->pc; } | 757 | GetPC : /* empty */ { $$ = L->currState->pc; } |
757 | ; | 758 | ; |
758 | 759 | ||
759 | SaveWord : /* empty */ | 760 | SaveWord : /* empty */ |
760 | { $$ = currState->pc; | 761 | { $$ = L->currState->pc; |
761 | check_pc(JMPSIZE); | 762 | check_pc(JMPSIZE); |
762 | currState->pc += JMPSIZE; /* open space */ | 763 | L->currState->pc += JMPSIZE; /* open space */ |
763 | } | 764 | } |
764 | ; | 765 | ; |
765 | 766 | ||
@@ -808,7 +809,7 @@ functioncall : funcvalue funcParams | |||
808 | { | 809 | { |
809 | code_byte(0); /* save space for opcode */ | 810 | code_byte(0); /* save space for opcode */ |
810 | code_byte($1+$2); /* number of parameters */ | 811 | code_byte($1+$2); /* number of parameters */ |
811 | $$ = currState->pc; | 812 | $$ = L->currState->pc; |
812 | code_byte(0); /* must be adjusted by other rules */ | 813 | code_byte(0); /* must be adjusted by other rules */ |
813 | } | 814 | } |
814 | ; | 815 | ; |
@@ -816,7 +817,7 @@ functioncall : funcvalue funcParams | |||
816 | funcvalue : varexp { $$ = 0; } | 817 | funcvalue : varexp { $$ = 0; } |
817 | | varexp ':' NAME | 818 | | varexp ':' NAME |
818 | { | 819 | { |
819 | code_oparg(PUSHSELF, 0, string_constant($3, currState), 1); | 820 | code_oparg(PUSHSELF, 0, string_constant($3, L->currState), 1); |
820 | $$ = 1; | 821 | $$ = 1; |
821 | } | 822 | } |
822 | ; | 823 | ; |
@@ -834,7 +835,7 @@ exprlist1 : expr { if ($1 != 0) $$ = $1; else $$ = -1; } | |||
834 | { | 835 | { |
835 | if ($4 == 0) $$ = -($<vLong>3 + 1); /* -length */ | 836 | if ($4 == 0) $$ = -($<vLong>3 + 1); /* -length */ |
836 | else { | 837 | else { |
837 | currState->f->code[$4] = $<vLong>3; /* store list length */ | 838 | L->currState->f->code[$4] = $<vLong>3; /* store list length */ |
838 | $$ = $4; | 839 | $$ = $4; |
839 | } | 840 | } |
840 | } | 841 | } |
@@ -899,9 +900,9 @@ varlist1 : var { $$ = 1; add_varbuffer($1, 0); } | |||
899 | | varlist1 ',' var { add_varbuffer($3, $1); $$ = $1+1; } | 900 | | varlist1 ',' var { add_varbuffer($3, $1); $$ = $1+1; } |
900 | ; | 901 | ; |
901 | 902 | ||
902 | var : NAME { $$ = singlevar($1, currState); } | 903 | var : NAME { $$ = singlevar($1, L->currState); } |
903 | | varexp '[' expr1 ']' { $$ = 0; } /* indexed variable */ | 904 | | varexp '[' expr1 ']' { $$ = 0; } /* indexed variable */ |
904 | | varexp '.' NAME { $$ = (-string_constant($3, currState))-1; } | 905 | | varexp '.' NAME { $$ = (-string_constant($3, L->currState))-1; } |
905 | ; | 906 | ; |
906 | 907 | ||
907 | varexp : var { lua_pushvar($1); } | 908 | varexp : var { lua_pushvar($1); } |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lvm.c,v 1.12 1997/10/24 18:40:29 roberto Exp roberto $ | 2 | ** $Id: lvm.c,v 1.13 1997/10/27 16:14:37 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 | */ |
@@ -14,6 +14,7 @@ | |||
14 | #include "lgc.h" | 14 | #include "lgc.h" |
15 | #include "lmem.h" | 15 | #include "lmem.h" |
16 | #include "lopcodes.h" | 16 | #include "lopcodes.h" |
17 | #include "lstate.h" | ||
17 | #include "lstring.h" | 18 | #include "lstring.h" |
18 | #include "ltable.h" | 19 | #include "ltable.h" |
19 | #include "ltm.h" | 20 | #include "ltm.h" |
@@ -79,11 +80,11 @@ int luaV_tostring (TObject *obj) | |||
79 | void luaV_closure (int nelems) | 80 | void luaV_closure (int nelems) |
80 | { | 81 | { |
81 | Closure *c = luaF_newclosure(nelems); | 82 | Closure *c = luaF_newclosure(nelems); |
82 | c->consts[0] = *(luaD_stack.top-1); | 83 | c->consts[0] = *(L->stack.top-1); |
83 | memcpy(&c->consts[1], luaD_stack.top-(nelems+1), nelems*sizeof(TObject)); | 84 | memcpy(&c->consts[1], L->stack.top-(nelems+1), nelems*sizeof(TObject)); |
84 | luaD_stack.top -= nelems; | 85 | L->stack.top -= nelems; |
85 | ttype(luaD_stack.top-1) = LUA_T_FUNCTION; | 86 | ttype(L->stack.top-1) = LUA_T_FUNCTION; |
86 | (luaD_stack.top-1)->value.cl = c; | 87 | (L->stack.top-1)->value.cl = c; |
87 | } | 88 | } |
88 | 89 | ||
89 | 90 | ||
@@ -94,22 +95,22 @@ void luaV_closure (int nelems) | |||
94 | void luaV_gettable (void) | 95 | void luaV_gettable (void) |
95 | { | 96 | { |
96 | TObject *im; | 97 | TObject *im; |
97 | if (ttype(luaD_stack.top-2) != LUA_T_ARRAY) /* not a table, get "gettable" method */ | 98 | if (ttype(L->stack.top-2) != LUA_T_ARRAY) /* not a table, get "gettable" method */ |
98 | im = luaT_getimbyObj(luaD_stack.top-2, IM_GETTABLE); | 99 | im = luaT_getimbyObj(L->stack.top-2, IM_GETTABLE); |
99 | else { /* object is a table... */ | 100 | else { /* object is a table... */ |
100 | int tg = (luaD_stack.top-2)->value.a->htag; | 101 | int tg = (L->stack.top-2)->value.a->htag; |
101 | im = luaT_getim(tg, IM_GETTABLE); | 102 | im = luaT_getim(tg, IM_GETTABLE); |
102 | if (ttype(im) == LUA_T_NIL) { /* and does not have a "gettable" method */ | 103 | if (ttype(im) == LUA_T_NIL) { /* and does not have a "gettable" method */ |
103 | TObject *h = luaH_get(avalue(luaD_stack.top-2), luaD_stack.top-1); | 104 | TObject *h = luaH_get(avalue(L->stack.top-2), L->stack.top-1); |
104 | if (h != NULL && ttype(h) != LUA_T_NIL) { | 105 | if (h != NULL && ttype(h) != LUA_T_NIL) { |
105 | --luaD_stack.top; | 106 | --L->stack.top; |
106 | *(luaD_stack.top-1) = *h; | 107 | *(L->stack.top-1) = *h; |
107 | } | 108 | } |
108 | else if (ttype(im=luaT_getim(tg, IM_INDEX)) != LUA_T_NIL) | 109 | else if (ttype(im=luaT_getim(tg, IM_INDEX)) != LUA_T_NIL) |
109 | luaD_callTM(im, 2, 1); | 110 | luaD_callTM(im, 2, 1); |
110 | else { | 111 | else { |
111 | --luaD_stack.top; | 112 | --L->stack.top; |
112 | ttype(luaD_stack.top-1) = LUA_T_NIL; | 113 | ttype(L->stack.top-1) = LUA_T_NIL; |
113 | } | 114 | } |
114 | return; | 115 | return; |
115 | } | 116 | } |
@@ -124,26 +125,26 @@ void luaV_gettable (void) | |||
124 | 125 | ||
125 | 126 | ||
126 | /* | 127 | /* |
127 | ** Function to store indexed based on values at the luaD_stack.top | 128 | ** Function to store indexed based on values at the L->stack.top |
128 | ** mode = 0: raw store (without internal methods) | 129 | ** mode = 0: raw store (without internal methods) |
129 | ** mode = 1: normal store (with internal methods) | 130 | ** mode = 1: normal store (with internal methods) |
130 | ** mode = 2: "deep luaD_stack.stack" store (with internal methods) | 131 | ** mode = 2: "deep L->stack.stack" store (with internal methods) |
131 | */ | 132 | */ |
132 | void luaV_settable (TObject *t, int mode) | 133 | void luaV_settable (TObject *t, int mode) |
133 | { | 134 | { |
134 | TObject *im = (mode == 0) ? NULL : luaT_getimbyObj(t, IM_SETTABLE); | 135 | TObject *im = (mode == 0) ? NULL : luaT_getimbyObj(t, IM_SETTABLE); |
135 | if (ttype(t) == LUA_T_ARRAY && (im == NULL || ttype(im) == LUA_T_NIL)) { | 136 | if (ttype(t) == LUA_T_ARRAY && (im == NULL || ttype(im) == LUA_T_NIL)) { |
136 | TObject *h = luaH_set(avalue(t), t+1); | 137 | TObject *h = luaH_set(avalue(t), t+1); |
137 | *h = *(luaD_stack.top-1); | 138 | *h = *(L->stack.top-1); |
138 | luaD_stack.top -= (mode == 2) ? 1 : 3; | 139 | L->stack.top -= (mode == 2) ? 1 : 3; |
139 | } | 140 | } |
140 | else { /* object is not a table, and/or has a specific "settable" method */ | 141 | else { /* object is not a table, and/or has a specific "settable" method */ |
141 | if (im && ttype(im) != LUA_T_NIL) { | 142 | if (im && ttype(im) != LUA_T_NIL) { |
142 | if (mode == 2) { | 143 | if (mode == 2) { |
143 | *(luaD_stack.top+1) = *(luaD_stack.top-1); | 144 | *(L->stack.top+1) = *(L->stack.top-1); |
144 | *(luaD_stack.top) = *(t+1); | 145 | *(L->stack.top) = *(t+1); |
145 | *(luaD_stack.top-1) = *t; | 146 | *(L->stack.top-1) = *t; |
146 | luaD_stack.top += 2; /* WARNING: caller must assure stack space */ | 147 | L->stack.top += 2; /* WARNING: caller must assure stack space */ |
147 | } | 148 | } |
148 | luaD_callTM(im, 3, 0); | 149 | luaD_callTM(im, 3, 0); |
149 | } | 150 | } |
@@ -159,13 +160,13 @@ void luaV_getglobal (TaggedString *ts) | |||
159 | TObject *value = &ts->u.globalval; | 160 | TObject *value = &ts->u.globalval; |
160 | TObject *im = luaT_getimbyObj(value, IM_GETGLOBAL); | 161 | TObject *im = luaT_getimbyObj(value, IM_GETGLOBAL); |
161 | if (ttype(im) == LUA_T_NIL) { /* default behavior */ | 162 | if (ttype(im) == LUA_T_NIL) { /* default behavior */ |
162 | *luaD_stack.top++ = *value; | 163 | *L->stack.top++ = *value; |
163 | } | 164 | } |
164 | else { | 165 | else { |
165 | ttype(luaD_stack.top) = LUA_T_STRING; | 166 | ttype(L->stack.top) = LUA_T_STRING; |
166 | tsvalue(luaD_stack.top) = ts; | 167 | tsvalue(L->stack.top) = ts; |
167 | luaD_stack.top++; | 168 | L->stack.top++; |
168 | *luaD_stack.top++ = *value; | 169 | *L->stack.top++ = *value; |
169 | luaD_callTM(im, 2, 1); | 170 | luaD_callTM(im, 2, 1); |
170 | } | 171 | } |
171 | } | 172 | } |
@@ -176,14 +177,14 @@ void luaV_setglobal (TaggedString *ts) | |||
176 | TObject *oldvalue = &ts->u.globalval; | 177 | TObject *oldvalue = &ts->u.globalval; |
177 | TObject *im = luaT_getimbyObj(oldvalue, IM_SETGLOBAL); | 178 | TObject *im = luaT_getimbyObj(oldvalue, IM_SETGLOBAL); |
178 | if (ttype(im) == LUA_T_NIL) /* default behavior */ | 179 | if (ttype(im) == LUA_T_NIL) /* default behavior */ |
179 | luaS_rawsetglobal(ts, --luaD_stack.top); | 180 | luaS_rawsetglobal(ts, --L->stack.top); |
180 | else { | 181 | else { |
181 | /* WARNING: caller must assure stack space */ | 182 | /* WARNING: caller must assure stack space */ |
182 | TObject newvalue = *(luaD_stack.top-1); | 183 | TObject newvalue = *(L->stack.top-1); |
183 | ttype(luaD_stack.top-1) = LUA_T_STRING; | 184 | ttype(L->stack.top-1) = LUA_T_STRING; |
184 | tsvalue(luaD_stack.top-1) = ts; | 185 | tsvalue(L->stack.top-1) = ts; |
185 | *luaD_stack.top++ = *oldvalue; | 186 | *L->stack.top++ = *oldvalue; |
186 | *luaD_stack.top++ = newvalue; | 187 | *L->stack.top++ = newvalue; |
187 | luaD_callTM(im, 3, 0); | 188 | luaD_callTM(im, 3, 0); |
188 | } | 189 | } |
189 | } | 190 | } |
@@ -191,9 +192,9 @@ void luaV_setglobal (TaggedString *ts) | |||
191 | 192 | ||
192 | static void call_binTM (IMS event, char *msg) | 193 | static void call_binTM (IMS event, char *msg) |
193 | { | 194 | { |
194 | TObject *im = luaT_getimbyObj(luaD_stack.top-2, event);/* try first operand */ | 195 | TObject *im = luaT_getimbyObj(L->stack.top-2, event);/* try first operand */ |
195 | if (ttype(im) == LUA_T_NIL) { | 196 | if (ttype(im) == LUA_T_NIL) { |
196 | im = luaT_getimbyObj(luaD_stack.top-1, event); /* try second operand */ | 197 | im = luaT_getimbyObj(L->stack.top-1, event); /* try second operand */ |
197 | if (ttype(im) == LUA_T_NIL) { | 198 | if (ttype(im) == LUA_T_NIL) { |
198 | im = luaT_getim(0, event); /* try a 'global' i.m. */ | 199 | im = luaT_getim(0, event); /* try a 'global' i.m. */ |
199 | if (ttype(im) == LUA_T_NIL) | 200 | if (ttype(im) == LUA_T_NIL) |
@@ -214,8 +215,8 @@ static void call_arith (IMS event) | |||
214 | static void comparison (lua_Type ttype_less, lua_Type ttype_equal, | 215 | static void comparison (lua_Type ttype_less, lua_Type ttype_equal, |
215 | lua_Type ttype_great, IMS op) | 216 | lua_Type ttype_great, IMS op) |
216 | { | 217 | { |
217 | TObject *l = luaD_stack.top-2; | 218 | TObject *l = L->stack.top-2; |
218 | TObject *r = luaD_stack.top-1; | 219 | TObject *r = L->stack.top-1; |
219 | int result; | 220 | int result; |
220 | if (ttype(l) == LUA_T_NUMBER && ttype(r) == LUA_T_NUMBER) | 221 | if (ttype(l) == LUA_T_NUMBER && ttype(r) == LUA_T_NUMBER) |
221 | result = (nvalue(l) < nvalue(r)) ? -1 : (nvalue(l) == nvalue(r)) ? 0 : 1; | 222 | result = (nvalue(l) < nvalue(r)) ? -1 : (nvalue(l) == nvalue(r)) ? 0 : 1; |
@@ -225,16 +226,16 @@ static void comparison (lua_Type ttype_less, lua_Type ttype_equal, | |||
225 | call_binTM(op, "unexpected type at comparison"); | 226 | call_binTM(op, "unexpected type at comparison"); |
226 | return; | 227 | return; |
227 | } | 228 | } |
228 | luaD_stack.top--; | 229 | L->stack.top--; |
229 | nvalue(luaD_stack.top-1) = 1; | 230 | nvalue(L->stack.top-1) = 1; |
230 | ttype(luaD_stack.top-1) = (result < 0) ? ttype_less : | 231 | ttype(L->stack.top-1) = (result < 0) ? ttype_less : |
231 | (result == 0) ? ttype_equal : ttype_great; | 232 | (result == 0) ? ttype_equal : ttype_great; |
232 | } | 233 | } |
233 | 234 | ||
234 | 235 | ||
235 | void luaV_pack (StkId firstel, int nvararg, TObject *tab) | 236 | void luaV_pack (StkId firstel, int nvararg, TObject *tab) |
236 | { | 237 | { |
237 | TObject *firstelem = luaD_stack.stack+firstel; | 238 | TObject *firstelem = L->stack.stack+firstel; |
238 | int i; | 239 | int i; |
239 | if (nvararg < 0) nvararg = 0; | 240 | if (nvararg < 0) nvararg = 0; |
240 | avalue(tab) = luaH_new(nvararg+1); /* +1 for field 'n' */ | 241 | avalue(tab) = luaH_new(nvararg+1); /* +1 for field 'n' */ |
@@ -260,20 +261,21 @@ static void adjust_varargs (StkId first_extra_arg) | |||
260 | { | 261 | { |
261 | TObject arg; | 262 | TObject arg; |
262 | luaV_pack(first_extra_arg, | 263 | luaV_pack(first_extra_arg, |
263 | (luaD_stack.top-luaD_stack.stack)-first_extra_arg, &arg); | 264 | (L->stack.top-L->stack.stack)-first_extra_arg, &arg); |
264 | luaD_adjusttop(first_extra_arg); | 265 | luaD_adjusttop(first_extra_arg); |
265 | *luaD_stack.top++ = arg; | 266 | *L->stack.top++ = arg; |
266 | } | 267 | } |
267 | 268 | ||
268 | 269 | ||
269 | 270 | ||
270 | /* | 271 | /* |
271 | ** Execute the given opcode, until a RET. Parameters are between | 272 | ** Execute the given opcode, until a RET. Parameters are between |
272 | ** [luaD_stack.stack+base,luaD_stack.top). Returns n such that the the results are between | 273 | ** [stack+base,top). Returns n such that the the results are between |
273 | ** [luaD_stack.stack+n,luaD_stack.top). | 274 | ** [stack+n,top). |
274 | */ | 275 | */ |
275 | StkId luaV_execute (Closure *cl, StkId base) | 276 | StkId luaV_execute (Closure *cl, StkId base) |
276 | { | 277 | { |
278 | LState *LL = L; /* to optimize */ | ||
277 | Byte *pc = cl->consts[0].value.tf->code; | 279 | Byte *pc = cl->consts[0].value.tf->code; |
278 | TObject *consts = cl->consts[0].value.tf->consts; | 280 | TObject *consts = cl->consts[0].value.tf->consts; |
279 | if (lua_callhook) | 281 | if (lua_callhook) |
@@ -284,13 +286,13 @@ StkId luaV_execute (Closure *cl, StkId base) | |||
284 | switch ((OpCode)(aux = *pc++)) { | 286 | switch ((OpCode)(aux = *pc++)) { |
285 | 287 | ||
286 | case PUSHNIL0: | 288 | case PUSHNIL0: |
287 | ttype(luaD_stack.top++) = LUA_T_NIL; | 289 | ttype(LL->stack.top++) = LUA_T_NIL; |
288 | break; | 290 | break; |
289 | 291 | ||
290 | case PUSHNIL: | 292 | case PUSHNIL: |
291 | aux = *pc++; | 293 | aux = *pc++; |
292 | do { | 294 | do { |
293 | ttype(luaD_stack.top++) = LUA_T_NIL; | 295 | ttype(LL->stack.top++) = LUA_T_NIL; |
294 | } while (aux--); | 296 | } while (aux--); |
295 | break; | 297 | break; |
296 | 298 | ||
@@ -303,9 +305,9 @@ StkId luaV_execute (Closure *cl, StkId base) | |||
303 | case PUSHNUMBER0: case PUSHNUMBER1: case PUSHNUMBER2: | 305 | case PUSHNUMBER0: case PUSHNUMBER1: case PUSHNUMBER2: |
304 | aux -= PUSHNUMBER0; | 306 | aux -= PUSHNUMBER0; |
305 | pushnumber: | 307 | pushnumber: |
306 | ttype(luaD_stack.top) = LUA_T_NUMBER; | 308 | ttype(LL->stack.top) = LUA_T_NUMBER; |
307 | nvalue(luaD_stack.top) = aux; | 309 | nvalue(LL->stack.top) = aux; |
308 | luaD_stack.top++; | 310 | LL->stack.top++; |
309 | break; | 311 | break; |
310 | 312 | ||
311 | case PUSHLOCAL: | 313 | case PUSHLOCAL: |
@@ -315,7 +317,7 @@ StkId luaV_execute (Closure *cl, StkId base) | |||
315 | case PUSHLOCAL4: case PUSHLOCAL5: case PUSHLOCAL6: case PUSHLOCAL7: | 317 | case PUSHLOCAL4: case PUSHLOCAL5: case PUSHLOCAL6: case PUSHLOCAL7: |
316 | aux -= PUSHLOCAL0; | 318 | aux -= PUSHLOCAL0; |
317 | pushlocal: | 319 | pushlocal: |
318 | *luaD_stack.top++ = *((luaD_stack.stack+base) + aux); | 320 | *LL->stack.top++ = *((LL->stack.stack+base) + aux); |
319 | break; | 321 | break; |
320 | 322 | ||
321 | case GETGLOBALW: | 323 | case GETGLOBALW: |
@@ -345,7 +347,7 @@ StkId luaV_execute (Closure *cl, StkId base) | |||
345 | case GETDOTTED4: case GETDOTTED5: case GETDOTTED6: case GETDOTTED7: | 347 | case GETDOTTED4: case GETDOTTED5: case GETDOTTED6: case GETDOTTED7: |
346 | aux -= GETDOTTED0; | 348 | aux -= GETDOTTED0; |
347 | getdotted: | 349 | getdotted: |
348 | *luaD_stack.top++ = consts[aux]; | 350 | *LL->stack.top++ = consts[aux]; |
349 | luaV_gettable(); | 351 | luaV_gettable(); |
350 | break; | 352 | break; |
351 | 353 | ||
@@ -355,10 +357,10 @@ StkId luaV_execute (Closure *cl, StkId base) | |||
355 | case PUSHSELF: | 357 | case PUSHSELF: |
356 | aux = *pc++; | 358 | aux = *pc++; |
357 | pushself: { | 359 | pushself: { |
358 | TObject receiver = *(luaD_stack.top-1); | 360 | TObject receiver = *(LL->stack.top-1); |
359 | *luaD_stack.top++ = consts[aux]; | 361 | *LL->stack.top++ = consts[aux]; |
360 | luaV_gettable(); | 362 | luaV_gettable(); |
361 | *luaD_stack.top++ = receiver; | 363 | *LL->stack.top++ = receiver; |
362 | break; | 364 | break; |
363 | } | 365 | } |
364 | 366 | ||
@@ -373,7 +375,7 @@ StkId luaV_execute (Closure *cl, StkId base) | |||
373 | case PUSHCONSTANT6: case PUSHCONSTANT7: | 375 | case PUSHCONSTANT6: case PUSHCONSTANT7: |
374 | aux -= PUSHCONSTANT0; | 376 | aux -= PUSHCONSTANT0; |
375 | pushconstant: | 377 | pushconstant: |
376 | *luaD_stack.top++ = consts[aux]; | 378 | *LL->stack.top++ = consts[aux]; |
377 | break; | 379 | break; |
378 | 380 | ||
379 | case PUSHUPVALUE: | 381 | case PUSHUPVALUE: |
@@ -382,7 +384,7 @@ StkId luaV_execute (Closure *cl, StkId base) | |||
382 | case PUSHUPVALUE0: case PUSHUPVALUE1: | 384 | case PUSHUPVALUE0: case PUSHUPVALUE1: |
383 | aux -= PUSHUPVALUE0; | 385 | aux -= PUSHUPVALUE0; |
384 | pushupvalue: | 386 | pushupvalue: |
385 | *luaD_stack.top++ = cl->consts[aux+1]; | 387 | *LL->stack.top++ = cl->consts[aux+1]; |
386 | break; | 388 | break; |
387 | 389 | ||
388 | case SETLOCAL: | 390 | case SETLOCAL: |
@@ -392,7 +394,7 @@ StkId luaV_execute (Closure *cl, StkId base) | |||
392 | case SETLOCAL4: case SETLOCAL5: case SETLOCAL6: case SETLOCAL7: | 394 | case SETLOCAL4: case SETLOCAL5: case SETLOCAL6: case SETLOCAL7: |
393 | aux -= SETLOCAL0; | 395 | aux -= SETLOCAL0; |
394 | setlocal: | 396 | setlocal: |
395 | *((luaD_stack.stack+base) + aux) = *(--luaD_stack.top); | 397 | *((LL->stack.stack+base) + aux) = *(--LL->stack.top); |
396 | break; | 398 | break; |
397 | 399 | ||
398 | case SETGLOBALW: | 400 | case SETGLOBALW: |
@@ -409,11 +411,11 @@ StkId luaV_execute (Closure *cl, StkId base) | |||
409 | break; | 411 | break; |
410 | 412 | ||
411 | case SETTABLE0: | 413 | case SETTABLE0: |
412 | luaV_settable(luaD_stack.top-3, 1); | 414 | luaV_settable(LL->stack.top-3, 1); |
413 | break; | 415 | break; |
414 | 416 | ||
415 | case SETTABLE: | 417 | case SETTABLE: |
416 | luaV_settable(luaD_stack.top-3-(*pc++), 2); | 418 | luaV_settable(LL->stack.top-3-(*pc++), 2); |
417 | break; | 419 | break; |
418 | 420 | ||
419 | case SETLISTW: | 421 | case SETLISTW: |
@@ -426,12 +428,12 @@ StkId luaV_execute (Closure *cl, StkId base) | |||
426 | aux = 0; | 428 | aux = 0; |
427 | setlist: { | 429 | setlist: { |
428 | int n = *(pc++); | 430 | int n = *(pc++); |
429 | TObject *arr = luaD_stack.top-n-1; | 431 | TObject *arr = LL->stack.top-n-1; |
430 | for (; n; n--) { | 432 | for (; n; n--) { |
431 | ttype(luaD_stack.top) = LUA_T_NUMBER; | 433 | ttype(LL->stack.top) = LUA_T_NUMBER; |
432 | nvalue(luaD_stack.top) = n+aux; | 434 | nvalue(LL->stack.top) = n+aux; |
433 | *(luaH_set (avalue(arr), luaD_stack.top)) = *(luaD_stack.top-1); | 435 | *(luaH_set (avalue(arr), LL->stack.top)) = *(LL->stack.top-1); |
434 | luaD_stack.top--; | 436 | LL->stack.top--; |
435 | } | 437 | } |
436 | break; | 438 | break; |
437 | } | 439 | } |
@@ -442,10 +444,10 @@ StkId luaV_execute (Closure *cl, StkId base) | |||
442 | case SETMAP: | 444 | case SETMAP: |
443 | aux = *pc++; | 445 | aux = *pc++; |
444 | setmap: { | 446 | setmap: { |
445 | TObject *arr = luaD_stack.top-(2*aux)-3; | 447 | TObject *arr = LL->stack.top-(2*aux)-3; |
446 | do { | 448 | do { |
447 | *(luaH_set (avalue(arr), luaD_stack.top-2)) = *(luaD_stack.top-1); | 449 | *(luaH_set (avalue(arr), LL->stack.top-2)) = *(LL->stack.top-1); |
448 | luaD_stack.top-=2; | 450 | LL->stack.top-=2; |
449 | } while (aux--); | 451 | } while (aux--); |
450 | break; | 452 | break; |
451 | } | 453 | } |
@@ -456,7 +458,7 @@ StkId luaV_execute (Closure *cl, StkId base) | |||
456 | case POP0: case POP1: | 458 | case POP0: case POP1: |
457 | aux -= POP0; | 459 | aux -= POP0; |
458 | pop: | 460 | pop: |
459 | luaD_stack.top -= (aux+1); | 461 | LL->stack.top -= (aux+1); |
460 | break; | 462 | break; |
461 | 463 | ||
462 | case ARGS: | 464 | case ARGS: |
@@ -478,17 +480,17 @@ StkId luaV_execute (Closure *cl, StkId base) | |||
478 | aux = *pc++; | 480 | aux = *pc++; |
479 | createarray: | 481 | createarray: |
480 | luaC_checkGC(); | 482 | luaC_checkGC(); |
481 | avalue(luaD_stack.top) = luaH_new(aux); | 483 | avalue(LL->stack.top) = luaH_new(aux); |
482 | ttype(luaD_stack.top) = LUA_T_ARRAY; | 484 | ttype(LL->stack.top) = LUA_T_ARRAY; |
483 | luaD_stack.top++; | 485 | LL->stack.top++; |
484 | break; | 486 | break; |
485 | 487 | ||
486 | case EQOP: case NEQOP: { | 488 | case EQOP: case NEQOP: { |
487 | int res = luaO_equalObj(luaD_stack.top-2, luaD_stack.top-1); | 489 | int res = luaO_equalObj(LL->stack.top-2, LL->stack.top-1); |
488 | luaD_stack.top--; | 490 | LL->stack.top--; |
489 | if (aux == NEQOP) res = !res; | 491 | if (aux == NEQOP) res = !res; |
490 | ttype(luaD_stack.top-1) = res ? LUA_T_NUMBER : LUA_T_NIL; | 492 | ttype(LL->stack.top-1) = res ? LUA_T_NUMBER : LUA_T_NIL; |
491 | nvalue(luaD_stack.top-1) = 1; | 493 | nvalue(LL->stack.top-1) = 1; |
492 | break; | 494 | break; |
493 | } | 495 | } |
494 | 496 | ||
@@ -509,49 +511,49 @@ StkId luaV_execute (Closure *cl, StkId base) | |||
509 | break; | 511 | break; |
510 | 512 | ||
511 | case ADDOP: { | 513 | case ADDOP: { |
512 | TObject *l = luaD_stack.top-2; | 514 | TObject *l = LL->stack.top-2; |
513 | TObject *r = luaD_stack.top-1; | 515 | TObject *r = LL->stack.top-1; |
514 | if (tonumber(r) || tonumber(l)) | 516 | if (tonumber(r) || tonumber(l)) |
515 | call_arith(IM_ADD); | 517 | call_arith(IM_ADD); |
516 | else { | 518 | else { |
517 | nvalue(l) += nvalue(r); | 519 | nvalue(l) += nvalue(r); |
518 | --luaD_stack.top; | 520 | --LL->stack.top; |
519 | } | 521 | } |
520 | break; | 522 | break; |
521 | } | 523 | } |
522 | 524 | ||
523 | case SUBOP: { | 525 | case SUBOP: { |
524 | TObject *l = luaD_stack.top-2; | 526 | TObject *l = LL->stack.top-2; |
525 | TObject *r = luaD_stack.top-1; | 527 | TObject *r = LL->stack.top-1; |
526 | if (tonumber(r) || tonumber(l)) | 528 | if (tonumber(r) || tonumber(l)) |
527 | call_arith(IM_SUB); | 529 | call_arith(IM_SUB); |
528 | else { | 530 | else { |
529 | nvalue(l) -= nvalue(r); | 531 | nvalue(l) -= nvalue(r); |
530 | --luaD_stack.top; | 532 | --LL->stack.top; |
531 | } | 533 | } |
532 | break; | 534 | break; |
533 | } | 535 | } |
534 | 536 | ||
535 | case MULTOP: { | 537 | case MULTOP: { |
536 | TObject *l = luaD_stack.top-2; | 538 | TObject *l = LL->stack.top-2; |
537 | TObject *r = luaD_stack.top-1; | 539 | TObject *r = LL->stack.top-1; |
538 | if (tonumber(r) || tonumber(l)) | 540 | if (tonumber(r) || tonumber(l)) |
539 | call_arith(IM_MUL); | 541 | call_arith(IM_MUL); |
540 | else { | 542 | else { |
541 | nvalue(l) *= nvalue(r); | 543 | nvalue(l) *= nvalue(r); |
542 | --luaD_stack.top; | 544 | --LL->stack.top; |
543 | } | 545 | } |
544 | break; | 546 | break; |
545 | } | 547 | } |
546 | 548 | ||
547 | case DIVOP: { | 549 | case DIVOP: { |
548 | TObject *l = luaD_stack.top-2; | 550 | TObject *l = LL->stack.top-2; |
549 | TObject *r = luaD_stack.top-1; | 551 | TObject *r = LL->stack.top-1; |
550 | if (tonumber(r) || tonumber(l)) | 552 | if (tonumber(r) || tonumber(l)) |
551 | call_arith(IM_DIV); | 553 | call_arith(IM_DIV); |
552 | else { | 554 | else { |
553 | nvalue(l) /= nvalue(r); | 555 | nvalue(l) /= nvalue(r); |
554 | --luaD_stack.top; | 556 | --LL->stack.top; |
555 | } | 557 | } |
556 | break; | 558 | break; |
557 | } | 559 | } |
@@ -561,32 +563,32 @@ StkId luaV_execute (Closure *cl, StkId base) | |||
561 | break; | 563 | break; |
562 | 564 | ||
563 | case CONCOP: { | 565 | case CONCOP: { |
564 | TObject *l = luaD_stack.top-2; | 566 | TObject *l = LL->stack.top-2; |
565 | TObject *r = luaD_stack.top-1; | 567 | TObject *r = LL->stack.top-1; |
566 | if (tostring(l) || tostring(r)) | 568 | if (tostring(l) || tostring(r)) |
567 | call_binTM(IM_CONCAT, "unexpected type for concatenation"); | 569 | call_binTM(IM_CONCAT, "unexpected type for concatenation"); |
568 | else { | 570 | else { |
569 | tsvalue(l) = strconc(svalue(l), svalue(r)); | 571 | tsvalue(l) = strconc(svalue(l), svalue(r)); |
570 | --luaD_stack.top; | 572 | --LL->stack.top; |
571 | } | 573 | } |
572 | luaC_checkGC(); | 574 | luaC_checkGC(); |
573 | break; | 575 | break; |
574 | } | 576 | } |
575 | 577 | ||
576 | case MINUSOP: | 578 | case MINUSOP: |
577 | if (tonumber(luaD_stack.top-1)) { | 579 | if (tonumber(LL->stack.top-1)) { |
578 | ttype(luaD_stack.top) = LUA_T_NIL; | 580 | ttype(LL->stack.top) = LUA_T_NIL; |
579 | luaD_stack.top++; | 581 | LL->stack.top++; |
580 | call_arith(IM_UNM); | 582 | call_arith(IM_UNM); |
581 | } | 583 | } |
582 | else | 584 | else |
583 | nvalue(luaD_stack.top-1) = - nvalue(luaD_stack.top-1); | 585 | nvalue(LL->stack.top-1) = - nvalue(LL->stack.top-1); |
584 | break; | 586 | break; |
585 | 587 | ||
586 | case NOTOP: | 588 | case NOTOP: |
587 | ttype(luaD_stack.top-1) = | 589 | ttype(LL->stack.top-1) = |
588 | (ttype(luaD_stack.top-1) == LUA_T_NIL) ? LUA_T_NUMBER : LUA_T_NIL; | 590 | (ttype(LL->stack.top-1) == LUA_T_NIL) ? LUA_T_NUMBER : LUA_T_NIL; |
589 | nvalue(luaD_stack.top-1) = 1; | 591 | nvalue(LL->stack.top-1) = 1; |
590 | break; | 592 | break; |
591 | 593 | ||
592 | case ONTJMPW: | 594 | case ONTJMPW: |
@@ -595,8 +597,8 @@ StkId luaV_execute (Closure *cl, StkId base) | |||
595 | case ONTJMP: | 597 | case ONTJMP: |
596 | aux = *pc++; | 598 | aux = *pc++; |
597 | ontjmp: | 599 | ontjmp: |
598 | if (ttype(luaD_stack.top-1) != LUA_T_NIL) pc += aux; | 600 | if (ttype(LL->stack.top-1) != LUA_T_NIL) pc += aux; |
599 | else luaD_stack.top--; | 601 | else LL->stack.top--; |
600 | break; | 602 | break; |
601 | 603 | ||
602 | case ONFJMPW: | 604 | case ONFJMPW: |
@@ -605,8 +607,8 @@ StkId luaV_execute (Closure *cl, StkId base) | |||
605 | case ONFJMP: | 607 | case ONFJMP: |
606 | aux = *pc++; | 608 | aux = *pc++; |
607 | onfjmp: | 609 | onfjmp: |
608 | if (ttype(luaD_stack.top-1) == LUA_T_NIL) pc += aux; | 610 | if (ttype(LL->stack.top-1) == LUA_T_NIL) pc += aux; |
609 | else luaD_stack.top--; | 611 | else LL->stack.top--; |
610 | break; | 612 | break; |
611 | 613 | ||
612 | case JMPW: | 614 | case JMPW: |
@@ -624,7 +626,7 @@ StkId luaV_execute (Closure *cl, StkId base) | |||
624 | case IFFJMP: | 626 | case IFFJMP: |
625 | aux = *pc++; | 627 | aux = *pc++; |
626 | iffjmp: | 628 | iffjmp: |
627 | if (ttype(--luaD_stack.top) == LUA_T_NIL) pc += aux; | 629 | if (ttype(--LL->stack.top) == LUA_T_NIL) pc += aux; |
628 | break; | 630 | break; |
629 | 631 | ||
630 | case IFTUPJMPW: | 632 | case IFTUPJMPW: |
@@ -633,7 +635,7 @@ StkId luaV_execute (Closure *cl, StkId base) | |||
633 | case IFTUPJMP: | 635 | case IFTUPJMP: |
634 | aux = *pc++; | 636 | aux = *pc++; |
635 | iftupjmp: | 637 | iftupjmp: |
636 | if (ttype(--luaD_stack.top) != LUA_T_NIL) pc -= aux; | 638 | if (ttype(--LL->stack.top) != LUA_T_NIL) pc -= aux; |
637 | break; | 639 | break; |
638 | 640 | ||
639 | case IFFUPJMPW: | 641 | case IFFUPJMPW: |
@@ -642,7 +644,7 @@ StkId luaV_execute (Closure *cl, StkId base) | |||
642 | case IFFUPJMP: | 644 | case IFFUPJMP: |
643 | aux = *pc++; | 645 | aux = *pc++; |
644 | iffupjmp: | 646 | iffupjmp: |
645 | if (ttype(--luaD_stack.top) == LUA_T_NIL) pc -= aux; | 647 | if (ttype(--LL->stack.top) == LUA_T_NIL) pc -= aux; |
646 | break; | 648 | break; |
647 | 649 | ||
648 | case CLOSURE: | 650 | case CLOSURE: |
@@ -661,13 +663,13 @@ StkId luaV_execute (Closure *cl, StkId base) | |||
661 | case CALLFUNC0: case CALLFUNC1: | 663 | case CALLFUNC0: case CALLFUNC1: |
662 | aux -= CALLFUNC0; | 664 | aux -= CALLFUNC0; |
663 | callfunc: { | 665 | callfunc: { |
664 | StkId newBase = (luaD_stack.top-luaD_stack.stack)-(*pc++); | 666 | StkId newBase = (LL->stack.top-LL->stack.stack)-(*pc++); |
665 | luaD_call(newBase, aux); | 667 | luaD_call(newBase, aux); |
666 | break; | 668 | break; |
667 | } | 669 | } |
668 | 670 | ||
669 | case ENDCODE: | 671 | case ENDCODE: |
670 | luaD_stack.top = luaD_stack.stack + base; | 672 | LL->stack.top = LL->stack.stack + base; |
671 | /* goes through */ | 673 | /* goes through */ |
672 | case RETCODE: | 674 | case RETCODE: |
673 | if (lua_callhook) | 675 | if (lua_callhook) |
@@ -680,13 +682,13 @@ StkId luaV_execute (Closure *cl, StkId base) | |||
680 | case SETLINE: | 682 | case SETLINE: |
681 | aux = *pc++; | 683 | aux = *pc++; |
682 | setline: | 684 | setline: |
683 | if ((luaD_stack.stack+base-1)->ttype != LUA_T_LINE) { | 685 | if ((LL->stack.stack+base-1)->ttype != LUA_T_LINE) { |
684 | /* open space for LINE value */ | 686 | /* open space for LINE value */ |
685 | luaD_openstack((luaD_stack.top-luaD_stack.stack)-base); | 687 | luaD_openstack((LL->stack.top-LL->stack.stack)-base); |
686 | base++; | 688 | base++; |
687 | (luaD_stack.stack+base-1)->ttype = LUA_T_LINE; | 689 | (LL->stack.stack+base-1)->ttype = LUA_T_LINE; |
688 | } | 690 | } |
689 | (luaD_stack.stack+base-1)->value.i = aux; | 691 | (LL->stack.stack+base-1)->value.i = aux; |
690 | if (lua_linehook) | 692 | if (lua_linehook) |
691 | luaD_lineHook(aux); | 693 | luaD_lineHook(aux); |
692 | break; | 694 | break; |
@@ -1,5 +1,5 @@ | |||
1 | # | 1 | # |
2 | ## $Id: makefile,v 1.4 1997/10/24 17:17:24 roberto Exp roberto $ | 2 | ## $Id: makefile,v 1.5 1997/11/07 15:09:49 roberto Exp roberto $ |
3 | ## Makefile | 3 | ## Makefile |
4 | ## See Copyright Notice in lua.h | 4 | ## See Copyright Notice in lua.h |
5 | # | 5 | # |
@@ -18,7 +18,7 @@ | |||
18 | # define LUA_COMPAT2_5=0 if yous system does not need to be compatible with | 18 | # define LUA_COMPAT2_5=0 if yous system does not need to be compatible with |
19 | # version 2.5 (or older) | 19 | # version 2.5 (or older) |
20 | 20 | ||
21 | CONFIG = -DPOPEN -D_POSIX_SOURCE | 21 | CONFIG = -DPOPEN -D_POSIX_SOURCE -DLUA_COMPAT2_5=0 |
22 | #CONFIG = -DLUA_COMPAT2_5=0 -DOLD_ANSI -DDEBUG | 22 | #CONFIG = -DLUA_COMPAT2_5=0 -DOLD_ANSI -DDEBUG |
23 | 23 | ||
24 | 24 | ||
@@ -43,6 +43,7 @@ LUAOBJS = \ | |||
43 | llex.o \ | 43 | llex.o \ |
44 | lmem.o \ | 44 | lmem.o \ |
45 | lobject.o \ | 45 | lobject.o \ |
46 | lstate.o \ | ||
46 | lstx.o \ | 47 | lstx.o \ |
47 | lstring.o \ | 48 | lstring.o \ |
48 | ltable.o \ | 49 | ltable.o \ |
@@ -90,32 +91,34 @@ clear : | |||
90 | %.c : RCS/%.c,v | 91 | %.c : RCS/%.c,v |
91 | co $@ | 92 | co $@ |
92 | 93 | ||
93 | lapi.o: lapi.c lapi.h lua.h lobject.h lauxlib.h lbuiltin.h ldo.h \ | 94 | |
94 | lfunc.h lgc.h llex.h lzio.h lmem.h lstring.h ltable.h ltm.h \ | 95 | lapi.o: lapi.c lapi.h lua.h lobject.h lauxlib.h ldo.h lstate.h lfunc.h \ |
95 | luadebug.h lvm.h | 96 | lgc.h lmem.h lstring.h ltable.h ltm.h luadebug.h lvm.h |
96 | lauxlib.o: lauxlib.c lauxlib.h lua.h luadebug.h | 97 | lauxlib.o: lauxlib.c lauxlib.h lua.h luadebug.h |
97 | lbuiltin.o: lbuiltin.c lapi.h lua.h lobject.h lauxlib.h lbuiltin.h \ | 98 | lbuiltin.o: lbuiltin.c lapi.h lua.h lobject.h lauxlib.h lbuiltin.h \ |
98 | ldo.h lfunc.h lmem.h lstring.h ltable.h ltm.h | 99 | ldo.h lstate.h lfunc.h lmem.h lstring.h ltable.h ltm.h |
99 | ldo.o: ldo.c ldo.h lobject.h lua.h lfunc.h lgc.h lmem.h lparser.h \ | 100 | ldo.o: ldo.c ldo.h lobject.h lua.h lstate.h lfunc.h lgc.h lmem.h \ |
100 | lzio.h ltm.h luadebug.h lundump.h lvm.h | 101 | lparser.h lzio.h ltm.h luadebug.h lundump.h lvm.h |
101 | lfunc.o: lfunc.c lfunc.h lobject.h lua.h lmem.h | 102 | lfunc.o: lfunc.c lfunc.h lobject.h lua.h lmem.h lstate.h |
102 | lgc.o: lgc.c ldo.h lobject.h lua.h lfunc.h lgc.h lmem.h lstring.h \ | 103 | lgc.o: lgc.c ldo.h lobject.h lua.h lstate.h lfunc.h lgc.h lmem.h \ |
103 | ltable.h ltm.h | 104 | lstring.h ltable.h ltm.h |
104 | liolib.o: liolib.c lauxlib.h lua.h luadebug.h lualib.h | 105 | liolib.o: liolib.c lauxlib.h lua.h luadebug.h lualib.h |
105 | llex.o: llex.c llex.h lobject.h lua.h lzio.h lmem.h lparser.h \ | 106 | llex.o: llex.c llex.h lobject.h lua.h lzio.h lmem.h lparser.h lstate.h \ |
106 | lstring.h lstx.h luadebug.h | 107 | lstring.h lstx.h luadebug.h |
107 | lmathlib.o: lmathlib.c lauxlib.h lua.h lualib.h | 108 | lmathlib.o: lmathlib.c lauxlib.h lua.h lualib.h |
108 | lmem.o: lmem.c lmem.h lua.h | 109 | lmem.o: lmem.c lmem.h lstate.h lobject.h lua.h |
109 | lobject.o: lobject.c lobject.h lua.h | 110 | lobject.o: lobject.c lobject.h lua.h |
110 | lstring.o: lstring.c lmem.h lobject.h lua.h lstring.h | 111 | lstate.o: lstate.c lbuiltin.h ldo.h lobject.h lua.h lstate.h llex.h \ |
112 | lzio.h lmem.h lstring.h ltable.h ltm.h | ||
113 | lstring.o: lstring.c lmem.h lobject.h lua.h lstate.h lstring.h | ||
111 | lstrlib.o: lstrlib.c lauxlib.h lua.h lualib.h | 114 | lstrlib.o: lstrlib.c lauxlib.h lua.h lualib.h |
112 | lstx.o: lstx.c lauxlib.h lua.h ldo.h lobject.h lfunc.h llex.h lzio.h \ | 115 | lstx.o: lstx.c lauxlib.h lua.h ldo.h lobject.h lstate.h lfunc.h llex.h \ |
113 | lmem.h lopcodes.h lparser.h lstring.h luadebug.h | 116 | lzio.h lmem.h lopcodes.h lparser.h lstring.h luadebug.h |
114 | ltable.o: ltable.c lauxlib.h lua.h lmem.h lobject.h ltable.h | 117 | ltable.o: ltable.c lauxlib.h lua.h lmem.h lobject.h lstate.h ltable.h |
115 | ltm.o: ltm.c lauxlib.h lua.h ldo.h lobject.h lmem.h ltm.h lapi.h | 118 | ltm.o: ltm.c lauxlib.h lua.h lmem.h lobject.h lstate.h ltm.h lapi.h |
116 | lua.o: lua.c lua.h luadebug.h lualib.h | 119 | lua.o: lua.c lua.h luadebug.h lualib.h |
117 | lundump.o: lundump.c lauxlib.h lua.h lfunc.h lobject.h lmem.h \ | 120 | lundump.o: lundump.c lauxlib.h lua.h lfunc.h lobject.h lmem.h \ |
118 | lstring.h lundump.h lzio.h | 121 | lstring.h lundump.h lzio.h |
119 | lvm.o: lvm.c lauxlib.h lua.h ldo.h lobject.h lfunc.h lgc.h lmem.h \ | 122 | lvm.o: lvm.c lauxlib.h lua.h ldo.h lobject.h lstate.h lfunc.h lgc.h \ |
120 | lopcodes.h lstring.h ltable.h ltm.h luadebug.h lvm.h | 123 | lmem.h lopcodes.h lstring.h ltable.h ltm.h luadebug.h lvm.h |
121 | lzio.o: lzio.c lzio.h | 124 | lzio.o: lzio.c lzio.h |