diff --git a/src/vm.c b/src/vm.c index e6d6b66c..be3bab36 100644 --- a/src/vm.c +++ b/src/vm.c @@ -604,10 +604,9 @@ NOINLINE B v_getF(Scope* pscs[], B s) { VTY(s, t_harr); usz ia = IA(s); B* sp = harr_ptr(s); - HArr_p r = m_harrUv(ia); - for (u64 i = 0; i < ia; i++) r.a[i] = v_get(pscs, sp[i], true); - NOGC_E; - return r.b; + M_HARR(r, ia); + for (u64 i = 0; i < ia; i++) HARR_ADD(r, i, v_get(pscs, sp[i], true)); + return HARR_FV(r); } else if (isExt(s)) { Scope* sc = pscs[V_DEPTH(s)]; B r = sc->ext->vars[V_POS(s)]; @@ -1724,6 +1723,7 @@ NOINLINE void freeThrown() { } NOINLINE NORETURN void thrM(char* s) { + NOGC_CHECK("throwing during noAlloc"); thr(utf8Decode0(s)); } NOINLINE NORETURN void thrOOM() { diff --git a/test/cases/syntax.bqn b/test/cases/syntax.bqn index d76cadbd..dd8c8666 100644 --- a/test/cases/syntax.bqn +++ b/test/cases/syntax.bqn @@ -33,6 +33,9 @@ a←"zero"‿"one" ⋄ !a≡a⊸{𝕩?1⊑𝕨;0⊑𝕨}¨0‿1 !"↩: Reading variable that hasn't been set" % {a⊢↩↕10} ⋄ a←2 !"↩: Updating variable that hasn't been set" % {a↩↕10} ⋄ a←2 !"↩: Reading variable that hasn't been set" % {a (↕10)˙↩} ⋄ a←2 +!"↩: Reading variable that hasn't been set" % a←1 ⋄ {a‿b⊢↩↕2} ⋄ b←2 +!"↩: Updating variable that hasn't been set" % a←1 ⋄ {a‿b↩↕2} ⋄ b←2 +!"↩: Reading variable that hasn't been set" % a←1 ⋄ {a‿b (↕10)˙↩} ⋄ b←2 !"Assignment: Mismatched shape for spread assignment" % a‿b←1 !"Assignment: Mismatched shape for spread assignment" % a‿b←1‿2‿3 !"Assignment: Mismatched shape for spread assignment" % ⟨a⟩←<1