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,22 +387,27 @@ static OptRes opt(u32* bc0) {
break;
}
case LSTO: case LSTM: { i32 len = *bc++;
bool allNum = len>0;
for (i32 i = 0; i < len; i++) { S(c,i);
if(c.p==-1) goto defIns;
allNum&= isNum(c.v);
if (len == 0) {
TSADD(stk, SREF(bi_emptyHVec, pos));
cact = 0;
} else {
bool allNum = len>0;
for (i32 i = 0; i < len; i++) { S(c,i);
if(c.p==-1) goto defIns;
allNum&= isNum(c.v);
}
TSSIZE(stk)-= len-1; // huh, doing this beforehand works out nicely
HArr_p h = m_harrUv(len);
for (i32 i = 0; i < len; i++) { S(c,-i);
h.a[i] = inc(c.v);
RM(c.p);
}
NOGC_E;
B r = allNum? squeeze_numNew(h.b) : h.b;
cact = 5;
TSADD(data, r.u);
stk[TSSIZE(stk)-1] = SREF(r, pos);
}
TSSIZE(stk)-= len-1; // huh, doing this beforehand works out nicely
HArr_p h = m_harrUv(len);
for (i32 i = 0; i < len; i++) { S(c,-i);
h.a[i] = inc(c.v);
RM(c.p);
}
NOGC_E;
B r = allNum? squeeze_numNew(h.b) : h.b;
cact = 5;
TSADD(data, r.u);
stk[TSSIZE(stk)-1] = SREF(r, pos);
break;
}
case RETN: case RETD:
@ -416,6 +421,7 @@ static OptRes opt(u32* bc0) {
}
#undef S
#undef L64
assert(stk_o->size <= stk_o->cap);
TSADD(actions, cact);
if (ret) break;
bc = nextBC(sbc);

View File

@ -58,6 +58,7 @@ void print_BCStream(FILE* f, u32* p) {
if (*p == RETD || *p == RETN) return;
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<"c""d", "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