From ff08b0f4069e322ec4c2b02aa5553424227357ba Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Tue, 16 Sep 1997 16:25:59 -0300 Subject: Lua Function structures --- lfunc.c | 105 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 lfunc.c (limited to 'lfunc.c') diff --git a/lfunc.c b/lfunc.c new file mode 100644 index 00000000..c84ab973 --- /dev/null +++ b/lfunc.c @@ -0,0 +1,105 @@ +/* +** $Id: $ +** Lua Funcion auxiliar +** See Copyright Notice in lua.h +*/ + + +#include + +#include "lfunc.h" +#include "lmem.h" + + +TProtoFunc *luaF_root = NULL; +Closure *luaF_rootcl = NULL; + + +static void luaI_insertfunction (TProtoFunc *f) +{ + ++luaO_nentities; + f->head.next = (GCnode *)luaF_root; + luaF_root = f; + f->head.marked = 0; +} + + +Closure *luaF_newclosure (int nelems) +{ + Closure *c = (Closure *)luaM_malloc(sizeof(Closure)+nelems*sizeof(TObject)); + ++luaO_nentities; + c->head.next = (GCnode *)luaF_rootcl; + luaF_rootcl = c; + c->head.marked = 0; + return c; +} + + +TProtoFunc *luaF_newproto (void) +{ + TProtoFunc *f = luaM_new(TProtoFunc); + f->code = NULL; + f->lineDefined = 0; + f->fileName = NULL; + f->consts = NULL; + f->nconsts = 0; + f->nupvalues = 0; + f->locvars = NULL; + luaI_insertfunction(f); + return f; +} + + + +static void freefunc (TProtoFunc *f) +{ + luaM_free(f->code); + luaM_free(f->locvars); + luaM_free(f->consts); + luaM_free(f); +} + + +void luaF_freeproto (TProtoFunc *l) +{ + while (l) { + TProtoFunc *next = (TProtoFunc *)l->head.next; + freefunc(l); + l = next; + } +} + + +void luaF_freeclosure (Closure *l) +{ + while (l) { + Closure *next = (Closure *)l->head.next; + luaM_free(l); + l = next; + } +} + + +/* +** Look for n-esim local variable at line "line" in function "func". +** Returns NULL if not found. +*/ +char *luaF_getlocalname (TProtoFunc *func, int local_number, int line) +{ + int count = 0; + char *varname = NULL; + LocVar *lv = func->locvars; + if (lv == NULL) + return NULL; + for (; lv->line != -1 && lv->line < line; lv++) { + if (lv->varname) { /* register */ + if (++count == local_number) + varname = lv->varname->str; + } + else /* unregister */ + if (--count < local_number) + varname = NULL; + } + return varname; +} + -- cgit v1.2.3-55-g6feb