Lua 5.1.4: lfunc.c
L0001
L0006
L0007
L0008 #include <stddef.h>
L0009
L0010 #define lfunc_c
L0011 #define LUA_CORE
L0012
L0013 #include "lua.h"
L0014
L0015 #include "lfunc.h"
L0016 #include "lgc.h"
L0017 #include "lmem.h"
L0018 #include "lobject.h"
L0019 #include "lstate.h"
L0020
L0021
L0022
L0023 Closure *luaF_newCclosure (lua_State *L, int nelems, Table *e) {
L0024 Closure *c = cast(Closure *, luaM_malloc(L, sizeCclosure(nelems)));
L0025 luaC_link(L, obj2gco(c), LUA_TFUNCTION);
L0026 c->c.isC = 1;
L0027 c->c.env = e;
L0028 c->c.nupvalues = cast_byte(nelems);
L0029 return c;
L0030 }
L0031
L0032
L0033 Closure *luaF_newLclosure (lua_State *L, int nelems, Table *e) {
L0034 Closure *c = cast(Closure *, luaM_malloc(L, sizeLclosure(nelems)));
L0035 luaC_link(L, obj2gco(c), LUA_TFUNCTION);
L0036 c->l.isC = 0;
L0037 c->l.env = e;
L0038 c->l.nupvalues = cast_byte(nelems);
L0039 while (nelems--) c->l.upvals[nelems] = NULL;
L0040 return c;
L0041 }
L0042
L0043
L0044 UpVal *luaF_newupval (lua_State *L) {
L0045 UpVal *uv = luaM_new(L, UpVal);
L0046 luaC_link(L, obj2gco(uv), LUA_TUPVAL);
L0047 uv->v = &uv->u.value;
L0048 setnilvalue(uv->v);
L0049 return uv;
L0050 }
L0051
L0052
L0053 UpVal *luaF_findupval (lua_State *L, StkId level) {
L0054 global_State *g = G(L);
L0055 GCObject **pp = &L->openupval;
L0056 UpVal *p;
L0057 UpVal *uv;
L0058 while (*pp != NULL && (p = ngcotouv(*pp))->v >= level) {
L0059 lua_assert(p->v != &p->u.value);
L0060 if (p->v == level) {
L0061 if (isdead(g, obj2gco(p)))
L0062 changewhite(obj2gco(p));
L0063 return p;
L0064 }
L0065 pp = &p->next;
L0066 }
L0067 uv = luaM_new(L, UpVal);
L0068 uv->tt = LUA_TUPVAL;
L0069 uv->marked = luaC_white(g);
L0070 uv->v = level;
L0071 uv->next = *pp;
L0072 *pp = obj2gco(uv);
L0073 uv->u.l.prev = &g->uvhead;
L0074 uv->u.l.next = g->uvhead.u.l.next;
L0075 uv->u.l.next->u.l.prev = uv;
L0076 g->uvhead.u.l.next = uv;
L0077 lua_assert(uv->u.l.next->u.l.prev == uv && uv->u.l.prev->u.l.next == uv);
L0078 return uv;
L0079 }
L0080
L0081
L0082 static void unlinkupval (UpVal *uv) {
L0083 lua_assert(uv->u.l.next->u.l.prev == uv && uv->u.l.prev->u.l.next == uv);
L0084 uv->u.l.next->u.l.prev = uv->u.l.prev;
L0085 uv->u.l.prev->u.l.next = uv->u.l.next;
L0086 }
L0087
L0088
L0089 void luaF_freeupval (lua_State *L, UpVal *uv) {
L0090 if (uv->v != &uv->u.value)
L0091 unlinkupval(uv);
L0092 luaM_free(L, uv);
L0093 }
L0094
L0095
L0096 void luaF_close (lua_State *L, StkId level) {
L0097 UpVal *uv;
L0098 global_State *g = G(L);
L0099 while (L->openupval != NULL && (uv = ngcotouv(L->openupval))->v >= level) {
L0100 GCObject *o = obj2gco(uv);
L0101 lua_assert(!isblack(o) && uv->v != &uv->u.value);
L0102 L->openupval = uv->next;
L0103 if (isdead(g, o))
L0104 luaF_freeupval(L, uv);
L0105 else {
L0106 unlinkupval(uv);
L0107 setobj(L, &uv->u.value, uv->v);
L0108 uv->v = &uv->u.value;
L0109 luaC_linkupval(L, uv);
L0110 }
L0111 }
L0112 }
L0113
L0114
L0115 Proto *luaF_newproto (lua_State *L) {
L0116 Proto *f = luaM_new(L, Proto);
L0117 luaC_link(L, obj2gco(f), LUA_TPROTO);
L0118 f->k = NULL;
L0119 f->sizek = 0;
L0120 f->p = NULL;
L0121 f->sizep = 0;
L0122 f->code = NULL;
L0123 f->sizecode = 0;
L0124 f->sizelineinfo = 0;
L0125 f->sizeupvalues = 0;
L0126 f->nups = 0;
L0127 f->upvalues = NULL;
L0128 f->numparams = 0;
L0129 f->is_vararg = 0;
L0130 f->maxstacksize = 0;
L0131 f->lineinfo = NULL;
L0132 f->sizelocvars = 0;
L0133 f->locvars = NULL;
L0134 f->linedefined = 0;
L0135 f->lastlinedefined = 0;
L0136 f->source = NULL;
L0137 return f;
L0138 }
L0139
L0140
L0141 void luaF_freeproto (lua_State *L, Proto *f) {
L0142 luaM_freearray(L, f->code, f->sizecode, Instruction);
L0143 luaM_freearray(L, f->p, f->sizep, Proto *);
L0144 luaM_freearray(L, f->k, f->sizek, TValue);
L0145 luaM_freearray(L, f->lineinfo, f->sizelineinfo, int);
L0146 luaM_freearray(L, f->locvars, f->sizelocvars, struct LocVar);
L0147 luaM_freearray(L, f->upvalues, f->sizeupvalues, TString *);
L0148 luaM_free(L, f);
L0149 }
L0150
L0151
L0152 void luaF_freeclosure (lua_State *L, Closure *c) {
L0153 int size = (c->c.isC) ? sizeCclosure(c->c.nupvalues) :
L0154 sizeLclosure(c->l.nupvalues);
L0155 luaM_freemem(L, c, size);
L0156 }
L0157
L0158
L0159
L0163 const char *luaF_getlocalname (const Proto *f, int local_number, int pc) {
L0164 int i;
L0165 for (i = 0; i<f->sizelocvars && f->locvars[i].startpc <= pc; i++) {
L0166 if (pc < f->locvars[i].endpc) {
L0167 local_number--;
L0168 if (local_number == 0)
L0169 return getstr(f->locvars[i].varname);
L0170 }
L0171 }
L0172 return NULL;
L0173 }
L0174
Generated by pretty.lua