aboutsummaryrefslogtreecommitdiff
path: root/lapi.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2000-09-05 16:33:32 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2000-09-05 16:33:32 -0300
commit6e80c1cde193b767d63d2cc30ebd71d65512e061 (patch)
treecb599bdc956c0dc9b3d469bb01de47185db3e4e2 /lapi.c
parentf67f324377aff66d78479eaaffbb94a6b092ae45 (diff)
downloadlua-6e80c1cde193b767d63d2cc30ebd71d65512e061.tar.gz
lua-6e80c1cde193b767d63d2cc30ebd71d65512e061.tar.bz2
lua-6e80c1cde193b767d63d2cc30ebd71d65512e061.zip
new version for API
Diffstat (limited to 'lapi.c')
-rw-r--r--lapi.c118
1 files changed, 69 insertions, 49 deletions
diff --git a/lapi.c b/lapi.c
index fb22b3df..4a80796a 100644
--- a/lapi.c
+++ b/lapi.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lapi.c,v 1.92 2000/08/31 20:23:40 roberto Exp roberto $ 2** $Id: lapi.c,v 1.93 2000/08/31 21:01:43 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*/
@@ -69,25 +69,24 @@ void lua_settop (lua_State *L, int index) {
69} 69}
70 70
71 71
72void lua_move (lua_State *L, int index) { 72void lua_remove (lua_State *L, int index) {
73 TObject *p = Index(L, index); 73 StkId p = Index(L, index);
74 TObject temp = *p;
75 while (++p < L->top) *(p-1) = *p; 74 while (++p < L->top) *(p-1) = *p;
76 *(L->top-1) = temp; 75 L->top--;
77} 76}
78 77
79 78
80void lua_insert (lua_State *L, int index) { 79void lua_insert (lua_State *L, int index) {
81 TObject temp = *(L->top-1); 80 TObject temp = *(L->top-1);
82 TObject *p = Index(L, index); 81 StkId p = Index(L, index);
83 TObject *q; 82 StkId q;
84 for (q = L->top-1; q>p; q--) 83 for (q = L->top-1; q>p; q--)
85 *q = *(q-1); 84 *q = *(q-1);
86 *p = temp; 85 *p = temp;
87} 86}
88 87
89 88
90void lua_pushobject (lua_State *L, int index) { 89void lua_pushvalue (lua_State *L, int index) {
91 *L->top = *Index(L, index); 90 *L->top = *Index(L, index);
92 api_incr_top(L); 91 api_incr_top(L);
93} 92}
@@ -133,17 +132,24 @@ int lua_isnumber (lua_State *L, int index) {
133 132
134int lua_tag (lua_State *L, int index) { 133int lua_tag (lua_State *L, int index) {
135 btest(L, index, 134 btest(L, index,
136 ((ttype(o) == TAG_USERDATA) ? tsvalue(o)->u.d.tag : luaT_effectivetag(L, o)), 135 ((ttype(o) == TAG_USERDATA) ? tsvalue(o)->u.d.tag :
137 -1); 136 luaT_effectivetag(L, o)), -1);
138} 137}
139 138
140int lua_equal(lua_State *L, int index1, int index2) { 139int lua_equal (lua_State *L, int index1, int index2) {
141 StkId o1 = Index(L, index1); 140 StkId o1 = Index(L, index1);
142 StkId o2 = Index(L, index2); 141 StkId o2 = Index(L, index2);
143 if (o1 >= L->top || o2 >= L->top) return 0; /* index out-of-range */ 142 if (o1 >= L->top || o2 >= L->top) return 0; /* index out-of-range */
144 else return luaO_equalObj(o1, o2); 143 else return luaO_equalObj(o1, o2);
145} 144}
146 145
146int lua_lessthan (lua_State *L, int index1, int index2) {
147 StkId o1 = Index(L, index1);
148 StkId o2 = Index(L, index2);
149 if (o1 >= L->top || o2 >= L->top) return 0; /* index out-of-range */
150 else return luaV_lessthan(L, o1, o2, L->top);
151}
152
147 153
148 154
149double lua_tonumber (lua_State *L, int index) { 155double lua_tonumber (lua_State *L, int index) {
@@ -168,14 +174,13 @@ void *lua_touserdata (lua_State *L, int index) {
168} 174}
169 175
170const void *lua_topointer (lua_State *L, int index) { 176const void *lua_topointer (lua_State *L, int index) {
171 const TObject *o = Index(L, index); 177 StkId o = Index(L, index);
172 switch (ttype(o)) { 178 switch (ttype(o)) {
173 case TAG_NUMBER: case TAG_NIL: 179 case TAG_NUMBER: case TAG_NIL:
174 return NULL; 180 return NULL;
175 case TAG_STRING: 181 case TAG_STRING:
176 return tsvalue(o)->str;
177 case TAG_USERDATA: 182 case TAG_USERDATA:
178 return tsvalue(o)->u.d.value; 183 return tsvalue(o);
179 case TAG_TABLE: 184 case TAG_TABLE:
180 return hvalue(o); 185 return hvalue(o);
181 case TAG_CCLOSURE: case TAG_LCLOSURE: 186 case TAG_CCLOSURE: case TAG_LCLOSURE:
@@ -243,31 +248,38 @@ void lua_pushusertag (lua_State *L, void *u, int tag) { /* ORDER LUA_T */
243 248
244 249
245void lua_getglobal (lua_State *L, const char *name) { 250void lua_getglobal (lua_State *L, const char *name) {
246 luaV_getglobal(L, luaS_new(L, name), L->top++); 251 StkId top = L->top;
252 *top = *luaV_getglobal(L, luaS_new(L, name));
253 L->top = top+1;
247} 254}
248 255
249 256
250void lua_gettable (lua_State *L) { 257void lua_gettable (lua_State *L, int tableindex) {
251 luaV_gettable(L, L->top--); 258 StkId t = Index(L, tableindex);
259 StkId top = L->top;
260 *(top-1) = *luaV_gettable(L, t);
261 L->top = top; /* tag method may change top */
252} 262}
253 263
254 264
255void lua_rawget (lua_State *L) { 265void lua_rawget (lua_State *L, int tableindex) {
256 LUA_ASSERT(ttype(L->top-2) == TAG_TABLE, "table expected"); 266 StkId t = Index(L, tableindex);
257 *(L->top - 2) = *luaH_get(L, hvalue(L->top - 2), L->top - 1); 267 LUA_ASSERT(ttype(t) == TAG_TABLE, "table expected");
258 L->top--; 268 *(L->top - 1) = *luaH_get(L, hvalue(t), L->top - 1);
259} 269}
260 270
261 271
262void lua_getglobals (lua_State *L) { 272void lua_rawgeti (lua_State *L, int index, int n) {
263 hvalue(L->top) = L->gt; 273 StkId o = Index(L, index);
264 ttype(L->top) = TAG_TABLE; 274 LUA_ASSERT(ttype(o) == TAG_TABLE, "table expected");
275 *L->top = *luaH_getnum(hvalue(o), n);
265 api_incr_top(L); 276 api_incr_top(L);
266} 277}
267 278
268 279
269void lua_gettagmethod (lua_State *L, int tag, const char *event) { 280void lua_getglobals (lua_State *L) {
270 *L->top = *luaT_gettagmethod(L, tag, event); 281 hvalue(L->top) = L->gt;
282 ttype(L->top) = TAG_TABLE;
271 api_incr_top(L); 283 api_incr_top(L);
272} 284}
273 285
@@ -300,38 +312,40 @@ void lua_newtable (lua_State *L) {
300 312
301 313
302void lua_setglobal (lua_State *L, const char *name) { 314void lua_setglobal (lua_State *L, const char *name) {
303 luaV_setglobal(L, luaS_new(L, name), L->top--); 315 StkId top = L->top;
316 luaV_setglobal(L, luaS_new(L, name));
317 L->top = top-1; /* remove element from the top */
304} 318}
305 319
306 320
307void lua_settable (lua_State *L) { 321void lua_settable (lua_State *L, int tableindex) {
322 StkId t = Index(L, tableindex);
308 StkId top = L->top; 323 StkId top = L->top;
309 luaV_settable(L, top-3, top); 324 luaV_settable(L, t, top-2);
310 L->top = top-3; /* pop table, index, and value */ 325 L->top = top-2; /* pop index and value */
311} 326}
312 327
313 328
314void lua_rawset (lua_State *L) { 329void lua_rawset (lua_State *L, int tableindex) {
315 LUA_ASSERT(ttype(L->top-3) == TAG_TABLE, "table expected"); 330 StkId t = Index(L, tableindex);
316 *luaH_set(L, hvalue(L->top-3), L->top-2) = *(L->top-1); 331 LUA_ASSERT(ttype(t) == TAG_TABLE, "table expected");
317 L->top -= 3; 332 *luaH_set(L, hvalue(t), L->top-2) = *(L->top-1);
333 L->top -= 2;
318} 334}
319 335
320 336
321void lua_setglobals (lua_State *L) { 337void lua_rawseti (lua_State *L, int index, int n) {
322 TObject *newtable = --L->top; 338 StkId o = Index(L, index);
323 LUA_ASSERT(ttype(newtable) == TAG_TABLE, "table expected"); 339 LUA_ASSERT(ttype(o) == TAG_TABLE, "table expected");
324 L->gt = hvalue(newtable); 340 *luaH_setint(L, hvalue(o), n) = *(L->top-1);
341 L->top--;
325} 342}
326 343
327 344
328void lua_settagmethod (lua_State *L, int tag, const char *event) { 345void lua_setglobals (lua_State *L) {
329 TObject *method = L->top - 1; 346 StkId newtable = --L->top;
330 if (ttype(method) != TAG_NIL && 347 LUA_ASSERT(ttype(newtable) == TAG_TABLE, "table expected");
331 ttype(method) != TAG_CCLOSURE && 348 L->gt = hvalue(newtable);
332 ttype(method) != TAG_LCLOSURE)
333 lua_error(L, "Lua API error - tag method must be a function or nil");
334 luaT_settagmethod(L, tag, event, method);
335} 349}
336 350
337 351
@@ -362,7 +376,6 @@ int lua_ref (lua_State *L, int lock) {
362** miscellaneous functions 376** miscellaneous functions
363*/ 377*/
364 378
365
366void lua_settag (lua_State *L, int tag) { 379void lua_settag (lua_State *L, int tag) {
367 luaT_realtag(L, tag); 380 luaT_realtag(L, tag);
368 switch (ttype(L->top-1)) { 381 switch (ttype(L->top-1)) {
@@ -389,8 +402,8 @@ void lua_unref (lua_State *L, int ref) {
389} 402}
390 403
391 404
392int lua_next (lua_State *L) { 405int lua_next (lua_State *L, int tableindex) {
393 const TObject *t = Index(L, -2); 406 StkId t = Index(L, tableindex);
394 Node *n; 407 Node *n;
395 LUA_ASSERT(ttype(t) == TAG_TABLE, "table expected"); 408 LUA_ASSERT(ttype(t) == TAG_TABLE, "table expected");
396 n = luaH_next(L, hvalue(t), Index(L, -1)); 409 n = luaH_next(L, hvalue(t), Index(L, -1));
@@ -401,7 +414,7 @@ int lua_next (lua_State *L) {
401 return 1; 414 return 1;
402 } 415 }
403 else { /* no more elements */ 416 else { /* no more elements */
404 L->top -= 2; /* remove key and table */ 417 L->top -= 1; /* remove key */
405 return 0; 418 return 0;
406 } 419 }
407} 420}
@@ -427,3 +440,10 @@ int lua_getn (lua_State *L, int index) {
427 } 440 }
428} 441}
429 442
443
444void lua_concat (lua_State *L, int n) {
445 StkId top = L->top;
446 luaV_strconc(L, n, top);
447 L->top = top-(n-1);
448}
449