add more GS_UPD

This commit is contained in:
dzaima 2023-01-21 23:32:17 +02:00
parent 1c8a64f13c
commit 7bd8331346
2 changed files with 8 additions and 3 deletions

View File

@ -114,6 +114,7 @@ INS B i_LST_0() { // TODO combine with ADDI
return emptyHVec(); return emptyHVec();
} }
INS B i_LST_p(B el0, i64 sz, B* cStack) { assert(sz>0); INS B i_LST_p(B el0, i64 sz, B* cStack) { assert(sz>0);
GS_UPD;
HArr_p r = m_harrUv(sz); // can't use harrs as gStack isn't updated HArr_p r = m_harrUv(sz); // can't use harrs as gStack isn't updated
bool allNum = isNum(el0); bool allNum = isNum(el0);
r.a[sz-1] = el0; r.a[sz-1] = el0;
@ -123,6 +124,7 @@ INS B i_LST_p(B el0, i64 sz, B* cStack) { assert(sz>0);
return r.b; return r.b;
} }
INS B i_ARMO(B el0, i64 sz, B* cStack) { assert(sz>0); INS B i_ARMO(B el0, i64 sz, B* cStack) { assert(sz>0);
GS_UPD;
HArr_p r = m_harrUv(sz); HArr_p r = m_harrUv(sz);
r.a[sz-1] = el0; r.a[sz-1] = el0;
for (i64 i = 1; i < sz; i++) r.a[sz-i-1] = GSP; for (i64 i = 1; i < sz; i++) r.a[sz-i-1] = GSP;
@ -130,6 +132,7 @@ INS B i_ARMO(B el0, i64 sz, B* cStack) { assert(sz>0);
return bqn_merge(r.b); return bqn_merge(r.b);
} }
INS B i_ARMM(B el0, i64 sz, B* cStack) { assert(sz>0); INS B i_ARMM(B el0, i64 sz, B* cStack) { assert(sz>0);
GS_UPD;
HArr_p r = m_harrUv(sz); // can't use harrs as gStack isn't updated HArr_p r = m_harrUv(sz); // can't use harrs as gStack isn't updated
r.a[sz-1] = el0; r.a[sz-1] = el0;
for (i64 i = 1; i < sz; i++) r.a[sz-i-1] = GSP; for (i64 i = 1; i < sz; i++) r.a[sz-i-1] = GSP;

View File

@ -765,7 +765,7 @@ B evalBC(Body* b, Scope* sc, Block* bl) { // doesn't consume
dec(f); dec(f);
break; break;
} }
case LSTO: case LSTM: { case LSTO: case LSTM: { GS_UPD;
u32 sz = *bc++; u32 sz = *bc++;
if (sz==0) { if (sz==0) {
ADD(emptyHVec()); ADD(emptyHVec());
@ -889,19 +889,21 @@ B evalBC(Body* b, Scope* sc, Block* bl) { // doesn't consume
break; break;
} }
case FAIL: thrM(q_N(sc->vars[2])? "This block cannot be called monadically" : "This block cannot be called dyadically"); case FAIL: thrM(q_N(sc->vars[2])? "This block cannot be called monadically" : "This block cannot be called dyadically");
case ARMO: { case ARMO: { GS_UPD;
u32 sz = *bc++; u32 sz = *bc++;
assert(sz>0); assert(sz>0);
HArr_p r = m_harrUv(sz); HArr_p r = m_harrUv(sz);
for (i64 i = 0; i < sz; i++) r.a[sz-i-1] = POP; for (i64 i = 0; i < sz; i++) r.a[sz-i-1] = POP;
GS_UPD;
ADD(bqn_merge(r.b)); ADD(bqn_merge(r.b));
break; break;
} }
case ARMM: { case ARMM: { GS_UPD;
u32 sz = *bc++; u32 sz = *bc++;
assert(sz>0); assert(sz>0);
HArr_p r = m_harrUv(sz); HArr_p r = m_harrUv(sz);
for (i64 i = 0; i < sz; i++) r.a[sz-i-1] = POP; for (i64 i = 0; i < sz; i++) r.a[sz-i-1] = POP;
GS_UPD;
WrappedObj* a = mm_alloc(sizeof(WrappedObj), t_arrMerge); WrappedObj* a = mm_alloc(sizeof(WrappedObj), t_arrMerge);
a->obj = r.b; a->obj = r.b;
ADD(tag(a,OBJ_TAG)); ADD(tag(a,OBJ_TAG));