aboutsummaryrefslogtreecommitdiff
path: root/lbuiltin.c
diff options
context:
space:
mode:
Diffstat (limited to 'lbuiltin.c')
-rw-r--r--lbuiltin.c61
1 files changed, 35 insertions, 26 deletions
diff --git a/lbuiltin.c b/lbuiltin.c
index c5fd233f..fce90a71 100644
--- a/lbuiltin.c
+++ b/lbuiltin.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lbuiltin.c,v 1.68 1999/10/19 13:33:22 roberto Exp roberto $ 2** $Id: lbuiltin.c,v 1.69 1999/10/26 10:53:40 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*/
@@ -35,10 +35,9 @@
35 35
36 36
37static void pushtagstring (TaggedString *s) { 37static void pushtagstring (TaggedString *s) {
38 TObject o; 38 ttype(L->stack.top) = LUA_T_STRING;
39 o.ttype = LUA_T_STRING; 39 tsvalue(L->stack.top) = s;
40 o.value.ts = s; 40 incr_top;
41 luaA_pushobject(&o);
42} 41}
43 42
44 43
@@ -107,7 +106,7 @@ static void error_message (void) {
107 106
108 107
109/* 108/*
110** If your system does not support "stdout", just remove this function. 109** If your system does not support "stdout", you can just remove this function.
111** If you need, you can define your own "print" function, following this 110** If you need, you can define your own "print" function, following this
112** model but changing "fputs" to put the strings at a proper place 111** model but changing "fputs" to put the strings at a proper place
113** (a console window or a log file, for instance). 112** (a console window or a log file, for instance).
@@ -264,22 +263,29 @@ static void luaB_type (void) {
264** ======================================================= 263** =======================================================
265*/ 264*/
266 265
266
267static void passresults (void) {
268 L->Cstack.base = L->Cstack.lua2C; /* position of first result */
269 if (L->Cstack.num == 0)
270 lua_pushuserdata(NULL); /* at least one result to signal no errors */
271}
272
267static void luaB_dostring (void) { 273static void luaB_dostring (void) {
268 long l; 274 long l;
269 const char *s = luaL_check_lstr(1, &l); 275 const char *s = luaL_check_lstr(1, &l);
270 if (*s == ID_CHUNK) 276 if (*s == ID_CHUNK)
271 lua_error("`dostring' cannot run pre-compiled code"); 277 lua_error("`dostring' cannot run pre-compiled code");
272 if (lua_dobuffer(s, l, luaL_opt_string(2, s)) == 0) 278 if (lua_dobuffer(s, l, luaL_opt_string(2, s)) == 0)
273 if (luaA_passresults() == 0) 279 passresults();
274 lua_pushuserdata(NULL); /* at least one result to signal no errors */ 280 /* else return no value */
275} 281}
276 282
277 283
278static void luaB_dofile (void) { 284static void luaB_dofile (void) {
279 const char *fname = luaL_opt_string(1, NULL); 285 const char *fname = luaL_opt_string(1, NULL);
280 if (lua_dofile(fname) == 0) 286 if (lua_dofile(fname) == 0)
281 if (luaA_passresults() == 0) 287 passresults();
282 lua_pushuserdata(NULL); /* at least one result to signal no errors */ 288 /* else return no value */
283} 289}
284 290
285 291
@@ -312,10 +318,12 @@ static void luaB_call (void) {
312 lua_error(NULL); 318 lua_error(NULL);
313 } 319 }
314 else { /* no errors */ 320 else { /* no errors */
315 if (strchr(options, 'p')) 321 if (strchr(options, 'p')) { /* pack results? */
316 luaA_packresults(); 322 luaV_pack(L->Cstack.lua2C, L->Cstack.num, L->stack.top);
323 incr_top;
324 }
317 else 325 else
318 luaA_passresults(); 326 L->Cstack.base = L->Cstack.lua2C; /* position of first result */
319 } 327 }
320} 328}
321 329
@@ -373,7 +381,7 @@ static void luaB_tostring (void) {
373 sprintf(buff, "function: %p", (void *)o->value.f); 381 sprintf(buff, "function: %p", (void *)o->value.f);
374 break; 382 break;
375 case LUA_T_USERDATA: 383 case LUA_T_USERDATA:
376 sprintf(buff, "userdata: %p", o->value.ts->u.d.v); 384 sprintf(buff, "userdata: %p", o->value.ts->u.d.value);
377 break; 385 break;
378 case LUA_T_NIL: 386 case LUA_T_NIL:
379 lua_pushstring("nil"); 387 lua_pushstring("nil");
@@ -449,23 +457,23 @@ static void luaB_foreach (void) {
449 457
450 458
451static void luaB_foreachvar (void) { 459static void luaB_foreachvar (void) {
452 TaggedString *s; 460 GlobalVar *gv;
453 TObject f; /* see comment in 'foreachi' */ 461 TObject f; /* see comment in 'foreachi' */
454 f = *luaA_Address(luaL_functionarg(1)); 462 f = *luaA_Address(luaL_functionarg(1));
455 luaD_checkstack(4); /* for extra var name, f, var name, and globalval */ 463 luaD_checkstack(4); /* for extra var name, f, var name, and globalval */
456 for (s = L->rootglobal; s; s = s->nextglobal) { 464 for (gv = L->rootglobal; gv; gv = gv->next) {
457 if (s->u.s.globalval.ttype != LUA_T_NIL) { 465 if (gv->value.ttype != LUA_T_NIL) {
458 pushtagstring(s); /* keep (extra) s on stack to avoid GC */ 466 pushtagstring(gv->name); /* keep (extra) name on stack to avoid GC */
459 *(L->stack.top++) = f; 467 *(L->stack.top++) = f;
460 pushtagstring(s); 468 pushtagstring(gv->name);
461 *(L->stack.top++) = s->u.s.globalval; 469 *(L->stack.top++) = gv->value;
462 luaD_calln(2, 1); 470 luaD_calln(2, 1);
463 if (ttype(L->stack.top-1) != LUA_T_NIL) { 471 if (ttype(L->stack.top-1) != LUA_T_NIL) {
464 L->stack.top--; 472 L->stack.top--;
465 *(L->stack.top-1) = *L->stack.top; /* remove extra `s' */ 473 *(L->stack.top-1) = *L->stack.top; /* remove extra name */
466 return; 474 return;
467 } 475 }
468 L->stack.top-=2; /* remove result and extra `s' */ 476 L->stack.top-=2; /* remove result and extra name */
469 } 477 }
470 } 478 }
471} 479}
@@ -507,7 +515,8 @@ static void luaB_tremove (void) {
507} 515}
508 516
509 517
510/* { 518/*
519** {======================================================
511** Quicksort 520** Quicksort
512*/ 521*/
513 522
@@ -593,11 +602,10 @@ static void luaB_sort (void) {
593 lua_pushobject(t); 602 lua_pushobject(t);
594} 603}
595 604
596/* }}===================================================== */ 605/* }====================================================== */
597 606
598 607
599/* 608/* }====================================================== */
600** ====================================================== */
601 609
602 610
603 611
@@ -605,6 +613,7 @@ static void luaB_sort (void) {
605/* 613/*
606** {====================================================== 614** {======================================================
607** some DEBUG functions 615** some DEBUG functions
616** (for internal debugging of the Lua implementation)
608** ======================================================= 617** =======================================================
609*/ 618*/
610 619