diff --git a/src/arith.c b/src/arith.c index 8537a49f..3440f8d6 100644 --- a/src/arith.c +++ b/src/arith.c @@ -79,26 +79,16 @@ B decp_c1(B t, B x); B eq_c2(B t, B w, B x) { if(isF64(w)&isF64(x)) return m_i32(w.f==x.f); P2(eq); - if (w.u==x.u) { dec(w);dec(x); return m_i32(1); } - // doesn't handle int=float - if (!isVal(w) | !isVal(x)) { dec(w);dec(x); return m_i32(0); } - if (v(w)->type!=v(x)->type) { dec(w);dec(x); return m_i32(0); } - B2B dcf = TI(w).decompose; - if (dcf == def_decompose) { dec(w);dec(x); return m_i32(0); } - w=dcf(w); B* wp = harr_ptr(w); - x=dcf(x); B* xp = harr_ptr(x); - if (o2i(wp[0])<=1) { dec(w);dec(x); return m_i32(0); } - usz wia = a(w)->ia; - usz xia = a(x)->ia; - if (wia != xia) { dec(w);dec(x); return m_i32(0); } - for (i32 i = 0; ip); decSh(x); } void slice_visit(B x) { mm_visit(c(Slice,x)->p); } void slice_print(B x) { arr_print(x); } +B* harr_ptr(B x); typedef void (*B2v)(B); diff --git a/src/mm_buddyTemplate.c b/src/mm_buddyTemplate.c index 7911f782..8065a129 100644 --- a/src/mm_buddyTemplate.c +++ b/src/mm_buddyTemplate.c @@ -59,6 +59,7 @@ void BN(free)(Value* x) { #ifdef USE_VALGRIND VALGRIND_MAKE_MEM_UNDEFINED(x, BSZ(x->mmInfo&63)); VALGRIND_MAKE_MEM_DEFINED(&x->mmInfo, 1); + VALGRIND_MAKE_MEM_DEFINED(&x->type, 1); #endif #ifdef DONT_FREE if (x->type!=t_freed) x->flags = x->type; diff --git a/src/mut.c b/src/mut.c index f5280948..aa8444c7 100644 --- a/src/mut.c +++ b/src/mut.c @@ -7,6 +7,7 @@ typedef struct Mut { void mut_to(Mut* m, u8 n) { u8 o = m->type; + assert(o!=el_B); m->type = n; if (o==el_MAX) { switch(n) { default: UD; @@ -18,6 +19,9 @@ void mut_to(Mut* m, u8 n) { } else { sprnk(m->val, 1); m->val->sh = &m->val->ia; + #ifdef USE_VALGRIND + VALGRIND_MAKE_MEM_DEFINED(m->val, mm_size((Value*)m->val)); // it's incomplete, but it's a typed array so garbage is acceptable + #endif switch(n) { default: UD; case el_i32: m->val = (Arr*)toI32Arr(tag(m->val, ARR_TAG)); return; case el_f64: m->val = (Arr*)toF64Arr(tag(m->val, ARR_TAG)); return; diff --git a/src/stuff.c b/src/stuff.c index ef2cd8ca..a353f5c7 100644 --- a/src/stuff.c +++ b/src/stuff.c @@ -84,12 +84,28 @@ void printRaw(B x) { } } -B eq_c2(B t, B w, B x); +B def_decompose(B x) { return m_v2(m_i32((isFun(x)|isMd(x))? 0 : -1),x); } +bool atomEqual(B w, B x) { // doesn't consume (not that that matters really currently) + if(isF64(w)&isF64(x)) return w.f==x.f; + if (w.u==x.u) return true; + if (!isVal(w) | !isVal(x)) return false; + if (v(w)->type!=v(x)->type) return false; + B2B dcf = TI(w).decompose; + if (dcf == def_decompose) return false; + B wd=dcf(inc(w)); B* wdp = harr_ptr(wd); + B xd=dcf(inc(x)); B* xdp = harr_ptr(xd); + if (o2i(wdp[0])<=1) { dec(wd);dec(xd); return false; } + usz wia = a(wd)->ia; + if (wia!=a(xd)->ia) { dec(wd);dec(xd); return false; } + for (i32 i = 0; iia; BS2B xgetU = TI(x).getU; @@ -176,7 +192,6 @@ B def_m1_d(B m, B f ) { thrM("cannot derive this"); } B def_m2_d(B m, B f, B g) { thrM("cannot derive this"); } B def_slice(B x, usz s) { thrM("cannot slice non-array!"); } bool def_canStore(B x) { return false; } -B def_decompose(B x) { return m_v2(m_i32((isFun(x)|isMd(x))? 0 : -1),x); } static inline void hdr_init() { for (i32 i = 0; i < t_COUNT; i++) {