aboutsummaryrefslogtreecommitdiff
path: root/lapi.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>1997-11-19 15:29:23 -0200
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>1997-11-19 15:29:23 -0200
commit592a3f289b428e3ee5cc595a266607ad7f5d94ff (patch)
tree19a371157be240f7e0f579117d04d466e911afcd /lapi.c
parent9cdeb275e7c93007b2ece6f81aaeafe530076805 (diff)
downloadlua-592a3f289b428e3ee5cc595a266607ad7f5d94ff.tar.gz
lua-592a3f289b428e3ee5cc595a266607ad7f5d94ff.tar.bz2
lua-592a3f289b428e3ee5cc595a266607ad7f5d94ff.zip
first implementation of centralized global state.
Diffstat (limited to 'lapi.c')
-rw-r--r--lapi.c179
1 files changed, 82 insertions, 97 deletions
diff --git a/lapi.c b/lapi.c
index 2b37a72d..a65cc510 100644
--- a/lapi.c
+++ b/lapi.c
@@ -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
39void luaA_packresults (void) 38void 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
46int luaA_passresults (void) 45int 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
56static void checkCparams (int nParams) 55static 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
63static lua_Object put_luaObject (TObject *o) 62static 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
71static lua_Object put_luaObjectonTop (void) 70static 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*/
90lua_Object lua_lua2C (int number) 89lua_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
99lua_Object lua_upvalue (int n) 98lua_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;
104if (ttype(protovalue(f)) != LUA_T_CPROTO) lua_error("BAD!!"); 103if (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)
129lua_Object lua_settagmethod (int tag, char *event) 128lua_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
137lua_Object lua_seterrormethod (void) 136lua_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)
154lua_Object lua_rawgettable (void) 153lua_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)
171void lua_settable (void) 170void 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
178void lua_rawsettable (void) 177void 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
194lua_Object lua_globalbag (void)
195{
196 return put_luaObject(&L->globalbag);
197}
198
199
195lua_Object lua_getglobal (char *name) 200lua_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
294void lua_pushnil (void) 299void 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
300void lua_pushnumber (real n) 305void 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
307void lua_pushstring (char *s) 312void 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)
319void lua_pushCclosure (lua_CFunction fn, int n) 324void 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
344void luaA_pushobject (TObject *o) 349void 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;
406lua_Function lua_stackedfunction (int level) 411lua_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)
417int lua_currentline (lua_Function func) 422int 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
481static TObject *functofind;
482static int checkfunc (TObject *o) 486static 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
491char *lua_getobjname (lua_Object o, char **name) 495char *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
509static int numCblocks = 0;
510static struct C_Lua_Stack Cblocks[MAX_C_BLOCKS];
511 511
512void lua_beginblock (void) 512void 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
520void lua_endblock (void) 520void 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
531int lua_ref (int lock) 529int 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
549void 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
568static void do_unprotectedrun (lua_CFunction f, int nParams, int nResults) 553static 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