bi_emptyHVec, actually fix !GS_REALLOC

This commit is contained in:
dzaima 2021-05-08 15:47:04 +03:00
parent 6c349fc3ed
commit 8ed4019edf
4 changed files with 30 additions and 9 deletions

View File

@ -393,7 +393,7 @@ TypeInfo ti[t_COUNT];
#define TI(x) (ti[v(x)->type]) #define TI(x) (ti[v(x)->type])
B bi_N, bi_noVar, bi_badHdr, bi_optOut, bi_noFill; B bi_N, bi_noVar, bi_badHdr, bi_optOut, bi_noFill, bi_emptyHVec;
void do_nothing(B x) { } void do_nothing(B x) { }
bool isNothing(B b) { return b.u==bi_N.u; } bool isNothing(B b) { return b.u==bi_N.u; }

View File

@ -174,4 +174,6 @@ static inline void harr_init() {
ti[t_harr].print = arr_print; ti[t_hslice].print = arr_print; ti[t_harrPartial].print = harrP_print; ti[t_harr].print = arr_print; ti[t_hslice].print = arr_print; ti[t_harrPartial].print = harrP_print;
ti[t_harr].isArr = true; ti[t_hslice].isArr = true; ti[t_harr].isArr = true; ti[t_hslice].isArr = true;
ti[t_harr].canStore = harr_canStore; ti[t_harr].canStore = harr_canStore;
bi_emptyHVec = m_harrUv(0).b;
gc_add(bi_emptyHVec);
} }

View File

@ -167,13 +167,12 @@ B sys_c1(B t, B x) {
for (; i < a(x)->ia; i++) { for (; i < a(x)->ia; i++) {
B c = xgetU(x,i); B c = xgetU(x,i);
if (eqStr(c, U"internal")) r.a[i] = inc(bi_internal); if (eqStr(c, U"internal")) r.a[i] = inc(bi_internal);
else if (eqStr(c, U"eq")) r.a[i] = inc(bi_feq);
else if (eqStr(c, U"decompose")) r.a[i] = inc(bi_decp); else if (eqStr(c, U"decompose")) r.a[i] = inc(bi_decp);
else if (eqStr(c, U"primind")) r.a[i] = inc(bi_primInd); else if (eqStr(c, U"primind")) r.a[i] = inc(bi_primInd);
else if (eqStr(c, U"type")) r.a[i] = inc(bi_type); else if (eqStr(c, U"type")) r.a[i] = inc(bi_type);
else if (eqStr(c, U"out")) r.a[i] = inc(bi_out); else if (eqStr(c, U"out")) r.a[i] = inc(bi_out);
else if (eqStr(c, U"show")) r.a[i] = inc(bi_show); else if (eqStr(c, U"show")) r.a[i] = inc(bi_show);
else thrM("Unknown system function"); else { dec(x); thrM("Unknown system function"); }
} }
return harr_fcd(r, x); return harr_fcd(r, x);
} }

View File

@ -290,6 +290,18 @@ void gsAdd(B x) {
B gsPop() { B gsPop() {
return *--gStack; return *--gStack;
} }
void gsPrint() {
B* c = gStackStart;
i32 i = 0;
while (c!=gStack) {
printf("%d: ", i);
print(*c);
printf(", refc=%d\n", v(*c)->refc);
c++;
i++;
}
}
B evalBC(Body* b, Scope* sc) { // doesn't consume B evalBC(Body* b, Scope* sc) { // doesn't consume
#ifdef DEBUG_VM #ifdef DEBUG_VM
bcDepth+= 2; bcDepth+= 2;
@ -359,11 +371,17 @@ B evalBC(Body* b, Scope* sc) { // doesn't consume
} }
case ARRO: case ARRM: { case ARRO: case ARRM: {
i32 sz = *bc++; i32 sz = *bc++;
HArr_p r = m_harrUv(sz); if (sz==0) {
bool allNum = true; ADD(inc(bi_emptyHVec));
for (i32 i = 0; i < sz; i++) if (!isNum(r.a[sz-i-1] = POP)) allNum = false; } else {
GS_UPD; HArr_p r = m_harrUv(sz);
ADD(allNum && sz? withFill(r.b, m_f64(0)) : r.b); bool allNum = true;
for (i32 i = 0; i < sz; i++) if (!isNum(r.a[sz-i-1] = POP)) allNum = false;
if (allNum) {
GS_UPD;
ADD(withFill(r.b, m_f64(0)));
} else ADD(r.b);
}
break; break;
} }
case DFND: { case DFND: {
@ -428,7 +446,9 @@ B evalBC(Body* b, Scope* sc) { // doesn't consume
#ifdef DEBUG_VM #ifdef DEBUG_VM
bcDepth-= 2; bcDepth-= 2;
#endif #endif
return POP; B r = POP;
GS_UPD;
return r;
#undef P #undef P
#undef ADD #undef ADD
#undef POP #undef POP