aboutsummaryrefslogtreecommitdiff
path: root/lfunc.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2000-12-28 10:55:41 -0200
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2000-12-28 10:55:41 -0200
commit0183b8030c80f57b87874ff7867ccdb172d9d3dc (patch)
tree1033b5a84489a2f1f1bd210b1b120155cd7aeed7 /lfunc.c
parent8c49e198654567f770a7d5081b886a7c35201d81 (diff)
downloadlua-0183b8030c80f57b87874ff7867ccdb172d9d3dc.tar.gz
lua-0183b8030c80f57b87874ff7867ccdb172d9d3dc.tar.bz2
lua-0183b8030c80f57b87874ff7867ccdb172d9d3dc.zip
`free' gets size of the block: complete control over memory use
Diffstat (limited to 'lfunc.c')
-rw-r--r--lfunc.c56
1 files changed, 17 insertions, 39 deletions
diff --git a/lfunc.c b/lfunc.c
index ad1abfc4..14ef5e15 100644
--- a/lfunc.c
+++ b/lfunc.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lfunc.c,v 1.34 2000/10/30 12:20:29 roberto Exp roberto $ 2** $Id: lfunc.c,v 1.35 2000/12/04 18:33:40 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*/
@@ -18,13 +18,11 @@
18 18
19 19
20Closure *luaF_newclosure (lua_State *L, int nelems) { 20Closure *luaF_newclosure (lua_State *L, int nelems) {
21 int size = sizeclosure(nelems); 21 Closure *c = (Closure *)luaM_malloc(L, sizeclosure(nelems));
22 Closure *c = (Closure *)luaM_malloc(L, size);
23 c->next = L->rootcl; 22 c->next = L->rootcl;
24 L->rootcl = c; 23 L->rootcl = c;
25 c->mark = c; 24 c->mark = c;
26 c->nupvalues = nelems; 25 c->nupvalues = nelems;
27 L->nblocks += size;
28 return c; 26 return c;
29} 27}
30 28
@@ -32,20 +30,20 @@ Closure *luaF_newclosure (lua_State *L, int nelems) {
32Proto *luaF_newproto (lua_State *L) { 30Proto *luaF_newproto (lua_State *L) {
33 Proto *f = luaM_new(L, Proto); 31 Proto *f = luaM_new(L, Proto);
34 f->knum = NULL; 32 f->knum = NULL;
35 f->nknum = 0; 33 f->sizeknum = 0;
36 f->kstr = NULL; 34 f->kstr = NULL;
37 f->nkstr = 0; 35 f->sizekstr = 0;
38 f->kproto = NULL; 36 f->kproto = NULL;
39 f->nkproto = 0; 37 f->sizekproto = 0;
40 f->code = NULL; 38 f->code = NULL;
41 f->ncode = 0; 39 f->sizecode = 0;
42 f->numparams = 0; 40 f->numparams = 0;
43 f->is_vararg = 0; 41 f->is_vararg = 0;
44 f->maxstacksize = 0; 42 f->maxstacksize = 0;
45 f->marked = 0; 43 f->marked = 0;
46 f->lineinfo = NULL; 44 f->lineinfo = NULL;
47 f->nlineinfo = 0; 45 f->sizelocvars = 0;
48 f->nlocvars = 0; 46 f->sizelineinfo = 0;
49 f->locvars = NULL; 47 f->locvars = NULL;
50 f->lineDefined = 0; 48 f->lineDefined = 0;
51 f->source = NULL; 49 f->source = NULL;
@@ -55,39 +53,19 @@ Proto *luaF_newproto (lua_State *L) {
55} 53}
56 54
57 55
58static size_t protosize (Proto *f) {
59 return sizeof(Proto)
60 + f->nknum*sizeof(lua_Number)
61 + f->nkstr*sizeof(TString *)
62 + f->nkproto*sizeof(Proto *)
63 + f->ncode*sizeof(Instruction)
64 + f->nlocvars*sizeof(struct LocVar)
65 + f->nlineinfo*sizeof(int);
66}
67
68
69void luaF_protook (lua_State *L, Proto *f, int pc) {
70 f->ncode = pc; /* signal that proto was properly created */
71 L->nblocks += protosize(f);
72}
73
74
75void luaF_freeproto (lua_State *L, Proto *f) { 56void luaF_freeproto (lua_State *L, Proto *f) {
76 if (f->ncode > 0) /* function was properly created? */ 57 luaM_freearray(L, f->code, f->sizecode, Instruction);
77 L->nblocks -= protosize(f); 58 luaM_freearray(L, f->locvars, f->sizelocvars, struct LocVar);
78 luaM_free(L, f->code); 59 luaM_freearray(L, f->kstr, f->sizekstr, TString *);
79 luaM_free(L, f->locvars); 60 luaM_freearray(L, f->knum, f->sizeknum, lua_Number);
80 luaM_free(L, f->kstr); 61 luaM_freearray(L, f->kproto, f->sizekproto, Proto *);
81 luaM_free(L, f->knum); 62 luaM_freearray(L, f->lineinfo, f->sizelineinfo, int);
82 luaM_free(L, f->kproto); 63 luaM_freelem(L, f, Proto);
83 luaM_free(L, f->lineinfo);
84 luaM_free(L, f);
85} 64}
86 65
87 66
88void luaF_freeclosure (lua_State *L, Closure *c) { 67void luaF_freeclosure (lua_State *L, Closure *c) {
89 L->nblocks -= sizeclosure(c->nupvalues); 68 luaM_free(L, c, sizeclosure(c->nupvalues));
90 luaM_free(L, c);
91} 69}
92 70
93 71
@@ -97,7 +75,7 @@ void luaF_freeclosure (lua_State *L, Closure *c) {
97*/ 75*/
98const char *luaF_getlocalname (const Proto *f, int local_number, int pc) { 76const char *luaF_getlocalname (const Proto *f, int local_number, int pc) {
99 int i; 77 int i;
100 for (i = 0; i<f->nlocvars && f->locvars[i].startpc <= pc; i++) { 78 for (i = 0; i<f->sizelocvars && f->locvars[i].startpc <= pc; i++) {
101 if (pc < f->locvars[i].endpc) { /* is variable active? */ 79 if (pc < f->locvars[i].endpc) { /* is variable active? */
102 local_number--; 80 local_number--;
103 if (local_number == 0) 81 if (local_number == 0)