aboutsummaryrefslogtreecommitdiff
path: root/lapi.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2001-12-05 18:15:18 -0200
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2001-12-05 18:15:18 -0200
commit592a309177edc52847b1196969ad6d49ba21f4fb (patch)
tree06add977885c012ee22cc4f105785c435b6af353 /lapi.c
parent413fc7334bf8ceaea71417d73edef15c99d3a793 (diff)
downloadlua-592a309177edc52847b1196969ad6d49ba21f4fb.tar.gz
lua-592a309177edc52847b1196969ad6d49ba21f4fb.tar.bz2
lua-592a309177edc52847b1196969ad6d49ba21f4fb.zip
tag system replaced by event tables
Diffstat (limited to 'lapi.c')
-rw-r--r--lapi.c150
1 files changed, 59 insertions, 91 deletions
diff --git a/lapi.c b/lapi.c
index 91cea50c..6e941752 100644
--- a/lapi.c
+++ b/lapi.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lapi.c,v 1.160 2001/11/16 16:29:51 roberto Exp $ 2** $Id: lapi.c,v 1.1 2001/11/29 22:14:34 rieru Exp rieru $
3** Lua API 3** Lua API
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -45,8 +45,8 @@ static TObject *negindex (lua_State *L, int index) {
45 return L->top+index; 45 return L->top+index;
46 } 46 }
47 else switch (index) { /* pseudo-indices */ 47 else switch (index) { /* pseudo-indices */
48 case LUA_REGISTRYINDEX: return &G(L)->registry; 48 case LUA_REGISTRYINDEX: return registry(L);
49 case LUA_GLOBALSINDEX: return &L->gt; 49 case LUA_GLOBALSINDEX: return gt(L);
50 default: { 50 default: {
51 TObject *func = (L->ci->base - 1); 51 TObject *func = (L->ci->base - 1);
52 index = LUA_GLOBALSINDEX - index; 52 index = LUA_GLOBALSINDEX - index;
@@ -149,20 +149,15 @@ LUA_API void lua_pushvalue (lua_State *L, int index) {
149*/ 149*/
150 150
151 151
152LUA_API int lua_rawtag (lua_State *L, int index) { 152LUA_API int lua_type (lua_State *L, int index) {
153 StkId o = luaA_indexAcceptable(L, index); 153 StkId o = luaA_indexAcceptable(L, index);
154 return (o == NULL) ? LUA_TNONE : ttype(o); 154 return (o == NULL) ? LUA_TNONE : ttype(o);
155} 155}
156 156
157 157
158LUA_API const char *lua_type (lua_State *L, int index) { 158LUA_API const char *lua_typename (lua_State *L, int t) {
159 StkId o; 159 UNUSED(L);
160 const char *type; 160 return (t == LUA_TNONE) ? "no value" : luaT_typenames[t];
161 lua_lock(L);
162 o = luaA_indexAcceptable(L, index);
163 type = (o == NULL) ? "no value" : luaT_typename(G(L), o);
164 lua_unlock(L);
165 return type;
166} 161}
167 162
168 163
@@ -180,22 +175,11 @@ LUA_API int lua_isnumber (lua_State *L, int index) {
180 175
181 176
182LUA_API int lua_isstring (lua_State *L, int index) { 177LUA_API int lua_isstring (lua_State *L, int index) {
183 int t = lua_rawtag(L, index); 178 int t = lua_type(L, index);
184 return (t == LUA_TSTRING || t == LUA_TNUMBER); 179 return (t == LUA_TSTRING || t == LUA_TNUMBER);
185} 180}
186 181
187 182
188LUA_API int lua_tag (lua_State *L, int index) {
189 StkId o;
190 int i;
191 lua_lock(L); /* other thread could be changing the tag */
192 o = luaA_indexAcceptable(L, index);
193 i = (o == NULL) ? LUA_NOTAG : luaT_tag(o);
194 lua_unlock(L);
195 return i;
196}
197
198
199LUA_API int lua_equal (lua_State *L, int index1, int index2) { 183LUA_API int lua_equal (lua_State *L, int index1, int index2) {
200 StkId o1 = luaA_indexAcceptable(L, index1); 184 StkId o1 = luaA_indexAcceptable(L, index1);
201 StkId o2 = luaA_indexAcceptable(L, index2); 185 StkId o2 = luaA_indexAcceptable(L, index2);
@@ -346,8 +330,10 @@ LUA_API void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n) {
346 330
347 331
348LUA_API void lua_getglobal (lua_State *L, const char *name) { 332LUA_API void lua_getglobal (lua_State *L, const char *name) {
333 TObject o;
349 lua_lock(L); 334 lua_lock(L);
350 luaV_getglobal(L, luaS_new(L, name), L->top); 335 setsvalue(&o, luaS_new(L, name));
336 luaV_gettable(L, gt(L), &o, L->top);
351 api_incr_top(L); 337 api_incr_top(L);
352 lua_unlock(L); 338 lua_unlock(L);
353} 339}
@@ -391,6 +377,29 @@ LUA_API void lua_newtable (lua_State *L) {
391} 377}
392 378
393 379
380LUA_API void lua_geteventtable (lua_State *L, int objindex) {
381 StkId obj;
382 Table *et;
383 lua_lock(L);
384 obj = luaA_indexAcceptable(L, objindex);
385 switch (ttype(obj)) {
386 case LUA_TTABLE:
387 et = hvalue(obj)->eventtable;
388 break;
389 case LUA_TUSERDATA:
390 et = uvalue(obj)->uv.eventtable;
391 break;
392 default:
393 et = hvalue(defaultet(L));
394 }
395 if (et == hvalue(defaultet(L)))
396 setnilvalue(L->top);
397 else
398 sethvalue(L->top, et);
399 api_incr_top(L);
400 lua_unlock(L);
401}
402
394 403
395/* 404/*
396** set functions (stack -> Lua) 405** set functions (stack -> Lua)
@@ -398,9 +407,11 @@ LUA_API void lua_newtable (lua_State *L) {
398 407
399 408
400LUA_API void lua_setglobal (lua_State *L, const char *name) { 409LUA_API void lua_setglobal (lua_State *L, const char *name) {
410 TObject o;
401 lua_lock(L); 411 lua_lock(L);
402 api_checknelems(L, 1); 412 api_checknelems(L, 1);
403 luaV_setglobal(L, luaS_new(L, name), L->top - 1); 413 setsvalue(&o, luaS_new(L, name));
414 luaV_settable(L, gt(L), &o, L->top - 1);
404 L->top--; /* remove element from the top */ 415 L->top--; /* remove element from the top */
405 lua_unlock(L); 416 lua_unlock(L);
406} 417}
@@ -447,11 +458,32 @@ LUA_API void lua_setglobals (lua_State *L) {
447 api_checknelems(L, 1); 458 api_checknelems(L, 1);
448 newtable = --L->top; 459 newtable = --L->top;
449 api_check(L, ttype(newtable) == LUA_TTABLE); 460 api_check(L, ttype(newtable) == LUA_TTABLE);
450 setobj(&L->gt, newtable); 461 setobj(gt(L), newtable);
451 lua_unlock(L); 462 lua_unlock(L);
452} 463}
453 464
454 465
466LUA_API void lua_seteventtable (lua_State *L, int objindex) {
467 StkId obj, et;
468 lua_lock(L);
469 api_checknelems(L, 1);
470 obj = luaA_indexAcceptable(L, objindex);
471 et = --L->top;
472 api_check(L, ttype(et) == LUA_TTABLE);
473 switch (ttype(obj)) {
474 case LUA_TTABLE:
475 hvalue(obj)->eventtable = hvalue(et);
476 break;
477 case LUA_TUSERDATA:
478 uvalue(obj)->uv.eventtable = hvalue(et);
479 break;
480 default:
481 luaO_verror(L, "cannot change the event table of a %.20s",
482 luaT_typenames[ttype(obj)]);
483 }
484 lua_unlock(L);
485}
486
455 487
456/* 488/*
457** `do' functions (run Lua code) 489** `do' functions (run Lua code)
@@ -533,70 +565,6 @@ LUA_API void lua_setgcthreshold (lua_State *L, int newthreshold) {
533** miscellaneous functions 565** miscellaneous functions
534*/ 566*/
535 567
536LUA_API int lua_newtype (lua_State *L, const char *name, int basictype) {
537 int tag;
538 lua_lock(L);
539 if (basictype != LUA_TNONE &&
540 basictype != LUA_TTABLE &&
541 basictype != LUA_TUSERDATA)
542 luaO_verror(L, "invalid basic type (%d) for new type", basictype);
543 tag = luaT_newtag(L, name, basictype);
544 if (tag == LUA_TNONE)
545 luaO_verror(L, "type name '%.30s' already exists", name);
546 lua_unlock(L);
547 return tag;
548}
549
550
551LUA_API int lua_name2tag (lua_State *L, const char *name) {
552 int tag;
553 const TObject *v;
554 lua_lock(L);
555 v = luaH_getstr(G(L)->type2tag, luaS_new(L, name));
556 if (ttype(v) == LUA_TNIL)
557 tag = LUA_TNONE;
558 else {
559 lua_assert(ttype(v) == LUA_TNUMBER);
560 tag = cast(int, nvalue(v));
561 }
562 lua_unlock(L);
563 return tag;
564}
565
566
567LUA_API const char *lua_tag2name (lua_State *L, int tag) {
568 const char *s;
569 lua_lock(L);
570 s = (tag == LUA_TNONE) ? "no value" : typenamebytag(G(L), tag);
571 lua_unlock(L);
572 return s;
573}
574
575
576LUA_API void lua_settag (lua_State *L, int tag) {
577 int basictype;
578 lua_lock(L);
579 api_checknelems(L, 1);
580 if (tag < 0 || tag >= G(L)->ntag)
581 luaO_verror(L, "%d is not a valid tag", tag);
582 basictype = G(L)->TMtable[tag].basictype;
583 if (basictype != LUA_TNONE && basictype != ttype(L->top-1))
584 luaO_verror(L, "tag %d can only be used for type '%.20s'", tag,
585 typenamebytag(G(L), basictype));
586 switch (ttype(L->top-1)) {
587 case LUA_TTABLE:
588 hvalue(L->top-1)->htag = tag;
589 break;
590 case LUA_TUSERDATA:
591 uvalue(L->top-1)->uv.tag = tag;
592 break;
593 default:
594 luaO_verror(L, "cannot change the tag of a %.20s",
595 luaT_typename(G(L), L->top-1));
596 }
597 lua_unlock(L);
598}
599
600 568
601LUA_API void lua_error (lua_State *L, const char *s) { 569LUA_API void lua_error (lua_State *L, const char *s) {
602 lua_lock(L); 570 lua_lock(L);