mirror of https://github.com/rusefi/lua.git
added check for conversion 'obj2gco' (and corrections for small
problems detected by this check)
This commit is contained in:
parent
9aec500a26
commit
56137d58ff
6
lapi.c
6
lapi.c
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
** $Id: lapi.c,v 2.225 2014/07/15 21:26:50 roberto Exp roberto $
|
** $Id: lapi.c,v 2.226 2014/07/17 13:53:37 roberto Exp roberto $
|
||||||
** Lua API
|
** Lua API
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -820,7 +820,7 @@ LUA_API int lua_setmetatable (lua_State *L, int objindex) {
|
||||||
case LUA_TUSERDATA: {
|
case LUA_TUSERDATA: {
|
||||||
uvalue(obj)->metatable = mt;
|
uvalue(obj)->metatable = mt;
|
||||||
if (mt) {
|
if (mt) {
|
||||||
luaC_objbarrier(L, rawuvalue(obj), mt);
|
luaC_objbarrier(L, uvalue(obj), mt);
|
||||||
luaC_checkfinalizer(L, gcvalue(obj), mt);
|
luaC_checkfinalizer(L, gcvalue(obj), mt);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -958,7 +958,7 @@ LUA_API int lua_load (lua_State *L, lua_Reader reader, void *data,
|
||||||
const TValue *gt = luaH_getint(reg, LUA_RIDX_GLOBALS);
|
const TValue *gt = luaH_getint(reg, LUA_RIDX_GLOBALS);
|
||||||
/* set global table as 1st upvalue of 'f' (may be LUA_ENV) */
|
/* set global table as 1st upvalue of 'f' (may be LUA_ENV) */
|
||||||
setobj(L, f->upvals[0]->v, gt);
|
setobj(L, f->upvals[0]->v, gt);
|
||||||
luaC_barrier(L, f->upvals[0], gt);
|
luaC_upvalbarrier(L, f->upvals[0]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
lua_unlock(L);
|
lua_unlock(L);
|
||||||
|
|
13
lgc.c
13
lgc.c
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
** $Id: lgc.c,v 2.184 2014/06/30 19:48:08 roberto Exp roberto $
|
** $Id: lgc.c,v 2.185 2014/07/17 17:27:49 roberto Exp roberto $
|
||||||
** Garbage Collector
|
** Garbage Collector
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -83,6 +83,9 @@
|
||||||
#define markobject(g,t) \
|
#define markobject(g,t) \
|
||||||
{ if ((t) && iswhite(obj2gco(t))) reallymarkobject(g, obj2gco(t)); }
|
{ if ((t) && iswhite(obj2gco(t))) reallymarkobject(g, obj2gco(t)); }
|
||||||
|
|
||||||
|
#define markstring(g,t) \
|
||||||
|
{ if ((t) && iswhite(ts2gco(t))) reallymarkobject(g, ts2gco(t)); }
|
||||||
|
|
||||||
static void reallymarkobject (global_State *g, GCObject *o);
|
static void reallymarkobject (global_State *g, GCObject *o);
|
||||||
|
|
||||||
|
|
||||||
|
@ -126,7 +129,7 @@ static void removeentry (Node *n) {
|
||||||
static int iscleared (global_State *g, const TValue *o) {
|
static int iscleared (global_State *g, const TValue *o) {
|
||||||
if (!iscollectable(o)) return 0;
|
if (!iscollectable(o)) return 0;
|
||||||
else if (ttisstring(o)) {
|
else if (ttisstring(o)) {
|
||||||
markobject(g, rawtsvalue(o)); /* strings are `values', so are never weak */
|
markobject(g, tsvalue(o)); /* strings are `values', so are never weak */
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
else return iswhite(gcvalue(o));
|
else return iswhite(gcvalue(o));
|
||||||
|
@ -448,15 +451,15 @@ static int traverseproto (global_State *g, Proto *f) {
|
||||||
int i;
|
int i;
|
||||||
if (f->cache && iswhite(obj2gco(f->cache)))
|
if (f->cache && iswhite(obj2gco(f->cache)))
|
||||||
f->cache = NULL; /* allow cache to be collected */
|
f->cache = NULL; /* allow cache to be collected */
|
||||||
markobject(g, f->source);
|
markstring(g, f->source);
|
||||||
for (i = 0; i < f->sizek; i++) /* mark literals */
|
for (i = 0; i < f->sizek; i++) /* mark literals */
|
||||||
markvalue(g, &f->k[i]);
|
markvalue(g, &f->k[i]);
|
||||||
for (i = 0; i < f->sizeupvalues; i++) /* mark upvalue names */
|
for (i = 0; i < f->sizeupvalues; i++) /* mark upvalue names */
|
||||||
markobject(g, f->upvalues[i].name);
|
markstring(g, f->upvalues[i].name);
|
||||||
for (i = 0; i < f->sizep; i++) /* mark nested protos */
|
for (i = 0; i < f->sizep; i++) /* mark nested protos */
|
||||||
markobject(g, f->p[i]);
|
markobject(g, f->p[i]);
|
||||||
for (i = 0; i < f->sizelocvars; i++) /* mark local-variable names */
|
for (i = 0; i < f->sizelocvars; i++) /* mark local-variable names */
|
||||||
markobject(g, f->locvars[i].varname);
|
markstring(g, f->locvars[i].varname);
|
||||||
return sizeof(Proto) + sizeof(Instruction) * f->sizecode +
|
return sizeof(Proto) + sizeof(Instruction) * f->sizecode +
|
||||||
sizeof(Proto *) * f->sizep +
|
sizeof(Proto *) * f->sizep +
|
||||||
sizeof(TValue) * f->sizek +
|
sizeof(TValue) * f->sizek +
|
||||||
|
|
6
llex.c
6
llex.c
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
** $Id: llex.c,v 2.77 2014/05/11 14:45:43 roberto Exp roberto $
|
** $Id: llex.c,v 2.78 2014/05/21 15:22:02 roberto Exp roberto $
|
||||||
** Lexical Analyzer
|
** Lexical Analyzer
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -67,10 +67,10 @@ static void save (LexState *ls, int c) {
|
||||||
void luaX_init (lua_State *L) {
|
void luaX_init (lua_State *L) {
|
||||||
int i;
|
int i;
|
||||||
TString *e = luaS_new(L, LUA_ENV); /* create env name */
|
TString *e = luaS_new(L, LUA_ENV); /* create env name */
|
||||||
luaC_fix(L, obj2gco(e)); /* never collect this name */
|
luaC_fix(L, ts2gco(e)); /* never collect this name */
|
||||||
for (i=0; i<NUM_RESERVED; i++) {
|
for (i=0; i<NUM_RESERVED; i++) {
|
||||||
TString *ts = luaS_new(L, luaX_tokens[i]);
|
TString *ts = luaS_new(L, luaX_tokens[i]);
|
||||||
luaC_fix(L, obj2gco(ts)); /* reserved words are never collected */
|
luaC_fix(L, ts2gco(ts)); /* reserved words are never collected */
|
||||||
ts->tsv.extra = cast_byte(i+1); /* reserved word */
|
ts->tsv.extra = cast_byte(i+1); /* reserved word */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
** $Id: lobject.h,v 2.95 2014/07/17 17:09:50 roberto Exp roberto $
|
** $Id: lobject.h,v 2.96 2014/07/17 17:27:49 roberto Exp roberto $
|
||||||
** Type definitions for Lua objects
|
** Type definitions for Lua objects
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -210,12 +210,12 @@ typedef struct lua_TValue TValue;
|
||||||
|
|
||||||
#define setsvalue(L,obj,x) \
|
#define setsvalue(L,obj,x) \
|
||||||
{ TValue *io = (obj); TString *x_ = (x); \
|
{ TValue *io = (obj); TString *x_ = (x); \
|
||||||
val_(io).gc = obj2gco(x_); settt_(io, ctb(x_->tsv.tt)); \
|
val_(io).gc = obj2gco(&x_->tsv); settt_(io, ctb(x_->tsv.tt)); \
|
||||||
checkliveness(G(L),io); }
|
checkliveness(G(L),io); }
|
||||||
|
|
||||||
#define setuvalue(L,obj,x) \
|
#define setuvalue(L,obj,x) \
|
||||||
{ TValue *io = (obj); Udata *x_ = (x); \
|
{ TValue *io = (obj); Udata *x_ = (x); \
|
||||||
val_(io).gc = obj2gco(x_); settt_(io, ctb(LUA_TUSERDATA)); \
|
val_(io).gc = obj2gco(&x_->uv); settt_(io, ctb(LUA_TUSERDATA)); \
|
||||||
checkliveness(G(L),io); }
|
checkliveness(G(L),io); }
|
||||||
|
|
||||||
#define setthvalue(L,obj,x) \
|
#define setthvalue(L,obj,x) \
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
** $Id: lparser.c,v 2.138 2013/12/30 20:47:58 roberto Exp roberto $
|
** $Id: lparser.c,v 2.139 2014/06/19 18:27:20 roberto Exp roberto $
|
||||||
** Lua Parser
|
** Lua Parser
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -164,7 +164,7 @@ static int registerlocalvar (LexState *ls, TString *varname) {
|
||||||
LocVar, SHRT_MAX, "local variables");
|
LocVar, SHRT_MAX, "local variables");
|
||||||
while (oldsize < f->sizelocvars) f->locvars[oldsize++].varname = NULL;
|
while (oldsize < f->sizelocvars) f->locvars[oldsize++].varname = NULL;
|
||||||
f->locvars[fs->nlocvars].varname = varname;
|
f->locvars[fs->nlocvars].varname = varname;
|
||||||
luaC_objbarrier(ls->L, f, varname);
|
luaC_objbarrier(ls->L, f, ts2gco(varname));
|
||||||
return fs->nlocvars++;
|
return fs->nlocvars++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -232,7 +232,7 @@ static int newupvalue (FuncState *fs, TString *name, expdesc *v) {
|
||||||
f->upvalues[fs->nups].instack = (v->k == VLOCAL);
|
f->upvalues[fs->nups].instack = (v->k == VLOCAL);
|
||||||
f->upvalues[fs->nups].idx = cast_byte(v->u.info);
|
f->upvalues[fs->nups].idx = cast_byte(v->u.info);
|
||||||
f->upvalues[fs->nups].name = name;
|
f->upvalues[fs->nups].name = name;
|
||||||
luaC_objbarrier(fs->ls->L, f, name);
|
luaC_objbarrier(fs->ls->L, f, ts2gco(name));
|
||||||
return fs->nups++;
|
return fs->nups++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1630,7 +1630,7 @@ LClosure *luaY_parser (lua_State *L, ZIO *z, Mbuffer *buff,
|
||||||
incr_top(L);
|
incr_top(L);
|
||||||
funcstate.f = cl->p = luaF_newproto(L);
|
funcstate.f = cl->p = luaF_newproto(L);
|
||||||
funcstate.f->source = luaS_new(L, name); /* create and anchor TString */
|
funcstate.f->source = luaS_new(L, name); /* create and anchor TString */
|
||||||
luaC_objbarrier(L, funcstate.f, funcstate.f->source);
|
luaC_objbarrier(L, funcstate.f, ts2gco(funcstate.f->source));
|
||||||
lexstate.buff = buff;
|
lexstate.buff = buff;
|
||||||
lexstate.dyd = dyd;
|
lexstate.dyd = dyd;
|
||||||
dyd->actvar.n = dyd->gt.n = dyd->label.n = 0;
|
dyd->actvar.n = dyd->gt.n = dyd->label.n = 0;
|
||||||
|
|
4
lstate.c
4
lstate.c
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
** $Id: lstate.c,v 2.120 2014/02/18 13:39:37 roberto Exp roberto $
|
** $Id: lstate.c,v 2.121 2014/02/18 13:46:26 roberto Exp roberto $
|
||||||
** Global State
|
** Global State
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -206,7 +206,7 @@ static void f_luaopen (lua_State *L, void *ud) {
|
||||||
luaX_init(L);
|
luaX_init(L);
|
||||||
/* pre-create memory-error message */
|
/* pre-create memory-error message */
|
||||||
g->memerrmsg = luaS_newliteral(L, MEMERRMSG);
|
g->memerrmsg = luaS_newliteral(L, MEMERRMSG);
|
||||||
luaC_fix(L, obj2gco(g->memerrmsg)); /* it should never be collected */
|
luaC_fix(L, ts2gco(g->memerrmsg)); /* it should never be collected */
|
||||||
g->gcrunning = 1; /* allow gc */
|
g->gcrunning = 1; /* allow gc */
|
||||||
g->version = lua_version(NULL);
|
g->version = lua_version(NULL);
|
||||||
luai_userstateopen(L);
|
luai_userstateopen(L);
|
||||||
|
|
16
lstate.h
16
lstate.h
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
** $Id: lstate.h,v 2.109 2014/07/17 17:09:50 roberto Exp roberto $
|
** $Id: lstate.h,v 2.110 2014/07/17 17:27:49 roberto Exp roberto $
|
||||||
** Global State
|
** Global State
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -170,7 +170,7 @@ struct lua_State {
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Union of all collectable objects
|
** Union of all collectable objects (only for conversions)
|
||||||
*/
|
*/
|
||||||
union GCUnion {
|
union GCUnion {
|
||||||
GCObject gc; /* common header */
|
GCObject gc; /* common header */
|
||||||
|
@ -200,8 +200,16 @@ union GCUnion {
|
||||||
#define gco2th(o) check_exp((o)->tt == LUA_TTHREAD, &((cast_u(o))->th))
|
#define gco2th(o) check_exp((o)->tt == LUA_TTHREAD, &((cast_u(o))->th))
|
||||||
|
|
||||||
|
|
||||||
/* macro to convert any Lua object into a GCObject */
|
/* macro to convert a Lua object into a GCObject */
|
||||||
#define obj2gco(v) (&(cast_u(v)->gc))
|
#define obj2gco(v) \
|
||||||
|
check_exp(novariant((v)->tt) < LUA_TDEADKEY, (&(cast_u(v)->gc)))
|
||||||
|
|
||||||
|
/*
|
||||||
|
** macro to convert a TString into a GCObject.
|
||||||
|
** (TString is a union, and therefore needs an access slightly different
|
||||||
|
** from the other objects.)
|
||||||
|
*/
|
||||||
|
#define ts2gco(v) (obj2gco(&(v)->tsv))
|
||||||
|
|
||||||
|
|
||||||
/* actual number of total bytes allocated */
|
/* actual number of total bytes allocated */
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
** $Id: lstring.c,v 2.39 2014/04/02 16:44:42 roberto Exp roberto $
|
** $Id: lstring.c,v 2.40 2014/06/18 22:59:29 roberto Exp roberto $
|
||||||
** String table (keeps all strings handled by Lua)
|
** String table (keeps all strings handled by Lua)
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -126,8 +126,8 @@ static TString *internshrstr (lua_State *L, const char *str, size_t l) {
|
||||||
if (l == ts->tsv.len &&
|
if (l == ts->tsv.len &&
|
||||||
(memcmp(str, getstr(ts), l * sizeof(char)) == 0)) {
|
(memcmp(str, getstr(ts), l * sizeof(char)) == 0)) {
|
||||||
/* found! */
|
/* found! */
|
||||||
if (isdead(g, obj2gco(ts))) /* dead (but not collected yet)? */
|
if (isdead(g, ts2gco(ts))) /* dead (but not collected yet)? */
|
||||||
changewhite(obj2gco(ts)); /* resurrect it */
|
changewhite(ts2gco(ts)); /* resurrect it */
|
||||||
return ts;
|
return ts;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
21
ltests.c
21
ltests.c
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
** $Id: ltests.c,v 2.176 2014/07/17 13:53:37 roberto Exp roberto $
|
** $Id: ltests.c,v 2.177 2014/07/17 17:27:49 roberto Exp roberto $
|
||||||
** Internal Module for Debugging of the Lua Implementation
|
** Internal Module for Debugging of the Lua Implementation
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -207,10 +207,11 @@ static int testobjref (global_State *g, GCObject *f, GCObject *t) {
|
||||||
return r1;
|
return r1;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define checkobjref(g,f,t) checkobjref_(g,f,obj2gco(t))
|
#define checkobjref(g,f,t) \
|
||||||
static void checkobjref_ (global_State *g, GCObject *f, GCObject *t) {
|
{ if (t) lua_longassert(testobjref(g,f,obj2gco(t))); }
|
||||||
lua_assert((t) == NULL || testobjref(g,f,obj2gco(t)));
|
|
||||||
}
|
#define checkstrref(g,f,t) \
|
||||||
|
{ if (t) lua_longassert(testobjref(g,f,ts2gco(t))); }
|
||||||
|
|
||||||
|
|
||||||
static void checkvalref (global_State *g, GCObject *f, const TValue *t) {
|
static void checkvalref (global_State *g, GCObject *f, const TValue *t) {
|
||||||
|
@ -244,17 +245,17 @@ static void checkproto (global_State *g, Proto *f) {
|
||||||
int i;
|
int i;
|
||||||
GCObject *fgc = obj2gco(f);
|
GCObject *fgc = obj2gco(f);
|
||||||
checkobjref(g, fgc, f->cache);
|
checkobjref(g, fgc, f->cache);
|
||||||
checkobjref(g, fgc, f->source);
|
checkstrref(g, fgc, f->source);
|
||||||
for (i=0; i<f->sizek; i++) {
|
for (i=0; i<f->sizek; i++) {
|
||||||
if (ttisstring(f->k+i))
|
if (ttisstring(f->k + i))
|
||||||
checkobjref(g, fgc, rawtsvalue(f->k+i));
|
checkobjref(g, fgc, tsvalue(f->k + i));
|
||||||
}
|
}
|
||||||
for (i=0; i<f->sizeupvalues; i++)
|
for (i=0; i<f->sizeupvalues; i++)
|
||||||
checkobjref(g, fgc, f->upvalues[i].name);
|
checkstrref(g, fgc, f->upvalues[i].name);
|
||||||
for (i=0; i<f->sizep; i++)
|
for (i=0; i<f->sizep; i++)
|
||||||
checkobjref(g, fgc, f->p[i]);
|
checkobjref(g, fgc, f->p[i]);
|
||||||
for (i=0; i<f->sizelocvars; i++)
|
for (i=0; i<f->sizelocvars; i++)
|
||||||
checkobjref(g, fgc, f->locvars[i].varname);
|
checkstrref(g, fgc, f->locvars[i].varname);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
4
ltm.c
4
ltm.c
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
** $Id: ltm.c,v 2.26 2014/04/11 20:17:39 roberto Exp roberto $
|
** $Id: ltm.c,v 2.27 2014/06/10 18:53:18 roberto Exp roberto $
|
||||||
** Tag methods
|
** Tag methods
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -45,7 +45,7 @@ void luaT_init (lua_State *L) {
|
||||||
int i;
|
int i;
|
||||||
for (i=0; i<TM_N; i++) {
|
for (i=0; i<TM_N; i++) {
|
||||||
G(L)->tmname[i] = luaS_new(L, luaT_eventname[i]);
|
G(L)->tmname[i] = luaS_new(L, luaT_eventname[i]);
|
||||||
luaC_fix(L, obj2gco(G(L)->tmname[i])); /* never collect these names */
|
luaC_fix(L, ts2gco(G(L)->tmname[i])); /* never collect these names */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue