Fix C stack remaining check in MODE=tiny

This commit is contained in:
Justine Tunney 2022-07-14 07:23:15 -07:00
parent bcdd5c5f74
commit 28b9d9f781
5 changed files with 11 additions and 7 deletions

View file

@ -121,6 +121,13 @@ extern char ape_stack_align[] __attribute__((__weak__));
vAddr; \
})
/**
* Returns true if at least `n` bytes of stack are available.
*/
#define HaveStackMemory(n) \
(IsTiny() || \
(intptr_t)__builtin_frame_address(0) >= GetStackAddr() + PAGESIZE * (n))
COSMOPOLITAN_C_END_
#endif /* GNU ELF */
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */

View file

@ -124,9 +124,6 @@ res, err = DecodeJson([[
{"k":{"k":{"k":{"k":0}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
}}}}}}}}}
]])
if not res then
print('wut', err)
end
assert(res)
-- 64 objects

View file

@ -18,6 +18,7 @@
*/
#include "libc/assert.h"
#include "libc/bits/bits.h"
#include "libc/bits/likely.h"
#include "libc/fmt/itoa.h"
#include "libc/intrin/kprintf.h"
#include "libc/log/log.h"
@ -165,7 +166,7 @@ static int SerializeTable(lua_State *L, char **buf, int idx,
int rc;
bool isarray;
lua_Unsigned n;
if ((intptr_t)__builtin_frame_address(0) < GetStackAddr() + PAGESIZE * 2) {
if (UNLIKELY(!HaveStackMemory(PAGESIZE))) {
z->reason = "out of stack";
return -1;
}

View file

@ -336,7 +336,7 @@ static int SerializeTable(lua_State *L, char **buf, int idx,
struct Serializer *z, int depth) {
int rc;
intptr_t rsp, bot;
if ((intptr_t)__builtin_frame_address(0) < GetStackAddr() + PAGESIZE * 2) {
if (UNLIKELY(!HaveStackMemory(PAGESIZE))) {
z->reason = "out of stack";
return -1;
}

View file

@ -50,8 +50,7 @@ static struct DecodeJson Parse(struct lua_State *L, const char *p,
if (UNLIKELY(!depth)) {
return (struct DecodeJson){-1, "maximum depth exceeded"};
}
if (UNLIKELY((intptr_t)__builtin_frame_address(0) <
GetStackAddr() + PAGESIZE * 2)) {
if (UNLIKELY(!HaveStackMemory(PAGESIZE))) {
return (struct DecodeJson){-1, "out of stack"};
}
for (a = p, d = +1; p < e;) {