'nresults' moved into 'callstatus'

That gives us more free bits in 'callstatus', for future use.
This commit is contained in:
Roberto Ierusalimschy
2024-07-21 14:56:59 -03:00
parent f407b3c4a1
commit 15231d4fb2
6 changed files with 98 additions and 81 deletions

View File

@@ -211,31 +211,45 @@ struct CallInfo {
int ntransfer; /* number of values transferred */
} transferinfo;
} u2;
short nresults; /* expected number of results from this function */
unsigned short callstatus;
l_uint32 callstatus;
};
/*
** Bits in CallInfo status
*/
#define CIST_OAH (1<<0) /* original value of 'allowhook' */
#define CIST_C (1<<1) /* call is running a C function */
#define CIST_FRESH (1<<2) /* call is on a fresh "luaV_execute" frame */
#define CIST_HOOKED (1<<3) /* call is running a debug hook */
#define CIST_YPCALL (1<<4) /* doing a yieldable protected call */
#define CIST_TAIL (1<<5) /* call was tail called */
#define CIST_HOOKYIELD (1<<6) /* last hook called yielded */
#define CIST_FIN (1<<7) /* function "called" a finalizer */
#define CIST_TRAN (1<<8) /* 'ci' has transfer information */
#define CIST_CLSRET (1<<9) /* function is closing tbc variables */
/* Bits 10-12 are used for CIST_RECST (see below) */
#define CIST_RECST 10
/* bits 0-7 are the expected number of results from this function + 1 */
#define CIST_NRESULTS 0xff
/* original value of 'allowhook' */
#define CIST_OAH (cast(l_uint32, 1) << 8)
/* call is running a C function */
#define CIST_C (cast(l_uint32, 1) << 9)
/* call is on a fresh "luaV_execute" frame */
#define CIST_FRESH (cast(l_uint32, 1) << 10)
/* call is running a debug hook */
#define CIST_HOOKED (cast(l_uint32, 1) << 11)
/* doing a yieldable protected call */
#define CIST_YPCALL (cast(l_uint32, 1) << 12)
/* call was tail called */
#define CIST_TAIL (cast(l_uint32, 1) << 13)
/* last hook called yielded */
#define CIST_HOOKYIELD (cast(l_uint32, 1) << 14)
/* function "called" a finalizer */
#define CIST_FIN (cast(l_uint32, 1) << 15)
/* 'ci' has transfer information */
#define CIST_TRAN (cast(l_uint32, 1) << 16)
/* function is closing tbc variables */
#define CIST_CLSRET (cast(l_uint32, 1) << 17)
/* Bits 18-20 are used for CIST_RECST (see below) */
#define CIST_RECST 18 /* the offset, not the mask */
#if defined(LUA_COMPAT_LT_LE)
#define CIST_LEQ (1<<13) /* using __lt for __le */
/* using __lt for __le */
#define CIST_LEQ (cast(l_uint32, 1) << 21)
#endif
#define get_nresults(cs) (cast_int((cs) & CIST_NRESULTS) - 1)
/*
** Field CIST_RECST stores the "recover status", used to keep the error
** status while closing to-be-closed variables in coroutines, so that
@@ -246,7 +260,7 @@ struct CallInfo {
#define setcistrecst(ci,st) \
check_exp(((st) & 7) == (st), /* status must fit in three bits */ \
((ci)->callstatus = ((ci)->callstatus & ~(7 << CIST_RECST)) \
| ((st) << CIST_RECST)))
| (cast(l_uint32, st) << CIST_RECST)))
/* active function is a Lua function */
@@ -255,9 +269,11 @@ struct CallInfo {
/* call is running Lua code (not a hook) */
#define isLuacode(ci) (!((ci)->callstatus & (CIST_C | CIST_HOOKED)))
/* assume that CIST_OAH has offset 0 and that 'v' is strictly 0/1 */
#define setoah(st,v) ((st) = ((st) & ~CIST_OAH) | (v))
#define getoah(st) ((st) & CIST_OAH)
#define setoah(ci,v) \
((ci)->callstatus = ((v) ? (ci)->callstatus | CIST_OAH \
: (ci)->callstatus & ~CIST_OAH))
#define getoah(ci) (((ci)->callstatus & CIST_OAH) ? 1 : 0)
/*