aboutsummaryrefslogtreecommitdiff
path: root/lbuiltin.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2000-05-26 16:17:57 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2000-05-26 16:17:57 -0300
commit8e617985fab860fcd045f6f345ef47b159446d3b (patch)
treeb4b094aae7e962ea6e4a8f68c8f5dd31f97d4fdf /lbuiltin.c
parentc39345fba361257bc426cd042a39691a0d68d68a (diff)
downloadlua-8e617985fab860fcd045f6f345ef47b159446d3b.tar.gz
lua-8e617985fab860fcd045f6f345ef47b159446d3b.tar.bz2
lua-8e617985fab860fcd045f6f345ef47b159446d3b.zip
functions `for...' and `raw...' are obsolete now
Diffstat (limited to 'lbuiltin.c')
-rw-r--r--lbuiltin.c144
1 files changed, 93 insertions, 51 deletions
diff --git a/lbuiltin.c b/lbuiltin.c
index 77a4d388..a6282b06 100644
--- a/lbuiltin.c
+++ b/lbuiltin.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lbuiltin.c,v 1.109 2000/05/09 14:50:16 roberto Exp roberto $ 2** $Id: lbuiltin.c,v 1.110 2000/05/24 13:54:49 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*/
@@ -106,7 +106,10 @@ void luaB__ALERT (lua_State *L) {
106** The library `liolib' redefines _ERRORMESSAGE for better error information. 106** The library `liolib' redefines _ERRORMESSAGE for better error information.
107*/ 107*/
108void luaB__ERRORMESSAGE (lua_State *L) { 108void luaB__ERRORMESSAGE (lua_State *L) {
109 lua_Object al = lua_rawgetglobal(L, LUA_ALERT); 109 lua_Object al;
110 lua_pushglobaltable(L);
111 lua_pushstring(L, LUA_ALERT);
112 al = lua_rawget(L);
110 if (lua_isfunction(L, al)) { /* avoid error loop if _ALERT is not defined */ 113 if (lua_isfunction(L, al)) { /* avoid error loop if _ALERT is not defined */
111 const char *s = luaL_check_string(L, 1); 114 const char *s = luaL_check_string(L, 1);
112 char *buff = luaL_openspace(L, strlen(s)+sizeof("error: \n")); 115 char *buff = luaL_openspace(L, strlen(s)+sizeof("error: \n"));
@@ -214,17 +217,17 @@ void luaB_globals (lua_State *L) {
214 lua_setglobaltable(L, luaL_tablearg(L, 1)); 217 lua_setglobaltable(L, luaL_tablearg(L, 1));
215} 218}
216 219
217void luaB_rawgettable (lua_State *L) { 220void luaB_rawget (lua_State *L) {
218 lua_pushobject(L, luaL_nonnullarg(L, 1)); 221 lua_pushobject(L, luaL_nonnullarg(L, 1));
219 lua_pushobject(L, luaL_nonnullarg(L, 2)); 222 lua_pushobject(L, luaL_nonnullarg(L, 2));
220 lua_pushobject(L, lua_rawgettable(L)); 223 lua_pushobject(L, lua_rawget(L));
221} 224}
222 225
223void luaB_rawsettable (lua_State *L) { 226void luaB_rawset (lua_State *L) {
224 lua_pushobject(L, luaL_nonnullarg(L, 1)); 227 lua_pushobject(L, luaL_nonnullarg(L, 1));
225 lua_pushobject(L, luaL_nonnullarg(L, 2)); 228 lua_pushobject(L, luaL_nonnullarg(L, 2));
226 lua_pushobject(L, luaL_nonnullarg(L, 3)); 229 lua_pushobject(L, luaL_nonnullarg(L, 3));
227 lua_rawsettable(L); 230 lua_rawset(L);
228} 231}
229 232
230void luaB_settagmethod (lua_State *L) { 233void luaB_settagmethod (lua_State *L) {
@@ -399,44 +402,6 @@ void luaB_assert (lua_State *L) {
399} 402}
400 403
401 404
402void luaB_foreachi (lua_State *L) {
403 const Hash *t = gettable(L, 1);
404 int n = (int)getnarg(L, t);
405 int i;
406 lua_Object f = luaL_functionarg(L, 2);
407 luaD_checkstack(L, 3); /* for f, key, and val */
408 for (i=1; i<=n; i++) {
409 *(L->top++) = *f;
410 ttype(L->top) = TAG_NUMBER; nvalue(L->top++) = i;
411 *(L->top++) = *luaH_getnum(t, i);
412 luaD_call(L, L->top-3, 1);
413 if (ttype(L->top-1) != TAG_NIL)
414 return;
415 L->top--; /* remove nil result */
416 }
417}
418
419
420void luaB_foreach (lua_State *L) {
421 const Hash *a = gettable(L, 1);
422 lua_Object f = luaL_functionarg(L, 2);
423 int i;
424 luaD_checkstack(L, 3); /* for f, key, and val */
425 for (i=0; i<a->size; i++) {
426 const Node *nd = &(a->node[i]);
427 if (ttype(val(nd)) != TAG_NIL) {
428 *(L->top++) = *f;
429 *(L->top++) = *key(nd);
430 *(L->top++) = *val(nd);
431 luaD_call(L, L->top-3, 1);
432 if (ttype(L->top-1) != TAG_NIL)
433 return;
434 L->top--; /* remove result */
435 }
436 }
437}
438
439
440void luaB_getn (lua_State *L) { 405void luaB_getn (lua_State *L) {
441 lua_pushnumber(L, getnarg(L, gettable(L, 1))); 406 lua_pushnumber(L, getnarg(L, gettable(L, 1)));
442} 407}
@@ -562,21 +527,70 @@ void luaB_sort (lua_State *L) {
562/* }====================================================== */ 527/* }====================================================== */
563 528
564 529
530
565/* 531/*
566** {====================================================== 532** {======================================================
567** Deprecated functions to manipulate global environment: 533** Deprecated functions to manipulate global environment:
568** all of them can be simulated through table operations 534** some of them can be simulated through table operations
569** over the global table. 535** over the global table.
570** ======================================================= 536** =======================================================
571*/ 537*/
572 538
539
540#ifdef LUA_DEPRECATETFUNCS
541
542static void luaB_foreachi (lua_State *L) {
543 const Hash *t = gettable(L, 1);
544 int n = (int)getnarg(L, t);
545 int i;
546 lua_Object f = luaL_functionarg(L, 2);
547 luaD_checkstack(L, 3); /* for f, key, and val */
548 for (i=1; i<=n; i++) {
549 *(L->top++) = *f;
550 ttype(L->top) = TAG_NUMBER; nvalue(L->top++) = i;
551 *(L->top++) = *luaH_getnum(t, i);
552 luaD_call(L, L->top-3, 1);
553 if (ttype(L->top-1) != TAG_NIL)
554 return;
555 L->top--; /* remove nil result */
556 }
557}
558
559
560static void luaB_foreach (lua_State *L) {
561 const Hash *a = gettable(L, 1);
562 lua_Object f = luaL_functionarg(L, 2);
563 int i;
564 luaD_checkstack(L, 3); /* for f, key, and val */
565 for (i=0; i<a->size; i++) {
566 const Node *nd = &(a->node[i]);
567 if (ttype(val(nd)) != TAG_NIL) {
568 *(L->top++) = *f;
569 *(L->top++) = *key(nd);
570 *(L->top++) = *val(nd);
571 luaD_call(L, L->top-3, 1);
572 if (ttype(L->top-1) != TAG_NIL)
573 return;
574 L->top--; /* remove result */
575 }
576 }
577}
578
573#define num_deprecated 4 579#define num_deprecated 4
574 580
575static const struct luaL_reg deprecated_global_funcs[num_deprecated] = { 581static const struct luaL_reg deprecated_global_funcs[num_deprecated] = {
576 {"foreachvar", luaB_foreach}, 582 {"foreachvar", luaB_foreach},
577 {"nextvar", luaB_next}, 583 {"nextvar", luaB_next},
578 {"rawgetglobal", luaB_rawgettable}, 584 {"rawgetglobal", luaB_rawget},
579 {"rawsetglobal", luaB_rawsettable} 585 {"rawsetglobal", luaB_rawset}
586};
587
588
589static const struct luaL_reg other_deprecated_global_funcs[] = {
590 {"foreach", luaB_foreach},
591 {"foreachi", luaB_foreachi},
592 {"rawgettable", luaB_rawget},
593 {"rawsettable", luaB_rawset}
580}; 594};
581 595
582 596
@@ -591,8 +605,38 @@ static void deprecated_funcs (lua_State *L) {
591 lua_pushcclosure(L, deprecated_global_funcs[i].func, 1); 605 lua_pushcclosure(L, deprecated_global_funcs[i].func, 1);
592 lua_setglobal(L, deprecated_global_funcs[i].name); 606 lua_setglobal(L, deprecated_global_funcs[i].name);
593 } 607 }
608 luaL_openl(L, other_deprecated_global_funcs);
594} 609}
595 610
611#else
612
613/*
614** gives an explicit error in any attempt to call an obsolet function
615*/
616static void obsolete_func (lua_State *L) {
617 luaL_verror(L, "function `%.20s' is obsolete", luaL_check_string(L, 1));
618}
619
620
621#define num_deprecated 8
622
623static const char *const obsolete_names [num_deprecated] = {
624 "foreach", "foreachi", "foreachvar", "nextvar", "rawgetglobal",
625 "rawgettable", "rawsetglobal", "rawsettable"
626};
627
628
629static void deprecated_funcs (lua_State *L) {
630 int i;
631 for (i=0; i<num_deprecated; i++) {
632 lua_pushstring(L, obsolete_names[i]);
633 lua_pushcclosure(L, obsolete_func, 1);
634 lua_setglobal(L, obsolete_names[i]);
635 }
636}
637
638#endif
639
596/* }====================================================== */ 640/* }====================================================== */
597 641
598static const struct luaL_reg builtin_funcs[] = { 642static const struct luaL_reg builtin_funcs[] = {
@@ -610,8 +654,8 @@ static const struct luaL_reg builtin_funcs[] = {
610 {"newtag", luaB_newtag}, 654 {"newtag", luaB_newtag},
611 {"next", luaB_next}, 655 {"next", luaB_next},
612 {"print", luaB_print}, 656 {"print", luaB_print},
613 {"rawgettable", luaB_rawgettable}, 657 {"rawget", luaB_rawget},
614 {"rawsettable", luaB_rawsettable}, 658 {"rawset", luaB_rawset},
615 {"setglobal", luaB_setglobal}, 659 {"setglobal", luaB_setglobal},
616 {"settag", luaB_settag}, 660 {"settag", luaB_settag},
617 {"settagmethod", luaB_settagmethod}, 661 {"settagmethod", luaB_settagmethod},
@@ -621,8 +665,6 @@ static const struct luaL_reg builtin_funcs[] = {
621 {"type", luaB_type}, 665 {"type", luaB_type},
622/* "Extra" functions */ 666/* "Extra" functions */
623 {"assert", luaB_assert}, 667 {"assert", luaB_assert},
624 {"foreach", luaB_foreach},
625 {"foreachi", luaB_foreachi},
626 {"getn", luaB_getn}, 668 {"getn", luaB_getn},
627 {"sort", luaB_sort}, 669 {"sort", luaB_sort},
628 {"tinsert", luaB_tinsert}, 670 {"tinsert", luaB_tinsert},