aboutsummaryrefslogtreecommitdiff
path: root/lapi.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2001-02-13 14:17:53 -0200
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2001-02-13 14:17:53 -0200
commita4ae1475e354ff61eda8fe64745de42526a4c53e (patch)
treefff03f87c1a792003cce408fe077dc8d5475dd0b /lapi.c
parentb3da4ee90753bcb6d7225e0e737ee692df669fb1 (diff)
downloadlua-a4ae1475e354ff61eda8fe64745de42526a4c53e.tar.gz
lua-a4ae1475e354ff61eda8fe64745de42526a4c53e.tar.bz2
lua-a4ae1475e354ff61eda8fe64745de42526a4c53e.zip
details (smaller code)
Diffstat (limited to 'lapi.c')
-rw-r--r--lapi.c64
1 files changed, 28 insertions, 36 deletions
diff --git a/lapi.c b/lapi.c
index 65c7a726..e2c9f45a 100644
--- a/lapi.c
+++ b/lapi.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lapi.c,v 1.127 2001/02/09 19:53:16 roberto Exp roberto $ 2** $Id: lapi.c,v 1.128 2001/02/12 15:42:44 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*/
@@ -31,33 +31,35 @@ const char lua_ident[] = "$Lua: " LUA_VERSION " " LUA_COPYRIGHT " $\n"
31#define api_check(L, o) /* nothing */ 31#define api_check(L, o) /* nothing */
32#endif 32#endif
33 33
34/* valid indices */
35#define api_checkindex(L, i) \
36 api_check(L, (0 < abs(i)) && abs(i) <= (L->top - L->Cbase))
37
38#define api_checknelems(L, n) api_check(L, (n) <= (L->top - L->Cbase)) 34#define api_checknelems(L, n) api_check(L, (n) <= (L->top - L->Cbase))
39 35
40
41
42#define Index(L,i) ((i) >= 0 ? (L->Cbase+((i)-1)) : (L->top+(i)))
43
44#define api_incr_top(L) incr_top 36#define api_incr_top(L) incr_top
45 37
46 38
47 39
48TObject *luaA_index (lua_State *L, int index) { 40TObject *luaA_index (lua_State *L, int index) {
49 return Index(L, index); 41 if (index > 0) {
42 api_check(L, index <= L->top - L->Cbase);
43 return L->Cbase+index-1;
44 }
45 else {
46 api_check(L, index != 0 && -index <= L->top - L->Cbase);
47 return L->top+index;
48 }
50} 49}
51 50
52 51
53static TObject *luaA_indexAcceptable (lua_State *L, int index) { 52static TObject *luaA_indexAcceptable (lua_State *L, int index) {
54 api_check(L, (0 < abs(index)) && abs(index) <= (L->stack_last - L->Cbase)); 53 if (index > 0) {
55 if (index >= 0) {
56 TObject *o = L->Cbase+(index-1); 54 TObject *o = L->Cbase+(index-1);
55 api_check(L, index <= L->stack_last - L->Cbase);
57 if (o >= L->top) return NULL; 56 if (o >= L->top) return NULL;
58 else return o; 57 else return o;
59 } 58 }
60 else return L->top+index; 59 else {
60 api_check(L, index != 0 && -index <= L->top - L->Cbase);
61 return L->top+index;
62 }
61} 63}
62 64
63 65
@@ -105,8 +107,7 @@ LUA_API void lua_settop (lua_State *L, int index) {
105LUA_API void lua_remove (lua_State *L, int index) { 107LUA_API void lua_remove (lua_State *L, int index) {
106 StkId p; 108 StkId p;
107 LUA_LOCK(L); 109 LUA_LOCK(L);
108 api_checkindex(L, index); 110 p = luaA_index(L, index);
109 p = Index(L, index);
110 while (++p < L->top) setobj(p-1, p); 111 while (++p < L->top) setobj(p-1, p);
111 L->top--; 112 L->top--;
112 LUA_UNLOCK(L); 113 LUA_UNLOCK(L);
@@ -117,8 +118,7 @@ LUA_API void lua_insert (lua_State *L, int index) {
117 StkId p; 118 StkId p;
118 StkId q; 119 StkId q;
119 LUA_LOCK(L); 120 LUA_LOCK(L);
120 api_checkindex(L, index); 121 p = luaA_index(L, index);
121 p = Index(L, index);
122 for (q = L->top; q>p; q--) setobj(q, q-1); 122 for (q = L->top; q>p; q--) setobj(q, q-1);
123 setobj(p, L->top); 123 setobj(p, L->top);
124 LUA_UNLOCK(L); 124 LUA_UNLOCK(L);
@@ -127,8 +127,7 @@ LUA_API void lua_insert (lua_State *L, int index) {
127 127
128LUA_API void lua_pushvalue (lua_State *L, int index) { 128LUA_API void lua_pushvalue (lua_State *L, int index) {
129 LUA_LOCK(L); 129 LUA_LOCK(L);
130 api_checkindex(L, index); 130 setobj(L->top, luaA_index(L, index));
131 setobj(L->top, Index(L, index));
132 api_incr_top(L); 131 api_incr_top(L);
133 LUA_UNLOCK(L); 132 LUA_UNLOCK(L);
134} 133}
@@ -381,8 +380,7 @@ LUA_API void lua_getglobal (lua_State *L, const char *name) {
381LUA_API void lua_gettable (lua_State *L, int index) { 380LUA_API void lua_gettable (lua_State *L, int index) {
382 StkId t; 381 StkId t;
383 LUA_LOCK(L); 382 LUA_LOCK(L);
384 api_checkindex(L, index); 383 t = luaA_index(L, index);
385 t = Index(L, index);
386 luaV_gettable(L, t, L->top-1, L->top-1); 384 luaV_gettable(L, t, L->top-1, L->top-1);
387 LUA_UNLOCK(L); 385 LUA_UNLOCK(L);
388} 386}
@@ -391,8 +389,7 @@ LUA_API void lua_gettable (lua_State *L, int index) {
391LUA_API void lua_rawget (lua_State *L, int index) { 389LUA_API void lua_rawget (lua_State *L, int index) {
392 StkId t; 390 StkId t;
393 LUA_LOCK(L); 391 LUA_LOCK(L);
394 api_checkindex(L, index); 392 t = luaA_index(L, index);
395 t = Index(L, index);
396 api_check(L, ttype(t) == LUA_TTABLE); 393 api_check(L, ttype(t) == LUA_TTABLE);
397 setobj(L->top - 1, luaH_get(hvalue(t), L->top - 1)); 394 setobj(L->top - 1, luaH_get(hvalue(t), L->top - 1));
398 LUA_UNLOCK(L); 395 LUA_UNLOCK(L);
@@ -402,8 +399,7 @@ LUA_API void lua_rawget (lua_State *L, int index) {
402LUA_API void lua_rawgeti (lua_State *L, int index, int n) { 399LUA_API void lua_rawgeti (lua_State *L, int index, int n) {
403 StkId o; 400 StkId o;
404 LUA_LOCK(L); 401 LUA_LOCK(L);
405 api_checkindex(L, index); 402 o = luaA_index(L, index);
406 o = Index(L, index);
407 api_check(L, ttype(o) == LUA_TTABLE); 403 api_check(L, ttype(o) == LUA_TTABLE);
408 setobj(L->top, luaH_getnum(hvalue(o), n)); 404 setobj(L->top, luaH_getnum(hvalue(o), n));
409 api_incr_top(L); 405 api_incr_top(L);
@@ -467,8 +463,7 @@ LUA_API void lua_settable (lua_State *L, int index) {
467 StkId t; 463 StkId t;
468 LUA_LOCK(L); 464 LUA_LOCK(L);
469 api_checknelems(L, 2); 465 api_checknelems(L, 2);
470 api_checkindex(L, index); 466 t = luaA_index(L, index);
471 t = Index(L, index);
472 luaV_settable(L, t, L->top - 2, L->top - 1); 467 luaV_settable(L, t, L->top - 2, L->top - 1);
473 L->top -= 2; /* pop index and value */ 468 L->top -= 2; /* pop index and value */
474 LUA_UNLOCK(L); 469 LUA_UNLOCK(L);
@@ -479,8 +474,7 @@ LUA_API void lua_rawset (lua_State *L, int index) {
479 StkId t; 474 StkId t;
480 LUA_LOCK(L); 475 LUA_LOCK(L);
481 api_checknelems(L, 2); 476 api_checknelems(L, 2);
482 api_checkindex(L, index); 477 t = luaA_index(L, index);
483 t = Index(L, index);
484 api_check(L, ttype(t) == LUA_TTABLE); 478 api_check(L, ttype(t) == LUA_TTABLE);
485 setobj(luaH_set(L, hvalue(t), L->top-2), (L->top-1)); 479 setobj(luaH_set(L, hvalue(t), L->top-2), (L->top-1));
486 L->top -= 2; 480 L->top -= 2;
@@ -492,8 +486,7 @@ LUA_API void lua_rawseti (lua_State *L, int index, int n) {
492 StkId o; 486 StkId o;
493 LUA_LOCK(L); 487 LUA_LOCK(L);
494 api_checknelems(L, 1); 488 api_checknelems(L, 1);
495 api_checkindex(L, index); 489 o = luaA_index(L, index);
496 o = Index(L, index);
497 api_check(L, ttype(o) == LUA_TTABLE); 490 api_check(L, ttype(o) == LUA_TTABLE);
498 setobj(luaH_setnum(L, hvalue(o), n), (L->top-1)); 491 setobj(luaH_setnum(L, hvalue(o), n), (L->top-1));
499 L->top--; 492 L->top--;
@@ -668,10 +661,9 @@ LUA_API int lua_next (lua_State *L, int index) {
668 Node *n; 661 Node *n;
669 int more; 662 int more;
670 LUA_LOCK(L); 663 LUA_LOCK(L);
671 api_checkindex(L, index); 664 t = luaA_index(L, index);
672 t = Index(L, index);
673 api_check(L, ttype(t) == LUA_TTABLE); 665 api_check(L, ttype(t) == LUA_TTABLE);
674 n = luaH_next(L, hvalue(t), Index(L, -1)); 666 n = luaH_next(L, hvalue(t), luaA_index(L, -1));
675 if (n) { 667 if (n) {
676 setkey2obj(L->top-1, n); 668 setkey2obj(L->top-1, n);
677 setobj(L->top, val(n)); 669 setobj(L->top, val(n));
@@ -692,8 +684,7 @@ LUA_API int lua_getn (lua_State *L, int index) {
692 const TObject *value; 684 const TObject *value;
693 int n; 685 int n;
694 LUA_LOCK(L); 686 LUA_LOCK(L);
695 api_checkindex(L, index); 687 h = hvalue(luaA_index(L, index));
696 h = hvalue(Index(L, index));
697 value = luaH_getstr(h, luaS_newliteral(L, "n")); /* = h.n */ 688 value = luaH_getstr(h, luaS_newliteral(L, "n")); /* = h.n */
698 if (ttype(value) == LUA_TNUMBER) 689 if (ttype(value) == LUA_TNUMBER)
699 n = (int)nvalue(value); 690 n = (int)nvalue(value);
@@ -718,6 +709,7 @@ LUA_API int lua_getn (lua_State *L, int index) {
718LUA_API void lua_concat (lua_State *L, int n) { 709LUA_API void lua_concat (lua_State *L, int n) {
719 StkId top; 710 StkId top;
720 LUA_LOCK(L); 711 LUA_LOCK(L);
712 api_check(L, n >= 2);
721 api_checknelems(L, n); 713 api_checknelems(L, n);
722 top = L->top; 714 top = L->top;
723 luaV_strconc(L, n, top); 715 luaV_strconc(L, n, top);