gateway: simplify stopping the cleanup timer
[olsrd.git] / lib / tas / src / lua / lfunc.c
1
2 /*
3 ** $Id: lfunc.c,v 1.67 2003/03/18 12:50:04 roberto Exp $
4 ** Auxiliary functions to manipulate prototypes and closures
5 ** See Copyright Notice in lua.h
6 */
7
8
9 #include <stdlib.h>
10
11 #define lfunc_c
12
13 #include "lua.h"
14
15 #include "lfunc.h"
16 #include "lgc.h"
17 #include "lmem.h"
18 #include "lobject.h"
19 #include "lstate.h"
20
21
22 #define sizeCclosure(n) (cast(int, sizeof(CClosure)) + \
23                          cast(int, sizeof(TObject)*((n)-1)))
24
25 #define sizeLclosure(n) (cast(int, sizeof(LClosure)) + \
26                          cast(int, sizeof(TObject *)*((n)-1)))
27
28
29
30 Closure *
31 luaF_newCclosure(lua_State * L, int nelems)
32 {
33   Closure *c = cast(Closure *, luaM_malloc(L, sizeCclosure(nelems)));
34   luaC_link(L, valtogco(c), LUA_TFUNCTION);
35   c->c.isC = 1;
36   c->c.nupvalues = cast(lu_byte, nelems);
37   return c;
38 }
39
40
41 Closure *
42 luaF_newLclosure(lua_State * L, int nelems, TObject * e)
43 {
44   Closure *c = cast(Closure *, luaM_malloc(L, sizeLclosure(nelems)));
45   luaC_link(L, valtogco(c), LUA_TFUNCTION);
46   c->l.isC = 0;
47   c->l.g = *e;
48   c->l.nupvalues = cast(lu_byte, nelems);
49   return c;
50 }
51
52
53 UpVal *
54 luaF_findupval(lua_State * L, StkId level)
55 {
56   GCObject **pp = &L->openupval;
57   UpVal *p;
58   UpVal *v;
59   while ((p = ngcotouv(*pp)) != NULL && p->v >= level) {
60     if (p->v == level)
61       return p;
62     pp = &p->next;
63   }
64   v = luaM_new(L, UpVal);       /* not found: create a new one */
65   v->tt = LUA_TUPVAL;
66   v->marked = 1;                /* open upvalues should not be collected */
67   v->v = level;                 /* current value lives in the stack */
68   v->next = *pp;                /* chain it in the proper position */
69   *pp = valtogco(v);
70   return v;
71 }
72
73
74 void
75 luaF_close(lua_State * L, StkId level)
76 {
77   UpVal *p;
78   while ((p = ngcotouv(L->openupval)) != NULL && p->v >= level) {
79     setobj(&p->value, p->v);    /* save current value (write barrier) */
80     p->v = &p->value;           /* now current value lives here */
81     L->openupval = p->next;     /* remove from `open' list */
82     luaC_link(L, valtogco(p), LUA_TUPVAL);
83   }
84 }
85
86
87 Proto *
88 luaF_newproto(lua_State * L)
89 {
90   Proto *f = luaM_new(L, Proto);
91   luaC_link(L, valtogco(f), LUA_TPROTO);
92   f->k = NULL;
93   f->sizek = 0;
94   f->p = NULL;
95   f->sizep = 0;
96   f->code = NULL;
97   f->sizecode = 0;
98   f->sizelineinfo = 0;
99   f->sizeupvalues = 0;
100   f->nups = 0;
101   f->upvalues = NULL;
102   f->numparams = 0;
103   f->is_vararg = 0;
104   f->maxstacksize = 0;
105   f->lineinfo = NULL;
106   f->sizelocvars = 0;
107   f->locvars = NULL;
108   f->lineDefined = 0;
109   f->source = NULL;
110   return f;
111 }
112
113
114 void
115 luaF_freeproto(lua_State * L, Proto * f)
116 {
117   luaM_freearray(L, f->code, f->sizecode, Instruction);
118   luaM_freearray(L, f->p, f->sizep, Proto *);
119   luaM_freearray(L, f->k, f->sizek, TObject);
120   luaM_freearray(L, f->lineinfo, f->sizelineinfo, int);
121   luaM_freearray(L, f->locvars, f->sizelocvars, struct LocVar);
122   luaM_freearray(L, f->upvalues, f->sizeupvalues, TString *);
123   luaM_freelem(L, f);
124 }
125
126
127 void
128 luaF_freeclosure(lua_State * L, Closure * c)
129 {
130   int size = (c->c.isC) ? sizeCclosure(c->c.nupvalues) : sizeLclosure(c->l.nupvalues);
131   luaM_free(L, c, size);
132 }
133
134
135 /*
136 ** Look for n-th local variable at line `line' in function `func'.
137 ** Returns NULL if not found.
138 */
139 const char *
140 luaF_getlocalname(const Proto * f, int local_number, int pc)
141 {
142   int i;
143   for (i = 0; i < f->sizelocvars && f->locvars[i].startpc <= pc; i++) {
144     if (pc < f->locvars[i].endpc) {     /* is variable active? */
145       local_number--;
146       if (local_number == 0)
147         return getstr(f->locvars[i].varname);
148     }
149   }
150   return NULL;                  /* not found */
151 }