1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- /*
- ** $Id: lfunc.c,v 1.44 2001/06/05 18:17:01 roberto Exp roberto $
- ** Auxiliary functions to manipulate prototypes and closures
- ** See Copyright Notice in lua.h
- */
- #include <stdlib.h>
- #define LUA_PRIVATE
- #include "lua.h"
- #include "lfunc.h"
- #include "lmem.h"
- #include "lstate.h"
- #define sizeclosure(n) ((int)sizeof(Closure) + (int)sizeof(TObject)*((n)-1))
- Closure *luaF_newclosure (lua_State *L, int nelems) {
- Closure *c = (Closure *)luaM_malloc(L, sizeclosure(nelems));
- c->next = G(L)->rootcl;
- G(L)->rootcl = c;
- c->mark = c;
- c->nupvalues = nelems;
- return c;
- }
- Proto *luaF_newproto (lua_State *L) {
- Proto *f = luaM_new(L, Proto);
- f->k = NULL;
- f->sizek = 0;
- f->p = NULL;
- f->sizep = 0;
- f->code = NULL;
- f->sizecode = 0;
- f->nupvalues = 0;
- f->numparams = 0;
- f->is_vararg = 0;
- f->maxstacksize = 0;
- f->marked = 0;
- f->lineinfo = NULL;
- f->sizelocvars = 0;
- f->sizelineinfo = 0;
- f->locvars = NULL;
- f->lineDefined = 0;
- f->source = NULL;
- f->next = G(L)->rootproto; /* chain in list of protos */
- G(L)->rootproto = f;
- return f;
- }
- void luaF_freeproto (lua_State *L, Proto *f) {
- luaM_freearray(L, f->code, f->sizecode, Instruction);
- luaM_freearray(L, f->locvars, f->sizelocvars, struct LocVar);
- luaM_freearray(L, f->k, f->sizek, TObject);
- luaM_freearray(L, f->p, f->sizep, Proto *);
- luaM_freearray(L, f->lineinfo, f->sizelineinfo, int);
- luaM_freelem(L, f, Proto);
- }
- void luaF_freeclosure (lua_State *L, Closure *c) {
- luaM_free(L, c, sizeclosure(c->nupvalues));
- }
- /*
- ** Look for n-th local variable at line `line' in function `func'.
- ** Returns NULL if not found.
- */
- const l_char *luaF_getlocalname (const Proto *f, int local_number, int pc) {
- int i;
- for (i = 0; i<f->sizelocvars && f->locvars[i].startpc <= pc; i++) {
- if (pc < f->locvars[i].endpc) { /* is variable active? */
- local_number--;
- if (local_number == 0)
- return getstr(f->locvars[i].varname);
- }
- }
- return NULL; /* not found */
- }
|