diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1997-07-30 19:00:50 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1997-07-30 19:00:50 -0300 |
| commit | 0892f0e5b75c51f1fee07276a3ba13301b83409e (patch) | |
| tree | 9f3b9ec92f26c05a85c826ffc5f803fda2f48867 /func.c | |
| parent | 1d7857bc635c0bfe7c5b1f325d31feb7660e9a5a (diff) | |
| download | lua-0892f0e5b75c51f1fee07276a3ba13301b83409e.tar.gz lua-0892f0e5b75c51f1fee07276a3ba13301b83409e.tar.bz2 lua-0892f0e5b75c51f1fee07276a3ba13301b83409e.zip | |
BIG CHANGE: functions have their own "constant table".
Diffstat (limited to '')
| -rw-r--r-- | func.c | 46 |
1 files changed, 31 insertions, 15 deletions
| @@ -11,6 +11,14 @@ | |||
| 11 | static TFunc *function_root = NULL; | 11 | static TFunc *function_root = NULL; |
| 12 | 12 | ||
| 13 | 13 | ||
| 14 | static void luaI_insertfunction (TFunc *f) | ||
| 15 | { | ||
| 16 | lua_pack(); | ||
| 17 | f->next = function_root; | ||
| 18 | function_root = f; | ||
| 19 | f->marked = 0; | ||
| 20 | } | ||
| 21 | |||
| 14 | /* | 22 | /* |
| 15 | ** Initialize TFunc struct | 23 | ** Initialize TFunc struct |
| 16 | */ | 24 | */ |
| @@ -21,29 +29,23 @@ void luaI_initTFunc (TFunc *f) | |||
| 21 | f->code = NULL; | 29 | f->code = NULL; |
| 22 | f->lineDefined = 0; | 30 | f->lineDefined = 0; |
| 23 | f->fileName = lua_parsedfile; | 31 | f->fileName = lua_parsedfile; |
| 32 | f->consts = NULL; | ||
| 33 | f->nconsts = 0; | ||
| 24 | f->locvars = NULL; | 34 | f->locvars = NULL; |
| 35 | luaI_insertfunction(f); | ||
| 25 | } | 36 | } |
| 26 | 37 | ||
| 27 | /* | ||
| 28 | ** Insert function in list for GC | ||
| 29 | */ | ||
| 30 | void luaI_insertfunction (TFunc *f) | ||
| 31 | { | ||
| 32 | lua_pack(); | ||
| 33 | f->next = function_root; | ||
| 34 | function_root = f; | ||
| 35 | f->marked = 0; | ||
| 36 | } | ||
| 37 | 38 | ||
| 38 | 39 | ||
| 39 | /* | 40 | /* |
| 40 | ** Free function | 41 | ** Free function |
| 41 | */ | 42 | */ |
| 42 | void luaI_freefunc (TFunc *f) | 43 | static void luaI_freefunc (TFunc *f) |
| 43 | { | 44 | { |
| 44 | luaI_free (f->code); | 45 | luaI_free(f->code); |
| 45 | luaI_free (f->locvars); | 46 | luaI_free(f->locvars); |
| 46 | luaI_free (f); | 47 | luaI_free(f->consts); |
| 48 | luaI_free(f); | ||
| 47 | } | 49 | } |
| 48 | 50 | ||
| 49 | 51 | ||
| @@ -56,6 +58,20 @@ void luaI_funcfree (TFunc *l) | |||
| 56 | } | 58 | } |
| 57 | } | 59 | } |
| 58 | 60 | ||
| 61 | |||
| 62 | void luaI_funcmark (TFunc *f) | ||
| 63 | { | ||
| 64 | f->marked = 1; | ||
| 65 | if (!f->fileName->marked) | ||
| 66 | f->fileName->marked = 1; | ||
| 67 | if (f->consts) { | ||
| 68 | int i; | ||
| 69 | for (i=0; i<f->nconsts; i++) | ||
| 70 | lua_markobject(&f->consts[i]); | ||
| 71 | } | ||
| 72 | } | ||
| 73 | |||
| 74 | |||
| 59 | /* | 75 | /* |
| 60 | ** Garbage collection function. | 76 | ** Garbage collection function. |
| 61 | */ | 77 | */ |
| @@ -92,7 +108,7 @@ void lua_funcinfo (lua_Object func, char **filename, int *linedefined) | |||
| 92 | TObject *f = luaI_Address(func); | 108 | TObject *f = luaI_Address(func); |
| 93 | if (f->ttype == LUA_T_MARK || f->ttype == LUA_T_FUNCTION) | 109 | if (f->ttype == LUA_T_MARK || f->ttype == LUA_T_FUNCTION) |
| 94 | { | 110 | { |
| 95 | *filename = f->value.tf->fileName; | 111 | *filename = f->value.tf->fileName->str; |
| 96 | *linedefined = f->value.tf->lineDefined; | 112 | *linedefined = f->value.tf->lineDefined; |
| 97 | } | 113 | } |
| 98 | else if (f->ttype == LUA_T_CMARK || f->ttype == LUA_T_CFUNCTION) | 114 | else if (f->ttype == LUA_T_CMARK || f->ttype == LUA_T_CFUNCTION) |
