fix JIT not allocating stack capacity for empty arrays

This commit is contained in:
dzaima 2025-05-16 02:04:54 +03:00
parent c17280d96d
commit 1ab511f657
3 changed files with 26 additions and 15 deletions

View File

@ -387,6 +387,10 @@ static OptRes opt(u32* bc0) {
break; break;
} }
case LSTO: case LSTM: { i32 len = *bc++; case LSTO: case LSTM: { i32 len = *bc++;
if (len == 0) {
TSADD(stk, SREF(bi_emptyHVec, pos));
cact = 0;
} else {
bool allNum = len>0; bool allNum = len>0;
for (i32 i = 0; i < len; i++) { S(c,i); for (i32 i = 0; i < len; i++) { S(c,i);
if(c.p==-1) goto defIns; if(c.p==-1) goto defIns;
@ -403,6 +407,7 @@ static OptRes opt(u32* bc0) {
cact = 5; cact = 5;
TSADD(data, r.u); TSADD(data, r.u);
stk[TSSIZE(stk)-1] = SREF(r, pos); stk[TSSIZE(stk)-1] = SREF(r, pos);
}
break; break;
} }
case RETN: case RETD: case RETN: case RETD:
@ -416,6 +421,7 @@ static OptRes opt(u32* bc0) {
} }
#undef S #undef S
#undef L64 #undef L64
assert(stk_o->size <= stk_o->cap);
TSADD(actions, cact); TSADD(actions, cact);
if (ret) break; if (ret) break;
bc = nextBC(sbc); bc = nextBC(sbc);

View File

@ -58,6 +58,7 @@ void print_BCStream(FILE* f, u32* p) {
if (*p == RETD || *p == RETN) return; if (*p == RETD || *p == RETN) return;
p = nextBC(p); p = nextBC(p);
} }
fflush(f);
} }

View File

@ -83,3 +83,7 @@ X←1‿2{a⇐𝕘-𝕗}3‿4 ⋄ ⟨a⟩←x ⋄ +´a %% 4
{𝕊: a"ab" (a"c")"d", a}¨ 4 %% 4<"ab","c""d", "ab","c" {𝕊: a"ab" (a"c")"d", a}¨ 4 %% 4<"ab","c""d", "ab","c"
{𝕊: a"ab" (a"c")"d", a}¨ 4 %% 4<"c""d", "c" {𝕊: a"ab" (a"c")"d", a}¨ 4 %% 4<"c""d", "c"
{𝕊: a"ab" (b"c")"d", a, b}¨ 4 %% 4<"c""d", "ab", "c" {𝕊: a"ab" (b"c")"d", a, b}¨ 4 %% 4<"c""d", "ab", "c"
# optimizer bug
{𝕏¨ 5}¨ •BQN '⟩'˜ '⟨' {",{𝕊:""⟨⟩}"˜(2×𝕩)"𝕩‿"}¨50 %% {𝕊i: {(i=0) ˜i𝕩}¨ 5}¨ 50
{𝕏¨ 5}¨ •BQN '⟩'˜ '⟨' {",{𝕊:""⟨⟩‿⟨⟩‿⟨⟩‿⟨⟩‿⟨⟩‿⟨⟩‿⟨⟩‿⟨⟩‿⟨⟩‿⟨⟩‿⟨⟩‿⟨⟩}"˜(2×𝕩)"𝕩‿"}¨50 %% {𝕊i: {(i𝕩)12<}¨ 5}¨ 50