use decR less

This commit is contained in:
dzaima 2021-07-31 22:40:33 +03:00
parent 1f5cfbe766
commit 749b098f1e
6 changed files with 12 additions and 9 deletions

View File

@ -54,8 +54,8 @@ B atan_c1(B t, B x) { if (isF64(x)) return m_f64( atan(x.f)); P1( atan); thrM("
#undef P1 #undef P1
B lt_c1(B t, B x) { return m_unit(x); } B lt_c1(B t, B x) { return m_unit(x); }
B eq_c1(B t, B x) { B r = m_i32(isArr(x)? rnk(x) : 0); decR(x); return r; } B eq_c1(B t, B x) { B r = m_i32(isArr(x)? rnk(x) : 0); dec(x); return r; }
B ne_c1(B t, B x) { B r = m_f64(isArr(x)&&rnk(x)? *a(x)->sh : 1); decR(x); return r; } B ne_c1(B t, B x) { B r = m_f64(isArr(x)&&rnk(x)? *a(x)->sh : 1); dec(x); return r; }
static B mathNS; static B mathNS;

View File

@ -159,7 +159,7 @@ B shape_c2(B t, B w, B x) {
} }
unit: unit:
if (isF64(x)) { decR(xf); if (isF64(x)) { decA(xf);
i32 n = (i32)x.f; i32 n = (i32)x.f;
if (n == x.f) { if (n == x.f) {
i32* rp; Arr* r = m_i32arrp(&rp, nia); arr_shSetU(r, nr, sh); i32* rp; Arr* r = m_i32arrp(&rp, nia); arr_shSetU(r, nr, sh);
@ -171,7 +171,7 @@ B shape_c2(B t, B w, B x) {
return taga(r); return taga(r);
} }
} }
if (isC32(x)) { decR(xf); if (isC32(x)) { decA(xf);
u32* rp; Arr* r = m_c32arrp(&rp, nia); arr_shSetU(r, nr, sh); u32* rp; Arr* r = m_c32arrp(&rp, nia); arr_shSetU(r, nr, sh);
u32 c = o2cu(x); u32 c = o2cu(x);
for (u64 i = 0; i < nia; i++) rp[i] = c; for (u64 i = 0; i < nia; i++) rp[i] = c;
@ -536,7 +536,7 @@ B join_c1(B t, B x) {
if (xia==0) { if (xia==0) {
B xf = getFillE(x); B xf = getFillE(x);
if (isAtm(xf)) { if (isAtm(xf)) {
decR(xf); decA(xf);
if (!PROPER_FILLS) { if (!PROPER_FILLS) {
B xfq = getFillR(x); B xfq = getFillR(x);
bool no = noFill(xfq); bool no = noFill(xfq);

View File

@ -24,6 +24,7 @@ NOINLINE B c2_rare(B f, B w, B x) { dec(w); dec(x);
return inc(VALIDATE(f)); return inc(VALIDATE(f));
} }
NOINLINE void value_freeR(Value* x) { value_free(x); } NOINLINE void value_freeR(Value* x) { value_free(x); }
NOINLINE void decA_rare(B x) { dec(x); }
void noop_visit(Value* x) { } void noop_visit(Value* x) { }
NOINLINE B c1_invalid(B f, B x) { thrM("This function can't be called monadically"); } NOINLINE B c1_invalid(B f, B x) { thrM("This function can't be called monadically"); }
NOINLINE B c2_invalid(B f, B w, B x) { thrM("This function can't be called dyadically"); } NOINLINE B c2_invalid(B f, B w, B x) { thrM("This function can't be called dyadically"); }

View File

@ -421,6 +421,8 @@ static void decR(B x) {
Value* vx = v(x); Value* vx = v(x);
if(!--vx->refc) value_freeR(vx); if(!--vx->refc) value_freeR(vx);
} }
void decA_rare(B x);
static void decA(B x) { if (RARE(isVal(x))) decA_rare(x); } // decrement what's likely an atom
static B inc(B x) { static B inc(B x) {
if (isVal(VALIDATE(x))) v(x)->refc++; if (isVal(VALIDATE(x))) v(x)->refc++;
return x; return x;

View File

@ -107,7 +107,7 @@ B ns_nameList(NSDesc* d) {
DEF_FREE(ns) { DEF_FREE(ns) {
NS* c = (NS*)x; NS* c = (NS*)x;
ptr_decR(c->desc); ptr_decR(c->desc);
ptr_decR(c->sc); ptr_dec(c->sc);
} }
static void ns_visit(Value* x) { static void ns_visit(Value* x) {
NS* c = (NS*)x; NS* c = (NS*)x;

View File

@ -805,9 +805,9 @@ DEF_FREE(block) {
for (i32 i = 0; i < am; i++) ptr_decR(c->bodies[i]); for (i32 i = 0; i < am; i++) ptr_decR(c->bodies[i]);
} }
DEF_FREE(comp) { Comp* c = (Comp *)x; ptr_decR(c->objs); decR(c->bc); decR(c->src); decR(c->indices); decR(c->path); } DEF_FREE(comp) { Comp* c = (Comp *)x; ptr_decR(c->objs); decR(c->bc); decR(c->src); decR(c->indices); decR(c->path); }
DEF_FREE(funBl) { FunBlock* c = (FunBlock*)x; ptr_decR(c->sc); ptr_decR(c->bl); } DEF_FREE(funBl) { FunBlock* c = (FunBlock*)x; ptr_dec(c->sc); ptr_decR(c->bl); }
DEF_FREE(md1Bl) { Md1Block* c = (Md1Block*)x; ptr_decR(c->sc); ptr_decR(c->bl); } DEF_FREE(md1Bl) { Md1Block* c = (Md1Block*)x; ptr_dec(c->sc); ptr_decR(c->bl); }
DEF_FREE(md2Bl) { Md2Block* c = (Md2Block*)x; ptr_decR(c->sc); ptr_decR(c->bl); } DEF_FREE(md2Bl) { Md2Block* c = (Md2Block*)x; ptr_dec(c->sc); ptr_decR(c->bl); }
DEF_FREE(alias) { dec(((FldAlias*)x)->obj); } DEF_FREE(alias) { dec(((FldAlias*)x)->obj); }
DEF_FREE(bBlks) { BlBlocks* c = (BlBlocks*)x; u16 am = c->am; for (i32 i = 0; i < am; i++) ptr_dec(c->a[i]); } DEF_FREE(bBlks) { BlBlocks* c = (BlBlocks*)x; u16 am = c->am; for (i32 i = 0; i < am; i++) ptr_dec(c->a[i]); }
DEF_FREE(scExt) { ScopeExt* c = (ScopeExt*)x; u16 am = c->varAm*2; for (i32 i = 0; i < am; i++) dec(c->vars[i]); } DEF_FREE(scExt) { ScopeExt* c = (ScopeExt*)x; u16 am = c->varAm*2; for (i32 i = 0; i < am; i++) dec(c->vars[i]); }