diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2009-12-17 13:46:44 -0200 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2009-12-17 13:46:44 -0200 |
| commit | 0bbdddc86b1353fec36ae886b4142986f3c4713f (patch) | |
| tree | 9eb933c8123911f9477e8b8b55344035c8077c01 /lfunc.c | |
| parent | b3b8dfaaea2dba7e7b4b898a5f767a80f36319f1 (diff) | |
| download | lua-0bbdddc86b1353fec36ae886b4142986f3c4713f.tar.gz lua-0bbdddc86b1353fec36ae886b4142986f3c4713f.tar.bz2 lua-0bbdddc86b1353fec36ae886b4142986f3c4713f.zip | |
allocator function receives the tag of object being allocated in 'osize'
when 'ptr' is NULL.
Diffstat (limited to 'lfunc.c')
| -rw-r--r-- | lfunc.c | 31 |
1 files changed, 12 insertions, 19 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lfunc.c,v 2.17 2009/11/26 11:39:20 roberto Exp roberto $ | 2 | ** $Id: lfunc.c,v 2.18 2009/12/11 13:39:34 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 | */ |
| @@ -21,30 +21,27 @@ | |||
| 21 | 21 | ||
| 22 | 22 | ||
| 23 | 23 | ||
| 24 | Closure *luaF_newCclosure (lua_State *L, int nelems, Table *e) { | 24 | Closure *luaF_newCclosure (lua_State *L, int n, Table *e) { |
| 25 | Closure *c = cast(Closure *, luaM_malloc(L, sizeCclosure(nelems))); | 25 | Closure *c = &luaC_newobj(L, LUA_TFUNCTION, sizeCclosure(n), NULL, 0)->cl; |
| 26 | luaC_link(L, obj2gco(c), LUA_TFUNCTION); | ||
| 27 | c->c.isC = 1; | 26 | c->c.isC = 1; |
| 28 | c->c.env = e; | 27 | c->c.env = e; |
| 29 | c->c.nupvalues = cast_byte(nelems); | 28 | c->c.nupvalues = cast_byte(n); |
| 30 | return c; | 29 | return c; |
| 31 | } | 30 | } |
| 32 | 31 | ||
| 33 | 32 | ||
| 34 | Closure *luaF_newLclosure (lua_State *L, int nelems, Table *e) { | 33 | Closure *luaF_newLclosure (lua_State *L, int n, Table *e) { |
| 35 | Closure *c = cast(Closure *, luaM_malloc(L, sizeLclosure(nelems))); | 34 | Closure *c = &luaC_newobj(L, LUA_TFUNCTION, sizeLclosure(n), NULL, 0)->cl; |
| 36 | luaC_link(L, obj2gco(c), LUA_TFUNCTION); | ||
| 37 | c->l.isC = 0; | 35 | c->l.isC = 0; |
| 38 | c->l.env = e; | 36 | c->l.env = e; |
| 39 | c->l.nupvalues = cast_byte(nelems); | 37 | c->l.nupvalues = cast_byte(n); |
| 40 | while (nelems--) c->l.upvals[nelems] = NULL; | 38 | while (n--) c->l.upvals[n] = NULL; |
| 41 | return c; | 39 | return c; |
| 42 | } | 40 | } |
| 43 | 41 | ||
| 44 | 42 | ||
| 45 | UpVal *luaF_newupval (lua_State *L) { | 43 | UpVal *luaF_newupval (lua_State *L) { |
| 46 | UpVal *uv = luaM_new(L, UpVal); | 44 | UpVal *uv = &luaC_newobj(L, LUA_TUPVAL, sizeof(UpVal), NULL, 0)->uv; |
| 47 | luaC_link(L, obj2gco(uv), LUA_TUPVAL); | ||
| 48 | uv->v = &uv->u.value; | 45 | uv->v = &uv->u.value; |
| 49 | setnilvalue(uv->v); | 46 | setnilvalue(uv->v); |
| 50 | return uv; | 47 | return uv; |
| @@ -65,12 +62,9 @@ UpVal *luaF_findupval (lua_State *L, StkId level) { | |||
| 65 | } | 62 | } |
| 66 | pp = &p->next; | 63 | pp = &p->next; |
| 67 | } | 64 | } |
| 68 | uv = luaM_new(L, UpVal); /* not found: create a new one */ | 65 | /* not found: create a new one */ |
| 69 | uv->tt = LUA_TUPVAL; | 66 | uv = &luaC_newobj(L, LUA_TUPVAL, sizeof(UpVal), pp, 0)->uv; |
| 70 | uv->marked = luaC_white(g); | ||
| 71 | uv->v = level; /* current value lives in the stack */ | 67 | uv->v = level; /* current value lives in the stack */ |
| 72 | uv->next = *pp; /* chain it in the proper position */ | ||
| 73 | *pp = obj2gco(uv); | ||
| 74 | uv->u.l.prev = &g->uvhead; /* double link it in `uvhead' list */ | 68 | uv->u.l.prev = &g->uvhead; /* double link it in `uvhead' list */ |
| 75 | uv->u.l.next = g->uvhead.u.l.next; | 69 | uv->u.l.next = g->uvhead.u.l.next; |
| 76 | uv->u.l.next->u.l.prev = uv; | 70 | uv->u.l.next->u.l.prev = uv; |
| @@ -114,8 +108,7 @@ void luaF_close (lua_State *L, StkId level) { | |||
| 114 | 108 | ||
| 115 | 109 | ||
| 116 | Proto *luaF_newproto (lua_State *L) { | 110 | Proto *luaF_newproto (lua_State *L) { |
| 117 | Proto *f = luaM_new(L, Proto); | 111 | Proto *f = &luaC_newobj(L, LUA_TPROTO, sizeof(Proto), NULL, 0)->p; |
| 118 | luaC_link(L, obj2gco(f), LUA_TPROTO); | ||
| 119 | f->k = NULL; | 112 | f->k = NULL; |
| 120 | f->sizek = 0; | 113 | f->sizek = 0; |
| 121 | f->p = NULL; | 114 | f->p = NULL; |
