decR
This commit is contained in:
parent
ae1ca2f1d9
commit
d3522fecfa
@ -56,7 +56,7 @@ B div_c1(B t, B x) { if (isF64(x)) return m_f64( 1/x.f ); return err("getti
|
|||||||
B pow_c1(B t, B x) { if (isF64(x)) return m_f64( exp(x.f)); return err("getting exp of non-number"); }
|
B pow_c1(B t, B x) { if (isF64(x)) return m_f64( exp(x.f)); return err("getting exp of non-number"); }
|
||||||
B floor_c1(B t, B x) { if (isF64(x)) return m_f64(floor(x.f)); return err("getting floor of non-number"); }
|
B floor_c1(B t, B x) { if (isF64(x)) return m_f64(floor(x.f)); return err("getting floor of non-number"); }
|
||||||
B log_c1(B t, B x) { if (isF64(x)) return m_f64( log(x.f)); return err("getting log of non-number"); }
|
B log_c1(B t, B x) { if (isF64(x)) return m_f64( log(x.f)); return err("getting log of non-number"); }
|
||||||
B eq_c1(B t, B x) { B r = m_i32(isArr(x)? rnk(x) : 0); dec(x); return r; }
|
B eq_c1(B t, B x) { B r = m_i32(isArr(x)? rnk(x) : 0); decR(x); return r; }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
10
src/derv.c
10
src/derv.c
@ -47,11 +47,11 @@ B fork_c2(B t, B w, B x) { B g=c2(c(Fork,t)->h, inc(w), inc(x)); return c2(c(For
|
|||||||
B md2H_c1(B d, B x) { Md1D* m=c(Md1D,d); Md2H* t=c(Md2H,m->m1); return md2D_c1(m_md2D(t->m2, m->f, t->g), x); }
|
B md2H_c1(B d, B x) { Md1D* m=c(Md1D,d); Md2H* t=c(Md2H,m->m1); return md2D_c1(m_md2D(t->m2, m->f, t->g), x); }
|
||||||
B md2H_c2(B d, B w, B x) { Md1D* m=c(Md1D,d); Md2H* t=c(Md2H,m->m1); return md2D_c2(m_md2D(t->m2, m->f, t->g), w, x); }
|
B md2H_c2(B d, B w, B x) { Md1D* m=c(Md1D,d); Md2H* t=c(Md2H,m->m1); return md2D_c2(m_md2D(t->m2, m->f, t->g), w, x); }
|
||||||
|
|
||||||
B md1D_decompose(B x) { B r=m_v3(m_i32(4),inc(c(Md1D,x)->f),inc(c(Md1D,x)->m1) ); dec(x); return r; }
|
B md1D_decompose(B x) { B r=m_v3(m_i32(4),inc(c(Md1D,x)->f),inc(c(Md1D,x)->m1) ); decR(x); return r; }
|
||||||
B md2D_decompose(B x) { B r=m_v4(m_i32(5),inc(c(Md2D,x)->f),inc(c(Md2D,x)->m2), inc(c(Md2D,x)->g)); dec(x); return r; }
|
B md2D_decompose(B x) { B r=m_v4(m_i32(5),inc(c(Md2D,x)->f),inc(c(Md2D,x)->m2), inc(c(Md2D,x)->g)); decR(x); return r; }
|
||||||
B md2H_decompose(B x) { B r=m_v3(m_i32(6), inc(c(Md2H,x)->m2), inc(c(Md2H,x)->g)); dec(x); return r; }
|
B md2H_decompose(B x) { B r=m_v3(m_i32(6), inc(c(Md2H,x)->m2), inc(c(Md2H,x)->g)); decR(x); return r; }
|
||||||
B fork_decompose(B x) { B r=m_v4(m_i32(3),inc(c(Fork,x)->f),inc(c(Fork,x)->g ), inc(c(Fork,x)->h)); dec(x); return r; }
|
B fork_decompose(B x) { B r=m_v4(m_i32(3),inc(c(Fork,x)->f),inc(c(Fork,x)->g ), inc(c(Fork,x)->h)); decR(x); return r; }
|
||||||
B atop_decompose(B x) { B r=m_v3(m_i32(2), inc(c(Atop,x)->g ), inc(c(Atop,x)->h)); dec(x); return r; }
|
B atop_decompose(B x) { B r=m_v3(m_i32(2), inc(c(Atop,x)->g ), inc(c(Atop,x)->h)); decR(x); return r; }
|
||||||
|
|
||||||
// consume all args
|
// consume all args
|
||||||
B m_md1D(B m, B f ) { B r = mm_alloc(sizeof(Md1D), t_md1D, ftag(FUN_TAG)); c(Md1D,r)->f = f; c(Md1D,r)->m1 = m; c(Md1D,r)->c1=md1D_c1; c(Md1D,r)->c2=md1D_c2; c(Md1D,r)->extra=pf_md1d; return r; }
|
B m_md1D(B m, B f ) { B r = mm_alloc(sizeof(Md1D), t_md1D, ftag(FUN_TAG)); c(Md1D,r)->f = f; c(Md1D,r)->m1 = m; c(Md1D,r)->c1=md1D_c1; c(Md1D,r)->c2=md1D_c2; c(Md1D,r)->extra=pf_md1d; return r; }
|
||||||
|
|||||||
11
src/h.h
11
src/h.h
@ -319,10 +319,12 @@ bool isNothing(B b) { return b.u==bi_nothing.u; }
|
|||||||
|
|
||||||
|
|
||||||
// refcount
|
// refcount
|
||||||
void value_free(B x, Value* vx) {
|
static inline void value_free(B x, Value* vx) {
|
||||||
ti[vx->type].free(x);
|
ti[vx->type].free(x);
|
||||||
mm_free(vx);
|
mm_free(vx);
|
||||||
}
|
}
|
||||||
|
static NOINLINE void value_freeR1(Value* x) { value_free(tag(x, OBJ_TAG), x); }
|
||||||
|
static NOINLINE void value_freeR2(Value* vx, B x) { value_free(x, vx); }
|
||||||
void dec(B x) {
|
void dec(B x) {
|
||||||
if (!isVal(VALIDATE(x))) return;
|
if (!isVal(VALIDATE(x))) return;
|
||||||
Value* vx = v(x);
|
Value* vx = v(x);
|
||||||
@ -334,8 +336,11 @@ B inc(B x) {
|
|||||||
}
|
}
|
||||||
void ptr_dec(void* x) { if(!--((Value*)x)->refc) value_free(tag(x, OBJ_TAG), x); }
|
void ptr_dec(void* x) { if(!--((Value*)x)->refc) value_free(tag(x, OBJ_TAG), x); }
|
||||||
void ptr_inc(void* x) { ((Value*)x)->refc++; }
|
void ptr_inc(void* x) { ((Value*)x)->refc++; }
|
||||||
static NOINLINE void value_free_rare(B x, Value* vx) { value_free(x, vx); }
|
void ptr_decR(void* x) { if(!--((Value*)x)->refc) value_freeR1(x); }
|
||||||
void ptr_dec_rare(void* x) { if(!--((Value*)x)->refc) value_free_rare(tag(x, OBJ_TAG), x); }
|
void decR(B x) {
|
||||||
|
if (!isVal(x)) return; Value* vx = v(x);
|
||||||
|
if(!--vx->refc) value_freeR2(vx, x);
|
||||||
|
}
|
||||||
bool reusable(B x) { return v(x)->refc==1; }
|
bool reusable(B x) { return v(x)->refc==1; }
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -9,7 +9,7 @@ B type_c1(B t, B x) {
|
|||||||
else if (isFun(x)) r = 3;
|
else if (isFun(x)) r = 3;
|
||||||
else if (isMd1(x)) r = 4;
|
else if (isMd1(x)) r = 4;
|
||||||
else if (isMd2(x)) r = 5;
|
else if (isMd2(x)) r = 5;
|
||||||
dec(x);
|
decR(x);
|
||||||
if (r==-1) return err("getting type");
|
if (r==-1) return err("getting type");
|
||||||
return m_i32(r);
|
return m_i32(r);
|
||||||
}
|
}
|
||||||
|
|||||||
34
src/vm.c
34
src/vm.c
@ -204,7 +204,7 @@ Scope* scd(Scope* sc, u16 d) {
|
|||||||
return sc;
|
return sc;
|
||||||
}
|
}
|
||||||
|
|
||||||
B v_set(Scope* sc, B s, B x, bool upd) { // frees s, consumes x, returns previous value
|
B v_set(Scope* sc, B s, B x, bool upd) { // frees s; returns previous value
|
||||||
if (isVar(s)) {
|
if (isVar(s)) {
|
||||||
sc = scd(sc, (u16)(s.u>>32));
|
sc = scd(sc, (u16)(s.u>>32));
|
||||||
B prev = sc->vars[(u32)s.u];
|
B prev = sc->vars[(u32)s.u];
|
||||||
@ -214,15 +214,19 @@ B v_set(Scope* sc, B s, B x, bool upd) { // frees s, consumes x, returns previou
|
|||||||
} else {
|
} else {
|
||||||
if (prev.u!=bi_noVar.u) return err("redefining variable");
|
if (prev.u!=bi_noVar.u) return err("redefining variable");
|
||||||
}
|
}
|
||||||
sc->vars[(u32)s.u] = x;
|
sc->vars[(u32)s.u] = inc(x);
|
||||||
} else {
|
} else {
|
||||||
VT(s, t_harr);
|
VT(s, t_harr);
|
||||||
if (!shEq(s, x)) return err("spread assignment: mismatched shape");
|
if (!shEq(s, x)) return err("spread assignment: mismatched shape");
|
||||||
usz ia = a(x)->ia;
|
usz ia = a(x)->ia;
|
||||||
B* sp = harr_ptr(s);
|
B* sp = harr_ptr(s);
|
||||||
BS2B xget = TI(x).get;
|
BS2B xget = TI(x).get;
|
||||||
for (u64 i = 0; i < ia; i++) v_set(sc, sp[i], xget(x,i), upd);
|
for (u64 i = 0; i < ia; i++) {
|
||||||
dec(s); dec(x);
|
B c = xget(x,i);
|
||||||
|
v_set(sc, sp[i], c, upd);
|
||||||
|
decR(c); // should never free actually
|
||||||
|
}
|
||||||
|
dec(s);
|
||||||
}
|
}
|
||||||
return m_f64(0);
|
return m_f64(0);
|
||||||
}
|
}
|
||||||
@ -305,7 +309,7 @@ B evalBC(Body* b, Scope* sc) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case FN1O: { P(f)P(x)
|
case FN1O: { P(f)P(x)
|
||||||
ADD(isNothing(x)? x : c1(f, x); dec(f));
|
ADD(isNothing(x)? x : c1(f, x)); dec(f);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case FN2C: { P(w)P(f)P(x)
|
case FN2C: { P(w)P(f)P(x)
|
||||||
@ -352,12 +356,12 @@ B evalBC(Body* b, Scope* sc) {
|
|||||||
ADD(inc(scd(sc,d)->vars[p]));
|
ADD(inc(scd(sc,d)->vars[p]));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SETN: { P(s) P(x) v_set(sc, s, inc(x), false); ADD(x); break; }
|
case SETN: { P(s) P(x) v_set(sc, s, x, false); ADD(x); break; }
|
||||||
case SETU: { P(s) P(x) v_set(sc, s, inc(x), true ); ADD(x); break; }
|
case SETU: { P(s) P(x) v_set(sc, s, x, true ); ADD(x); break; }
|
||||||
case SETM: { P(s)P(f)P(x)
|
case SETM: { P(s)P(f)P(x)
|
||||||
B w = v_get(sc, s);
|
B w = v_get(sc, s);
|
||||||
B r = c2(f,w,x); dec(f);
|
B r = c2(f,w,x); dec(f);
|
||||||
v_set(sc, s, inc(r), true);
|
v_set(sc, s, r, true);
|
||||||
ADD(r);
|
ADD(r);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -439,18 +443,18 @@ B m_md2Block(Block* bl, Scope* psc) {
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
void comp_free(B x) { Comp* c = c(Comp ,x); ptr_dec(c->objs); dec(c->bc); }
|
void comp_free(B x) { Comp* c = c(Comp ,x); ptr_decR(c->objs); decR(c->bc); }
|
||||||
void body_free(B x) { Body* c = c(Body ,x); ptr_dec(c->comp); }
|
void body_free(B x) { Body* c = c(Body ,x); ptr_decR(c->comp); }
|
||||||
void block_free(B x) { Block* c = c(Block,x); ptr_dec(c->body); }
|
void block_free(B x) { Block* c = c(Block,x); ptr_decR(c->body); }
|
||||||
void scope_free(B x) {
|
void scope_free(B x) {
|
||||||
Scope* c = c(Scope,x);
|
Scope* c = c(Scope,x);
|
||||||
if (c->psc) ptr_dec_rare(c->psc);
|
if (c->psc) ptr_decR(c->psc);
|
||||||
u16 am = c->varAm;
|
u16 am = c->varAm;
|
||||||
for (u32 i = 0; i < am; i++) dec(c->vars[i]);
|
for (u32 i = 0; i < am; i++) dec(c->vars[i]);
|
||||||
}
|
}
|
||||||
void funBl_free(B x) { FunBlock* c = c(FunBlock,x); ptr_dec_rare(c->sc); ptr_dec_rare(c->bl); }
|
void funBl_free(B x) { FunBlock* c = c(FunBlock,x); ptr_decR(c->sc); ptr_decR(c->bl); }
|
||||||
void md1Bl_free(B x) { Md1Block* c = c(Md1Block,x); ptr_dec_rare(c->sc); ptr_dec_rare(c->bl); }
|
void md1Bl_free(B x) { Md1Block* c = c(Md1Block,x); ptr_decR(c->sc); ptr_decR(c->bl); }
|
||||||
void md2Bl_free(B x) { Md2Block* c = c(Md2Block,x); ptr_dec_rare(c->sc); ptr_dec_rare(c->bl); }
|
void md2Bl_free(B x) { Md2Block* c = c(Md2Block,x); ptr_decR(c->sc); ptr_decR(c->bl); }
|
||||||
|
|
||||||
void comp_print (B x) { printf("(%p: comp)",v(x)); }
|
void comp_print (B x) { printf("(%p: comp)",v(x)); }
|
||||||
void body_print (B x) { printf("(%p: body varam=%d)",v(x),c(Body,x)->varAm); }
|
void body_print (B x) { printf("(%p: body varam=%d)",v(x),c(Body,x)->varAm); }
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user