summaryrefslogtreecommitdiff
path: root/src/lfunc.c
diff options
context:
space:
mode:
authorLua Team <team@lua.org>1998-07-11 12:00:00 +0000
committerrepogen <>1998-07-11 12:00:00 +0000
commit377347776f1f3d820f92151f70bec667f96d5e6b (patch)
treecdb3ba26158df33547dfe765547177afcee119d1 /src/lfunc.c
parent4f8c5d0f284e1f4da717aea5008915f185cd2e05 (diff)
downloadlua-github-377347776f1f3d820f92151f70bec667f96d5e6b.tar.gz
Lua 3.13.1
Diffstat (limited to 'src/lfunc.c')
-rw-r--r--src/lfunc.c98
1 files changed, 98 insertions, 0 deletions
diff --git a/src/lfunc.c b/src/lfunc.c
new file mode 100644
index 00000000..fae59667
--- /dev/null
+++ b/src/lfunc.c
@@ -0,0 +1,98 @@
+/*
+** $Id: lfunc.c,v 1.9 1998/06/19 16:14:09 roberto Exp $
+** Auxiliary functions to manipulate prototypes and closures
+** See Copyright Notice in lua.h
+*/
+
+
+#include <stdlib.h>
+
+#include "lfunc.h"
+#include "lmem.h"
+#include "lstate.h"
+
+#define gcsizeproto(p) 5 /* approximate "weight" for a prototype */
+#define gcsizeclosure(c) 1 /* approximate "weight" for a closure */
+
+
+
+Closure *luaF_newclosure (int nelems)
+{
+ Closure *c = (Closure *)luaM_malloc(sizeof(Closure)+nelems*sizeof(TObject));
+ luaO_insertlist(&(L->rootcl), (GCnode *)c);
+ L->nblocks += gcsizeclosure(c);
+ c->nelems = nelems;
+ 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->locvars = NULL;
+ luaO_insertlist(&(L->rootproto), (GCnode *)f);
+ L->nblocks += gcsizeproto(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;
+ L->nblocks -= gcsizeproto(l);
+ freefunc(l);
+ l = next;
+ }
+}
+
+
+void luaF_freeclosure (Closure *l)
+{
+ while (l) {
+ Closure *next = (Closure *)l->head.next;
+ L->nblocks -= gcsizeclosure(l);
+ luaM_free(l);
+ l = next;
+ }
+}
+
+
+/*
+** Look for n-th 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;
+}
+