aboutsummaryrefslogtreecommitdiff
path: root/lfunc.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2002-11-13 09:32:26 -0200
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2002-11-13 09:32:26 -0200
commit2f91f95d94d3a27fee6b45c31ea9ab631924a8bf (patch)
treebbc605f6643b4958f45536dc5f5f84297eda70c2 /lfunc.c
parent42dd080a2e3e8fb6887ca1e066f53bb8fd23c9e7 (diff)
downloadlua-2f91f95d94d3a27fee6b45c31ea9ab631924a8bf.tar.gz
lua-2f91f95d94d3a27fee6b45c31ea9ab631924a8bf.tar.bz2
lua-2f91f95d94d3a27fee6b45c31ea9ab631924a8bf.zip
better control over GCObjects
Diffstat (limited to 'lfunc.c')
-rw-r--r--lfunc.c23
1 files changed, 12 insertions, 11 deletions
diff --git a/lfunc.c b/lfunc.c
index 433075e6..a34f31aa 100644
--- a/lfunc.c
+++ b/lfunc.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lfunc.c,v 1.60 2002/10/16 20:40:58 roberto Exp roberto $ 2** $Id: lfunc.c,v 1.61 2002/10/21 20:41:46 roberto Exp roberto $
3** Auxiliary functions to manipulate prototypes and closures 3** Auxiliary functions to manipulate prototypes and closures
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -26,7 +26,7 @@
26 26
27Closure *luaF_newCclosure (lua_State *L, int nelems) { 27Closure *luaF_newCclosure (lua_State *L, int nelems) {
28 Closure *c = cast(Closure *, luaM_malloc(L, sizeCclosure(nelems))); 28 Closure *c = cast(Closure *, luaM_malloc(L, sizeCclosure(nelems)));
29 luaC_link(L, cast(GCObject *, c), LUA_TFUNCTION); 29 luaC_link(L, valtogco(c), LUA_TFUNCTION);
30 c->c.isC = 1; 30 c->c.isC = 1;
31 c->c.nupvalues = cast(lu_byte, nelems); 31 c->c.nupvalues = cast(lu_byte, nelems);
32 return c; 32 return c;
@@ -35,7 +35,7 @@ Closure *luaF_newCclosure (lua_State *L, int nelems) {
35 35
36Closure *luaF_newLclosure (lua_State *L, int nelems, TObject *gt) { 36Closure *luaF_newLclosure (lua_State *L, int nelems, TObject *gt) {
37 Closure *c = cast(Closure *, luaM_malloc(L, sizeLclosure(nelems))); 37 Closure *c = cast(Closure *, luaM_malloc(L, sizeLclosure(nelems)));
38 luaC_link(L, cast(GCObject *, c), LUA_TFUNCTION); 38 luaC_link(L, valtogco(c), LUA_TFUNCTION);
39 c->l.isC = 0; 39 c->l.isC = 0;
40 c->l.g = *gt; 40 c->l.g = *gt;
41 c->l.nupvalues = cast(lu_byte, nelems); 41 c->l.nupvalues = cast(lu_byte, nelems);
@@ -45,35 +45,36 @@ Closure *luaF_newLclosure (lua_State *L, int nelems, TObject *gt) {
45 45
46UpVal *luaF_findupval (lua_State *L, StkId level) { 46UpVal *luaF_findupval (lua_State *L, StkId level) {
47 GCObject **pp = &L->openupval; 47 GCObject **pp = &L->openupval;
48 GCObject *p; 48 UpVal *p;
49 UpVal *v; 49 UpVal *v;
50 while ((p = *pp) != NULL && (&p->uv)->v >= level) { 50 while ((p = ngcotouv(*pp)) != NULL && p->v >= level) {
51 if ((&p->uv)->v == level) return &p->uv; 51 if (p->v == level) return p;
52 pp = &p->gch.next; 52 pp = &p->next;
53 } 53 }
54 v = luaM_new(L, UpVal); /* not found: create a new one */ 54 v = luaM_new(L, UpVal); /* not found: create a new one */
55 v->tt = LUA_TUPVAL;
55 v->marked = 1; /* open upvalues should not be collected */ 56 v->marked = 1; /* open upvalues should not be collected */
56 v->v = level; /* current value lives in the stack */ 57 v->v = level; /* current value lives in the stack */
57 v->next = *pp; /* chain it in the proper position */ 58 v->next = *pp; /* chain it in the proper position */
58 *pp = cast(GCObject *, v); 59 *pp = valtogco(v);
59 return v; 60 return v;
60} 61}
61 62
62 63
63void luaF_close (lua_State *L, StkId level) { 64void luaF_close (lua_State *L, StkId level) {
64 UpVal *p; 65 UpVal *p;
65 while ((p = &(L->openupval)->uv) != NULL && p->v >= level) { 66 while ((p = ngcotouv(L->openupval)) != NULL && p->v >= level) {
66 setobj(&p->value, p->v); /* save current value */ 67 setobj(&p->value, p->v); /* save current value */
67 p->v = &p->value; /* now current value lives here */ 68 p->v = &p->value; /* now current value lives here */
68 L->openupval = p->next; /* remove from `open' list */ 69 L->openupval = p->next; /* remove from `open' list */
69 luaC_link(L, cast(GCObject *, p), LUA_TUPVAL); 70 luaC_link(L, valtogco(p), LUA_TUPVAL);
70 } 71 }
71} 72}
72 73
73 74
74Proto *luaF_newproto (lua_State *L) { 75Proto *luaF_newproto (lua_State *L) {
75 Proto *f = luaM_new(L, Proto); 76 Proto *f = luaM_new(L, Proto);
76 luaC_link(L, cast(GCObject *, f), LUA_TPROTO); 77 luaC_link(L, valtogco(f), LUA_TPROTO);
77 f->k = NULL; 78 f->k = NULL;
78 f->sizek = 0; 79 f->sizek = 0;
79 f->p = NULL; 80 f->p = NULL;