summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2001-10-17 19:12:57 -0200
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2001-10-17 19:12:57 -0200
commit1e81da51bab87148981486a84b846399050f4ef2 (patch)
treed2c94326ca096e032d1ae3fa75a5d0605f494cc6
parent7cd37142f404462634a5049a840f572e85c5762b (diff)
downloadlua-1e81da51bab87148981486a84b846399050f4ef2.tar.gz
lua-1e81da51bab87148981486a84b846399050f4ef2.tar.bz2
lua-1e81da51bab87148981486a84b846399050f4ef2.zip
new API for registry and C upvalues + new implementation for references
-rw-r--r--lapi.c120
-rw-r--r--lbaselib.c25
-rw-r--r--ldblib.c16
-rw-r--r--ldo.c13
-rw-r--r--lgc.c5
-rw-r--r--lstate.c7
-rw-r--r--lstate.h5
-rw-r--r--ltests.c21
-rw-r--r--lua.c4
-rw-r--r--lua.h18
10 files changed, 111 insertions, 123 deletions
diff --git a/lapi.c b/lapi.c
index 7c7f68b8..a25707d5 100644
--- a/lapi.c
+++ b/lapi.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lapi.c,v 1.152 2001/09/07 17:39:10 roberto Exp $ 2** $Id: lapi.c,v 1.154 2001/10/11 21:40:56 roberto Exp $
3** Lua API 3** Lua API
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -40,15 +40,28 @@ const l_char lua_ident[] =
40 40
41 41
42 42
43static TObject *negindex (lua_State *L, int index) {
44 if (index > LUA_REGISTRYINDEX) {
45 api_check(L, index != 0 && -index <= L->top - L->ci->base);
46 return L->top+index;
47 } else if (index == LUA_REGISTRYINDEX) /* pseudo-indices */
48 return &G(L)->registry;
49 else {
50 TObject *func = (L->ci->base - 1);
51 index = LUA_REGISTRYINDEX - index;
52 api_check(L, iscfunction(func) && index <= clvalue(func)->c.nupvalues);
53 return &clvalue(func)->c.upvalue[index-1];
54 }
55}
56
57
43TObject *luaA_index (lua_State *L, int index) { 58TObject *luaA_index (lua_State *L, int index) {
44 if (index > 0) { 59 if (index > 0) {
45 api_check(L, index <= L->top - L->ci->base); 60 api_check(L, index <= L->top - L->ci->base);
46 return L->ci->base+index-1; 61 return L->ci->base+index-1;
47 } 62 }
48 else { 63 else
49 api_check(L, index != 0 && -index <= L->top - L->ci->base); 64 return negindex(L, index);
50 return L->top+index;
51 }
52} 65}
53 66
54 67
@@ -59,10 +72,8 @@ static TObject *luaA_indexAcceptable (lua_State *L, int index) {
59 if (o >= L->top) return NULL; 72 if (o >= L->top) return NULL;
60 else return o; 73 else return o;
61 } 74 }
62 else { 75 else
63 api_check(L, index != 0 && -index <= L->top - L->ci->base); 76 return negindex(L, index);
64 return L->top+index;
65 }
66} 77}
67 78
68 79
@@ -378,24 +389,6 @@ LUA_API void lua_getglobals (lua_State *L) {
378} 389}
379 390
380 391
381LUA_API int lua_getref (lua_State *L, int ref) {
382 int status;
383 lua_lock(L);
384 if (ref == LUA_REFNIL) {
385 setnilvalue(L->top);
386 status = 1;
387 }
388 else {
389 setobj(L->top, luaH_getnum(G(L)->weakregistry, ref));
390 status = (ttype(L->top) != LUA_TNIL);
391 }
392 if (status)
393 api_incr_top(L);
394 lua_unlock(L);
395 return status;
396}
397
398
399LUA_API void lua_newtable (lua_State *L) { 392LUA_API void lua_newtable (lua_State *L) {
400 lua_lock(L); 393 lua_lock(L);
401 sethvalue(L->top, luaH_new(L, 0)); 394 sethvalue(L->top, luaH_new(L, 0));
@@ -404,22 +397,6 @@ LUA_API void lua_newtable (lua_State *L) {
404} 397}
405 398
406 399
407LUA_API void lua_getregistry (lua_State *L) {
408 lua_lock(L);
409 sethvalue(L->top, G(L)->registry);
410 api_incr_top(L);
411 lua_unlock(L);
412}
413
414
415LUA_API void lua_getweakregistry (lua_State *L) {
416 lua_lock(L);
417 sethvalue(L->top, G(L)->weakregistry);
418 api_incr_top(L);
419 lua_unlock(L);
420}
421
422
423 400
424/* 401/*
425** set functions (stack -> Lua) 402** set functions (stack -> Lua)
@@ -483,26 +460,25 @@ LUA_API void lua_setglobals (lua_State *L) {
483 460
484LUA_API int lua_ref (lua_State *L, int lock) { 461LUA_API int lua_ref (lua_State *L, int lock) {
485 int ref; 462 int ref;
463 if (lock == 0) lua_error(L, l_s("unlocked references are obsolete"));
486 if (lua_isnil(L, -1)) { 464 if (lua_isnil(L, -1)) {
487 lua_pop(L, 1); 465 lua_pop(L, 1);
488 ref = LUA_REFNIL; 466 return LUA_REFNIL;
489 } 467 }
490 else { 468 lua_rawgeti(L, LUA_REGISTRYINDEX, 0); /* get first free element */
491 lua_getweakregistry(L); 469 ref = lua_tonumber(L, -1);
492 ref = lua_getn(L, -1) + 1; 470 lua_pop(L, 1); /* remove it from stack */
493 lua_pushvalue(L, -2); 471 if (ref != 0) { /* some free element? */
494 lua_rawseti(L, -2, ref); 472 lua_rawgeti(L, LUA_REGISTRYINDEX, ref); /* remove it from list */
495 if (lock) { 473 lua_rawseti(L, LUA_REGISTRYINDEX, 0);
496 lua_getregistry(L); 474 }
497 lua_pushvalue(L, -3); 475 else { /* no free elements */
498 lua_rawseti(L, -2, ref); 476 ref = lua_getn(L, LUA_REGISTRYINDEX) + 1; /* use next `n' */
499 lua_pop(L, 1); /* remove registry */
500 }
501 lua_pushliteral(L, l_s("n")); 477 lua_pushliteral(L, l_s("n"));
502 lua_pushnumber(L, ref); 478 lua_pushnumber(L, ref);
503 lua_settable(L, -3); 479 lua_settable(L, LUA_REGISTRYINDEX); /* n = n+1 */
504 lua_pop(L, 2);
505 } 480 }
481 lua_rawseti(L, LUA_REGISTRYINDEX, ref);
506 return ref; 482 return ref;
507} 483}
508 484
@@ -661,13 +637,10 @@ LUA_API void lua_error (lua_State *L, const l_char *s) {
661 637
662LUA_API void lua_unref (lua_State *L, int ref) { 638LUA_API void lua_unref (lua_State *L, int ref) {
663 if (ref >= 0) { 639 if (ref >= 0) {
664 lua_getregistry(L); 640 lua_rawgeti(L, LUA_REGISTRYINDEX, 0);
665 lua_pushnil(L); 641 lua_pushnumber(L, ref);
666 lua_rawseti(L, -2, ref); 642 lua_rawseti(L, LUA_REGISTRYINDEX, 0);
667 lua_getweakregistry(L); 643 lua_rawseti(L, LUA_REGISTRYINDEX, ref);
668 lua_pushnil(L);
669 lua_rawseti(L, -2, ref);
670 lua_pop(L, 2); /* remove both registries */
671 } 644 }
672} 645}
673 646
@@ -787,3 +760,22 @@ LUA_API void lua_setweakmode (lua_State *L, int mode) {
787 lua_unlock(L); 760 lua_unlock(L);
788} 761}
789 762
763
764
765LUA_API void lua_pushupvalues (lua_State *L) {
766 TObject *func;
767 int n, i;
768 lua_lock(L);
769 func = (L->ci->base - 1);
770 api_check(L, iscfunction(func));
771 n = clvalue(func)->c.nupvalues;
772 if (LUA_MINSTACK+n > lua_stackspace(L))
773 luaD_error(L, l_s("stack overflow"));
774 for (i=0; i<n; i++) {
775 setobj(L->top, &clvalue(func)->c.upvalue[i]);
776 L->top++;
777 }
778 lua_unlock(L);
779}
780
781
diff --git a/lbaselib.c b/lbaselib.c
index 62695c04..cbb0cf36 100644
--- a/lbaselib.c
+++ b/lbaselib.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lbaselib.c,v 1.41 2001/08/31 19:46:07 roberto Exp $ 2** $Id: lbaselib.c,v 1.43 2001/10/11 21:41:21 roberto Exp $
3** Basic library 3** Basic library
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -363,18 +363,8 @@ static int luaB_require (lua_State *L) {
363 lua_pushvalue(L, -1); /* duplicate to leave a copy on stack */ 363 lua_pushvalue(L, -1); /* duplicate to leave a copy on stack */
364 lua_setglobal(L, LUA_PATH); 364 lua_setglobal(L, LUA_PATH);
365 } 365 }
366 lua_getregistry(L); 366 lua_pushvalue(L, 1); /* check package's name in book-keeping table */
367 lua_pushliteral(L, LUA_PATH); 367 lua_gettable(L, lua_upvalueindex(1));
368 lua_gettable(L, 3); /* get book-keeping table */
369 if (lua_isnil(L, 4)) { /* no book-keeping table? */
370 lua_pop(L, 1); /* pop the `nil' */
371 lua_newtable(L); /* create book-keeping table */
372 lua_pushliteral(L, LUA_PATH);
373 lua_pushvalue(L, -2); /* duplicate table to leave a copy on stack */
374 lua_settable(L, 3); /* store book-keeping table in registry */
375 }
376 lua_pushvalue(L, 1);
377 lua_gettable(L, 4); /* check package's name in book-keeping table */
378 if (!lua_isnil(L, -1)) /* is it there? */ 368 if (!lua_isnil(L, -1)) /* is it there? */
379 return 0; /* package is already loaded */ 369 return 0; /* package is already loaded */
380 else { /* must load it */ 370 else { /* must load it */
@@ -385,7 +375,7 @@ static int luaB_require (lua_State *L) {
385 lua_pushvalue(L, 1); /* package name */ 375 lua_pushvalue(L, 1); /* package name */
386 lua_concat(L, 2); /* concat directory with package name */ 376 lua_concat(L, 2); /* concat directory with package name */
387 res = lua_dofile(L, lua_tostring(L, -1)); /* try to load it */ 377 res = lua_dofile(L, lua_tostring(L, -1)); /* try to load it */
388 lua_settop(L, 4); /* pop string and eventual results from dofile */ 378 lua_settop(L, 2); /* pop string and eventual results from dofile */
389 if (res == 0) break; /* ok; file done */ 379 if (res == 0) break; /* ok; file done */
390 else if (res != LUA_ERRFILE) 380 else if (res != LUA_ERRFILE)
391 lua_error(L, NULL); /* error running package; propagate it */ 381 lua_error(L, NULL); /* error running package; propagate it */
@@ -397,7 +387,7 @@ static int luaB_require (lua_State *L) {
397 } 387 }
398 lua_pushvalue(L, 1); 388 lua_pushvalue(L, 1);
399 lua_pushnumber(L, 1); 389 lua_pushnumber(L, 1);
400 lua_settable(L, 4); /* mark it as loaded */ 390 lua_settable(L, lua_upvalueindex(1)); /* mark it as loaded */
401 return 0; 391 return 0;
402} 392}
403 393
@@ -713,7 +703,6 @@ static const luaL_reg base_funcs[] = {
713 {l_s("rawgettable"), luaB_rawget}, /* for compatibility 3.2 */ 703 {l_s("rawgettable"), luaB_rawget}, /* for compatibility 3.2 */
714 {l_s("rawsettable"), luaB_rawset}, /* for compatibility 3.2 */ 704 {l_s("rawsettable"), luaB_rawset}, /* for compatibility 3.2 */
715 {l_s("rawtype"), luaB_rawtype}, 705 {l_s("rawtype"), luaB_rawtype},
716 {l_s("require"), luaB_require},
717 {l_s("setglobal"), luaB_setglobal}, 706 {l_s("setglobal"), luaB_setglobal},
718 {l_s("settag"), luaB_settype}, /* for compatibility 4.0 */ 707 {l_s("settag"), luaB_settype}, /* for compatibility 4.0 */
719 {l_s("settype"), luaB_settype}, 708 {l_s("settype"), luaB_settype},
@@ -737,6 +726,10 @@ LUALIB_API int lua_baselibopen (lua_State *L) {
737 luaL_openl(L, base_funcs); 726 luaL_openl(L, base_funcs);
738 lua_pushliteral(L, l_s(LUA_VERSION)); 727 lua_pushliteral(L, l_s(LUA_VERSION));
739 lua_setglobal(L, l_s("_VERSION")); 728 lua_setglobal(L, l_s("_VERSION"));
729 /* `require' needs an empty table as upvalue */
730 lua_newtable(L);
731 lua_pushcclosure(L, luaB_require, 1);
732 lua_setglobal(L, l_s("require"));
740 return 0; 733 return 0;
741} 734}
742 735
diff --git a/ldblib.c b/ldblib.c
index f91bb551..3c95fdb8 100644
--- a/ldblib.c
+++ b/ldblib.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: ldblib.c,v 1.37 2001/06/06 18:00:19 roberto Exp $ 2** $Id: ldblib.c,v 1.38 2001/08/31 19:46:07 roberto Exp $
3** Interface from Lua to its debug API 3** Interface from Lua to its debug API
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -116,16 +116,14 @@ static int setlocal (lua_State *L) {
116 116
117 117
118static void hookf (lua_State *L, const l_char *key) { 118static void hookf (lua_State *L, const l_char *key) {
119 lua_getregistry(L);
120 lua_pushstring(L, key); 119 lua_pushstring(L, key);
121 lua_gettable(L, -2); 120 lua_gettable(L, LUA_REGISTRYINDEX);
122 if (lua_isfunction(L, -1)) { 121 if (lua_isfunction(L, -1)) {
123 lua_pushvalue(L, -3); /* original argument (below table and function) */ 122 lua_pushvalue(L, -2); /* original argument (below function) */
124 lua_rawcall(L, 1, 0); 123 lua_rawcall(L, 1, 0);
125 } 124 }
126 else 125 else
127 lua_pop(L, 1); /* pop result from gettable */ 126 lua_pop(L, 1); /* pop result from gettable */
128 lua_pop(L, 1); /* pop table */
129} 127}
130 128
131 129
@@ -150,13 +148,11 @@ static void sethook (lua_State *L, const l_char *key, lua_Hook hook,
150 (*sethookf)(L, hook); 148 (*sethookf)(L, hook);
151 else 149 else
152 luaL_argerror(L, 1, l_s("function expected")); 150 luaL_argerror(L, 1, l_s("function expected"));
153 lua_getregistry(L);
154 lua_pushstring(L, key); 151 lua_pushstring(L, key);
155 lua_pushvalue(L, -1); /* dup key */ 152 lua_gettable(L, LUA_REGISTRYINDEX); /* get old value */
156 lua_gettable(L, -3); /* get old value */ 153 lua_pushstring(L, key);
157 lua_pushvalue(L, -2); /* key (again) */
158 lua_pushvalue(L, 1); 154 lua_pushvalue(L, 1);
159 lua_settable(L, -5); /* set new value */ 155 lua_settable(L, LUA_REGISTRYINDEX); /* set new value */
160} 156}
161 157
162 158
diff --git a/ldo.c b/ldo.c
index 60e5dc2e..087863cb 100644
--- a/ldo.c
+++ b/ldo.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: ldo.c,v 1.141 2001/09/25 17:05:49 roberto Exp $ 2** $Id: ldo.c,v 1.142 2001/10/02 16:45:03 roberto Exp $
3** Stack and Call structure of Lua 3** Stack and Call structure of Lua
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -44,7 +44,8 @@ void luaD_init (lua_State *L, int stacksize) {
44 stacksize += EXTRA_STACK; 44 stacksize += EXTRA_STACK;
45 L->stack = luaM_newvector(L, stacksize, TObject); 45 L->stack = luaM_newvector(L, stacksize, TObject);
46 L->stacksize = stacksize; 46 L->stacksize = stacksize;
47 L->basefunc.base = L->top = L->stack; 47 setnilvalue(L->stack); /* the `initial' function */
48 L->top = L->basefunc.base = L->stack + 1;
48 restore_stack_limit(L); 49 restore_stack_limit(L);
49} 50}
50 51
@@ -119,12 +120,12 @@ static void luaD_callHook (lua_State *L, lua_Hook callhook,
119 120
120 121
121static StkId callCclosure (lua_State *L, const struct CClosure *cl) { 122static StkId callCclosure (lua_State *L, const struct CClosure *cl) {
122 int nup = cl->nupvalues; /* number of upvalues */
123 int n; 123 int n;
124 luaD_checkstack(L, nup+LUA_MINSTACK); /* ensure minimum stack size */ 124 luaD_checkstack(L, LUA_MINSTACK); /* ensure minimum stack size */
125 for (n=0; n<nup; n++) /* copy upvalues as extra arguments */
126 setobj(L->top++, &cl->upvalue[n]);
127 lua_unlock(L); 125 lua_unlock(L);
126#if LUA_COMPATUPVALUES
127 lua_pushupvalues(L);
128#endif
128 n = (*cl->f)(L); /* do the actual call */ 129 n = (*cl->f)(L); /* do the actual call */
129 lua_lock(L); 130 lua_lock(L);
130 return L->top - n; /* return index of first result */ 131 return L->top - n; /* return index of first result */
diff --git a/lgc.c b/lgc.c
index cb08df35..35251ce3 100644
--- a/lgc.c
+++ b/lgc.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lgc.c,v 1.111 2001/09/07 17:39:10 roberto Exp $ 2** $Id: lgc.c,v 1.112 2001/10/02 16:45:03 roberto Exp $
3** Garbage Collector 3** Garbage Collector
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -171,8 +171,7 @@ static void markall (lua_State *L) {
171 marktagmethods(G(L), &st); /* mark tag methods */ 171 marktagmethods(G(L), &st); /* mark tag methods */
172 markstacks(L, &st); /* mark all stacks */ 172 markstacks(L, &st); /* mark all stacks */
173 marktable(&st, G(L)->type2tag); 173 marktable(&st, G(L)->type2tag);
174 marktable(&st, G(L)->registry); 174 markobject(&st, &G(L)->registry);
175 marktable(&st, G(L)->weakregistry);
176 while (st.tmark) { /* mark tables */ 175 while (st.tmark) { /* mark tables */
177 Hash *h = st.tmark; /* get first table from list */ 176 Hash *h = st.tmark; /* get first table from list */
178 st.tmark = h->mark; /* remove it from list */ 177 st.tmark = h->mark; /* remove it from list */
diff --git a/lstate.c b/lstate.c
index 4b404b0b..640bfcde 100644
--- a/lstate.c
+++ b/lstate.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lstate.c,v 1.66 2001/07/17 17:54:46 roberto Exp $ 2** $Id: lstate.c,v 1.68 2001/09/07 17:39:10 roberto Exp $
3** Global State 3** Global State
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -66,10 +66,7 @@ static void f_luaopen (lua_State *L, void *ud) {
66 luaD_init(L, so->stacksize); /* init stack */ 66 luaD_init(L, so->stacksize); /* init stack */
67 L->gt = luaH_new(L, 10); /* table of globals */ 67 L->gt = luaH_new(L, 10); /* table of globals */
68 G(L)->type2tag = luaH_new(L, 10); 68 G(L)->type2tag = luaH_new(L, 10);
69 G(L)->registry = luaH_new(L, 0); 69 sethvalue(&G(L)->registry, luaH_new(L, 0));
70 G(L)->weakregistry = luaH_new(L, 0);
71 /* make weakregistry weak */
72 G(L)->weakregistry->weakmode = LUA_WEAK_KEY | LUA_WEAK_VALUE;
73 luaS_resize(L, MINPOWER2); 70 luaS_resize(L, MINPOWER2);
74 luaX_init(L); 71 luaX_init(L);
75 luaT_init(L); 72 luaT_init(L);
diff --git a/lstate.h b/lstate.h
index ebeeab52..aa29c3bd 100644
--- a/lstate.h
+++ b/lstate.h
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lstate.h,v 1.59 2001/09/07 17:39:10 roberto Exp $ 2** $Id: lstate.h,v 1.60 2001/10/02 16:43:29 roberto Exp $
3** Global State 3** Global State
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -58,8 +58,7 @@ typedef struct global_State {
58 size_t Mbuffsize; /* size of Mbuffer */ 58 size_t Mbuffsize; /* size of Mbuffer */
59 stringtable strt; /* hash table for strings */ 59 stringtable strt; /* hash table for strings */
60 Hash *type2tag; /* hash table from type names to tags */ 60 Hash *type2tag; /* hash table from type names to tags */
61 Hash *registry; /* (strong) registry table */ 61 TObject registry; /* registry table */
62 Hash *weakregistry; /* weakregistry table */
63 struct TM *TMtable; /* table for tag methods */ 62 struct TM *TMtable; /* table for tag methods */
64 int sizeTM; /* size of TMtable */ 63 int sizeTM; /* size of TMtable */
65 int ntag; /* number of tags in TMtable */ 64 int ntag; /* number of tags in TMtable */
diff --git a/ltests.c b/ltests.c
index 03d65657..afcc460a 100644
--- a/ltests.c
+++ b/ltests.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: ltests.c,v 1.91 2001/09/07 17:39:10 roberto Exp $ 2** $Id: ltests.c,v 1.92 2001/10/02 16:45:03 roberto Exp $
3** Internal Module for Debugging of the Lua Implementation 3** Internal Module for Debugging of the Lua Implementation
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -317,21 +317,16 @@ static int tref (lua_State *L) {
317 int level = lua_gettop(L); 317 int level = lua_gettop(L);
318 luaL_checkany(L, 1); 318 luaL_checkany(L, 1);
319 lua_pushvalue(L, 1); 319 lua_pushvalue(L, 1);
320 lua_pushnumber(L, lua_ref(L, luaL_opt_int(L, 2, 1))); 320 lua_pushnumber(L, lua_ref(L, 1));
321 assert(lua_gettop(L) == level+1); /* +1 for result */ 321 assert(lua_gettop(L) == level+1); /* +1 for result */
322 return 1; 322 return 1;
323} 323}
324 324
325static int getref (lua_State *L) { 325static int getref (lua_State *L) {
326 int level = lua_gettop(L); 326 int level = lua_gettop(L);
327 if (lua_getref(L, luaL_check_int(L, 1))) { 327 lua_getref(L, luaL_check_int(L, 1));
328 assert(lua_gettop(L) == level+1); 328 assert(lua_gettop(L) == level+1);
329 return 1; 329 return 1;
330 }
331 else {
332 assert(lua_gettop(L) == level);
333 return 0;
334 }
335} 330}
336 331
337static int unref (lua_State *L) { 332static int unref (lua_State *L) {
@@ -570,6 +565,12 @@ static int testC (lua_State *L) {
570 else if EQ(l_s("pushvalue")) { 565 else if EQ(l_s("pushvalue")) {
571 lua_pushvalue(L, getnum); 566 lua_pushvalue(L, getnum);
572 } 567 }
568 else if EQ(l_s("pushcclosure")) {
569 lua_pushcclosure(L, testC, getnum);
570 }
571 else if EQ(l_s("pushupvalues")) {
572 lua_pushupvalues(L);
573 }
573 else if EQ(l_s("remove")) { 574 else if EQ(l_s("remove")) {
574 lua_remove(L, getnum); 575 lua_remove(L, getnum);
575 } 576 }
diff --git a/lua.c b/lua.c
index b1c4cb7b..d390a7aa 100644
--- a/lua.c
+++ b/lua.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lua.c,v 1.69 2001/08/30 20:54:02 roberto Exp $ 2** $Id: lua.c,v 1.70 2001/09/25 17:06:34 roberto Exp $
3** Lua stand-alone interpreter 3** Lua stand-alone interpreter
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -141,7 +141,7 @@ static void getargs (l_char *argv[]) {
141 141
142 142
143static int l_getargs (lua_State *l) { 143static int l_getargs (lua_State *l) {
144 l_char **argv = (l_char **)lua_touserdata(l, -1); 144 l_char **argv = (l_char **)lua_touserdata(l, lua_upvalueindex(1));
145 getargs(argv); 145 getargs(argv);
146 return 1; 146 return 1;
147} 147}
diff --git a/lua.h b/lua.h
index 3ec57716..1325f5f4 100644
--- a/lua.h
+++ b/lua.h
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lua.h,v 1.103 2001/08/31 19:46:07 roberto Exp $ 2** $Id: lua.h,v 1.104 2001/10/11 21:41:21 roberto Exp $
3** Lua - An Extensible Extension Language 3** Lua - An Extensible Extension Language
4** TeCGraf: Grupo de Tecnologia em Computacao Grafica, PUC-Rio, Brazil 4** TeCGraf: Grupo de Tecnologia em Computacao Grafica, PUC-Rio, Brazil
5** e-mail: info@lua.org 5** e-mail: info@lua.org
@@ -35,6 +35,13 @@
35#define LUA_MULTRET (-1) 35#define LUA_MULTRET (-1)
36 36
37 37
38/* pseudo-index for registry */
39#define LUA_REGISTRYINDEX (-10000)
40
41/* pseudo-indices for upvalues */
42#define lua_upvalueindex(i) (LUA_REGISTRYINDEX-(i))
43
44
38/* error codes for `lua_do*' and the like */ 45/* error codes for `lua_do*' and the like */
39#define LUA_ERRRUN 1 46#define LUA_ERRRUN 1
40#define LUA_ERRFILE 2 47#define LUA_ERRFILE 2
@@ -160,9 +167,7 @@ LUA_API void lua_rawget (lua_State *L, int index);
160LUA_API void lua_rawgeti (lua_State *L, int index, int n); 167LUA_API void lua_rawgeti (lua_State *L, int index, int n);
161LUA_API void lua_getglobals (lua_State *L); 168LUA_API void lua_getglobals (lua_State *L);
162LUA_API void lua_gettagmethod (lua_State *L, int tag, const lua_char *event); 169LUA_API void lua_gettagmethod (lua_State *L, int tag, const lua_char *event);
163LUA_API int lua_getref (lua_State *L, int ref);
164LUA_API void lua_newtable (lua_State *L); 170LUA_API void lua_newtable (lua_State *L);
165LUA_API void lua_getregistry (lua_State *L);
166LUA_API void lua_getweakregistry (lua_State *L); 171LUA_API void lua_getweakregistry (lua_State *L);
167 172
168 173
@@ -246,14 +251,19 @@ LUA_API int lua_getweakmode (lua_State *L, int index);
246#define lua_pushliteral(L, s) lua_pushlstring(L, s, \ 251#define lua_pushliteral(L, s) lua_pushlstring(L, s, \
247 (sizeof(s)/sizeof(lua_char))-1) 252 (sizeof(s)/sizeof(lua_char))-1)
248 253
254#define lua_getregistry(L) lua_pushvalue(L, LUA_REGISTRYINDEX);
255
256#define lua_getref(L,ref) lua_rawgeti(L, LUA_REGISTRYINDEX, ref)
249 257
250 258
251/* 259/*
252** compatibility macros 260** compatibility macros and functions
253*/ 261*/
254#define lua_newtag(L) lua_newtype(L, NULL, LUA_TNONE) 262#define lua_newtag(L) lua_newtype(L, NULL, LUA_TNONE)
255#define lua_typename lua_tag2name 263#define lua_typename lua_tag2name
256 264
265LUA_API void lua_pushupvalues (lua_State *L);
266
257#endif 267#endif
258 268
259 269