diff --git a/src/jit/nvm_x86_64.c b/src/jit/nvm_x86_64.c index 8aaf3788..82756829 100644 --- a/src/jit/nvm_x86_64.c +++ b/src/jit/nvm_x86_64.c @@ -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); diff --git a/src/vm.c b/src/vm.c index a5c07a77..c9f4992c 100644 --- a/src/vm.c +++ b/src/vm.c @@ -58,6 +58,7 @@ void print_BCStream(FILE* f, u32* p) { if (*p == RETD || *p == RETN) return; p = nextBC(p); } + fflush(f); } diff --git a/test/cases/syntax.bqn b/test/cases/syntax.bqn index 0ba9cae4..b86a608f 100644 --- a/test/cases/syntax.bqn +++ b/test/cases/syntax.bqn @@ -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