Details (mostly comments)

This commit is contained in:
Roberto Ierusalimschy 2019-10-22 14:08:22 -03:00
parent 6e1aec7a67
commit e592f94a64
4 changed files with 28 additions and 9 deletions

1
lgc.c
View File

@ -1565,6 +1565,7 @@ static void incstep (lua_State *L, global_State *g) {
*/ */
void luaC_step (lua_State *L) { void luaC_step (lua_State *L) {
global_State *g = G(L); global_State *g = G(L);
lua_assert(!g->gcemergency);
if (g->gcrunning) { /* running? */ if (g->gcrunning) { /* running? */
if(isdecGCmodegen(g)) if(isdecGCmodegen(g))
genstep(L, g); genstep(L, g);

View File

@ -17,11 +17,12 @@
/* /*
** Extra tags for non-values ** Extra tags for collectable non-values
*/ */
#define LUA_TUPVAL LUA_NUMTAGS /* upvalues */ #define LUA_TUPVAL LUA_NUMTAGS /* upvalues */
#define LUA_TPROTO (LUA_NUMTAGS+1) /* function prototypes */ #define LUA_TPROTO (LUA_NUMTAGS+1) /* function prototypes */
/* /*
** number of all possible tags (including LUA_TNONE) ** number of all possible tags (including LUA_TNONE)
*/ */
@ -30,7 +31,7 @@
/* /*
** tags for Tagged Values have the following use of bits: ** tags for Tagged Values have the following use of bits:
** bits 0-3: actual tag (a LUA_T* value) ** bits 0-3: actual tag (a LUA_T* constant)
** bits 4-5: variant bits ** bits 4-5: variant bits
** bit 6: whether value is collectable ** bit 6: whether value is collectable
*/ */
@ -86,24 +87,35 @@ typedef struct TValue {
/* Macros for internal tests */ /* Macros for internal tests */
/* collectable object has the same tag as the original value */
#define righttt(obj) (ttypetag(obj) == gcvalue(obj)->tt) #define righttt(obj) (ttypetag(obj) == gcvalue(obj)->tt)
/*
** Any value being manipulated by the program either is non
** collectable, or the collectable object has the right tag
** and it is not dead.
*/
#define checkliveness(L,obj) \ #define checkliveness(L,obj) \
((void)L, lua_longassert(!iscollectable(obj) || \ ((void)L, lua_longassert(!iscollectable(obj) || \
(righttt(obj) && (L == NULL || !isdead(G(L),gcvalue(obj)))))) (righttt(obj) && (L == NULL || !isdead(G(L),gcvalue(obj))))))
/* Macros to set values */ /* Macros to set values */
/* set a value's tag */
#define settt_(o,t) ((o)->tt_=(t)) #define settt_(o,t) ((o)->tt_=(t))
/* main macro to copy values (from 'obj1' to 'obj2') */
#define setobj(L,obj1,obj2) \ #define setobj(L,obj1,obj2) \
{ TValue *io1=(obj1); const TValue *io2=(obj2); \ { TValue *io1=(obj1); const TValue *io2=(obj2); \
io1->value_ = io2->value_; io1->tt_ = io2->tt_; \ io1->value_ = io2->value_; settt_(io1, io2->tt_); \
checkliveness(L,io1); lua_assert(!isreallyempty(io1)); } checkliveness(L,io1); lua_assert(!isnonstrictnil(io1)); }
/* /*
** different types of assignments, according to destination ** Different types of assignments, according to source and destination.
** (They are mostly equal now, but may be different in the future.)
*/ */
/* from stack to stack */ /* from stack to stack */
@ -118,13 +130,16 @@ typedef struct TValue {
#define setobj2t setobj #define setobj2t setobj
/*
** Entries in the Lua stack
*/
typedef union StackValue { typedef union StackValue {
TValue val; TValue val;
} StackValue; } StackValue;
typedef StackValue *StkId; /* index to stack elements */ /* index to stack elements */
typedef StackValue *StkId;
/* convert a 'StackValue' to a 'TValue' */ /* convert a 'StackValue' to a 'TValue' */
#define s2v(o) (&(o)->val) #define s2v(o) (&(o)->val)
@ -166,7 +181,7 @@ typedef StackValue *StkId; /* index to stack elements */
/* /*
** macro to detect non-standard nils (used only in assertions) ** macro to detect non-standard nils (used only in assertions)
*/ */
#define isreallyempty(v) (ttisnil(v) && !ttisstrictnil(v)) #define isnonstrictnil(v) (ttisnil(v) && !ttisstrictnil(v))
/* /*

View File

@ -155,6 +155,9 @@ static Node *mainposition (const Table *t, int ktt, const Value *kvl) {
} }
/*
** Returns the main position of an element given as a 'TValue'
*/
static Node *mainpositionTV (const Table *t, const TValue *key) { static Node *mainpositionTV (const Table *t, const TValue *key) {
return mainposition(t, rawtt(key), valraw(key)); return mainposition(t, rawtt(key), valraw(key));
} }

View File

@ -80,7 +80,7 @@ static int tpanic (lua_State *L) {
/* /*
** Warning function for tests. Fist, it concatenates all parts of ** Warning function for tests. First, it concatenates all parts of
** a warning in buffer 'buff'. Then, it has three modes: ** a warning in buffer 'buff'. Then, it has three modes:
** - 0.normal: messages starting with '#' are shown on standard output; ** - 0.normal: messages starting with '#' are shown on standard output;
** - other messages abort the tests (they represent real warning ** - other messages abort the tests (they represent real warning