summaryrefslogtreecommitdiff
path: root/lfunc.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2002-08-30 16:09:21 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2002-08-30 16:09:21 -0300
commitfdafd4f4a88d1584dea900517445a17d87f8b82f (patch)
tree52e38e886d569e77c1df82ebe2bcfbaafd4c6f75 /lfunc.c
parentbeeff4ccafe5877d00119cb3d93f1f937d46dcfb (diff)
downloadlua-fdafd4f4a88d1584dea900517445a17d87f8b82f.tar.gz
lua-fdafd4f4a88d1584dea900517445a17d87f8b82f.tar.bz2
lua-fdafd4f4a88d1584dea900517445a17d87f8b82f.zip
new structure for collectable objects, sharing a common header
Diffstat (limited to 'lfunc.c')
-rw-r--r--lfunc.c45
1 files changed, 19 insertions, 26 deletions
diff --git a/lfunc.c b/lfunc.c
index 71cff734..ebdfa086 100644
--- a/lfunc.c
+++ b/lfunc.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lfunc.c,v 1.57 2002/06/20 20:41:46 roberto Exp roberto $ 2** $Id: lfunc.c,v 1.58 2002/08/16 14:45:55 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*/
@@ -10,6 +10,7 @@
10#include "lua.h" 10#include "lua.h"
11 11
12#include "lfunc.h" 12#include "lfunc.h"
13#include "lgc.h"
13#include "lmem.h" 14#include "lmem.h"
14#include "lobject.h" 15#include "lobject.h"
15#include "lstate.h" 16#include "lstate.h"
@@ -25,10 +26,8 @@
25 26
26Closure *luaF_newCclosure (lua_State *L, int nelems) { 27Closure *luaF_newCclosure (lua_State *L, int nelems) {
27 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);
28 c->c.isC = 1; 30 c->c.isC = 1;
29 c->c.next = G(L)->rootcl;
30 G(L)->rootcl = c;
31 c->c.marked = 0;
32 c->c.nupvalues = cast(lu_byte, nelems); 31 c->c.nupvalues = cast(lu_byte, nelems);
33 return c; 32 return c;
34} 33}
@@ -36,10 +35,8 @@ Closure *luaF_newCclosure (lua_State *L, int nelems) {
36 35
37Closure *luaF_newLclosure (lua_State *L, int nelems, TObject *gt) { 36Closure *luaF_newLclosure (lua_State *L, int nelems, TObject *gt) {
38 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);
39 c->l.isC = 0; 39 c->l.isC = 0;
40 c->c.next = G(L)->rootcl;
41 G(L)->rootcl = c;
42 c->l.marked = 0;
43 c->l.g = *gt; 40 c->l.g = *gt;
44 c->l.nupvalues = cast(lu_byte, nelems); 41 c->l.nupvalues = cast(lu_byte, nelems);
45 return c; 42 return c;
@@ -47,37 +44,36 @@ Closure *luaF_newLclosure (lua_State *L, int nelems, TObject *gt) {
47 44
48 45
49UpVal *luaF_findupval (lua_State *L, StkId level) { 46UpVal *luaF_findupval (lua_State *L, StkId level) {
50 UpVal **pp = &L->openupval; 47 GCObject **pp = &L->openupval;
51 UpVal *p; 48 GCObject *p;
52 while ((p = *pp) != NULL && p->v >= level) { 49 UpVal *v;
53 if (p->v == level) return p; 50 while ((p = *pp) != NULL && (&p->uv)->v >= level) {
54 pp = &p->next; 51 if ((&p->uv)->v == level) return &p->uv;
52 pp = &p->gch.next;
55 } 53 }
56 p = luaM_new(L, UpVal); /* not found: create a new one */ 54 v = luaM_new(L, UpVal); /* not found: create a new one */
57 p->marked = 1; /* open upvalues should not be collected */ 55 v->marked = 1; /* open upvalues should not be collected */
58 p->v = level; /* current value lives in the stack */ 56 v->v = level; /* current value lives in the stack */
59 p->next = *pp; /* chain it in the proper position */ 57 v->next = *pp; /* chain it in the proper position */
60 *pp = p; 58 *pp = cast(GCObject *, v);
61 return p; 59 return v;
62} 60}
63 61
64 62
65void luaF_close (lua_State *L, StkId level) { 63void luaF_close (lua_State *L, StkId level) {
66 UpVal *p; 64 UpVal *p;
67 while ((p = L->openupval) != NULL && p->v >= level) { 65 while ((p = &(L->openupval)->uv) != NULL && p->v >= level) {
68 lua_assert(p->marked);
69 p->marked = 0;
70 setobj(&p->value, p->v); /* save current value */ 66 setobj(&p->value, p->v); /* save current value */
71 p->v = &p->value; /* now current value lives here */ 67 p->v = &p->value; /* now current value lives here */
72 L->openupval = p->next; /* remove from `open' list */ 68 L->openupval = p->next; /* remove from `open' list */
73 p->next = G(L)->rootupval; /* chain in `closed' list */ 69 luaC_link(L, cast(GCObject *, p), LUA_TUPVAL);
74 G(L)->rootupval = p;
75 } 70 }
76} 71}
77 72
78 73
79Proto *luaF_newproto (lua_State *L) { 74Proto *luaF_newproto (lua_State *L) {
80 Proto *f = luaM_new(L, Proto); 75 Proto *f = luaM_new(L, Proto);
76 luaC_link(L, cast(GCObject *, f), LUA_TPROTO);
81 f->k = NULL; 77 f->k = NULL;
82 f->sizek = 0; 78 f->sizek = 0;
83 f->p = NULL; 79 f->p = NULL;
@@ -88,14 +84,11 @@ Proto *luaF_newproto (lua_State *L) {
88 f->numparams = 0; 84 f->numparams = 0;
89 f->is_vararg = 0; 85 f->is_vararg = 0;
90 f->maxstacksize = 0; 86 f->maxstacksize = 0;
91 f->marked = 0;
92 f->lineinfo = NULL; 87 f->lineinfo = NULL;
93 f->sizelocvars = 0; 88 f->sizelocvars = 0;
94 f->locvars = NULL; 89 f->locvars = NULL;
95 f->lineDefined = 0; 90 f->lineDefined = 0;
96 f->source = NULL; 91 f->source = NULL;
97 f->next = G(L)->rootproto; /* chain in list of protos */
98 G(L)->rootproto = f;
99 return f; 92 return f;
100} 93}
101 94