mirror of
https://github.com/lua/lua
synced 2024-11-28 07:33:08 +03:00
Corrected support for 16-bit systems
We still need access to a 16-bit system to correctly test these changes.
This commit is contained in:
parent
02bab9fc25
commit
1de2f31694
14
ldo.c
14
ldo.c
@ -299,17 +299,13 @@ static int stackinuse (lua_State *L) {
|
|||||||
*/
|
*/
|
||||||
void luaD_shrinkstack (lua_State *L) {
|
void luaD_shrinkstack (lua_State *L) {
|
||||||
int inuse = stackinuse(L);
|
int inuse = stackinuse(L);
|
||||||
int nsize = inuse * 2; /* proposed new size */
|
int max = (inuse > LUAI_MAXSTACK / 3) ? LUAI_MAXSTACK : inuse * 3;
|
||||||
int max = inuse * 3; /* maximum "reasonable" size */
|
|
||||||
if (max > LUAI_MAXSTACK) {
|
|
||||||
max = LUAI_MAXSTACK; /* respect stack limit */
|
|
||||||
if (nsize > LUAI_MAXSTACK)
|
|
||||||
nsize = LUAI_MAXSTACK;
|
|
||||||
}
|
|
||||||
/* if thread is currently not handling a stack overflow and its
|
/* if thread is currently not handling a stack overflow and its
|
||||||
size is larger than maximum "reasonable" size, shrink it */
|
size is larger than maximum "reasonable" size, shrink it */
|
||||||
if (inuse <= LUAI_MAXSTACK && stacksize(L) > max)
|
if (inuse <= LUAI_MAXSTACK && stacksize(L) > max) {
|
||||||
|
int nsize = (inuse > LUAI_MAXSTACK / 2) ? LUAI_MAXSTACK : inuse * 2;
|
||||||
luaD_reallocstack(L, nsize, 0); /* ok if that fails */
|
luaD_reallocstack(L, nsize, 0); /* ok if that fails */
|
||||||
|
}
|
||||||
else /* don't change stack */
|
else /* don't change stack */
|
||||||
condmovestack(L,{},{}); /* (change only for debugging) */
|
condmovestack(L,{},{}); /* (change only for debugging) */
|
||||||
luaE_shrinkCI(L); /* shrink CI list */
|
luaE_shrinkCI(L); /* shrink CI list */
|
||||||
@ -629,7 +625,7 @@ CallInfo *luaD_precall (lua_State *L, StkId func, int nresults) {
|
|||||||
** check the stack before doing anything else. 'luaD_precall' already
|
** check the stack before doing anything else. 'luaD_precall' already
|
||||||
** does that.
|
** does that.
|
||||||
*/
|
*/
|
||||||
l_sinline void ccall (lua_State *L, StkId func, int nResults, int inc) {
|
l_sinline void ccall (lua_State *L, StkId func, int nResults, l_uint32 inc) {
|
||||||
CallInfo *ci;
|
CallInfo *ci;
|
||||||
L->nCcalls += inc;
|
L->nCcalls += inc;
|
||||||
if (l_unlikely(getCcalls(L) >= LUAI_MAXCCALLS)) {
|
if (l_unlikely(getCcalls(L) >= LUAI_MAXCCALLS)) {
|
||||||
|
@ -21,7 +21,7 @@ iABC C(8) | B(8) |k| A(8) | Op(7) |
|
|||||||
iABx Bx(17) | A(8) | Op(7) |
|
iABx Bx(17) | A(8) | Op(7) |
|
||||||
iAsBx sBx (signed)(17) | A(8) | Op(7) |
|
iAsBx sBx (signed)(17) | A(8) | Op(7) |
|
||||||
iAx Ax(25) | Op(7) |
|
iAx Ax(25) | Op(7) |
|
||||||
isJ sJ(25) | Op(7) |
|
isJ sJ (signed)(25) | Op(7) |
|
||||||
|
|
||||||
A signed argument is represented in excess K: the represented value is
|
A signed argument is represented in excess K: the represented value is
|
||||||
the written unsigned value minus K, where K is half the maximum for the
|
the written unsigned value minus K, where K is half the maximum for the
|
||||||
|
2
ltable.c
2
ltable.c
@ -257,9 +257,11 @@ LUAI_FUNC unsigned int luaH_realasize (const Table *t) {
|
|||||||
size |= (size >> 2);
|
size |= (size >> 2);
|
||||||
size |= (size >> 4);
|
size |= (size >> 4);
|
||||||
size |= (size >> 8);
|
size |= (size >> 8);
|
||||||
|
#if (UINT_MAX >> 14) > 3 /* unsigned int has more than 16 bits */
|
||||||
size |= (size >> 16);
|
size |= (size >> 16);
|
||||||
#if (UINT_MAX >> 30) > 3
|
#if (UINT_MAX >> 30) > 3
|
||||||
size |= (size >> 32); /* unsigned int has more than 32 bits */
|
size |= (size >> 32); /* unsigned int has more than 32 bits */
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
size++;
|
size++;
|
||||||
lua_assert(ispow2(size) && size/2 < t->alimit && t->alimit < size);
|
lua_assert(ispow2(size) && size/2 < t->alimit && t->alimit < size);
|
||||||
|
Loading…
Reference in New Issue
Block a user