split up eq_c2

This commit is contained in:
dzaima 2021-05-03 14:58:26 +03:00
parent 4d85a57e10
commit 6740e680a9
6 changed files with 45 additions and 33 deletions

View File

@ -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; i<wia; i++) if(!equal(wp[i], xp[i]))
{ dec(w);dec(x); return m_i32(0); }
dec(w);dec(x); return m_i32(1);
B r = m_i32(atomEqual(w, x));
dec(w); dec(x);
return r;
}
B ne_c2(B t, B w, B x) {
if(isF64(w)&isF64(x)) return m_i32(w.f!=x.f);
P2(ne);
return m_i32(1-o2i(eq_c2(t,w,x)));
B r = m_i32(!atomEqual(w, x));
dec(w); dec(x);
return r;
}

View File

@ -141,12 +141,12 @@ void validateFill(B x) {
}
B fill_or(B wf, B xf) { // consumes
if (!equal(wf, xf)) {
dec(wf); dec(xf);
return bi_noFill;
if (wf.u==xf.u || equal(wf, xf)) {
dec(wf);
return xf;
}
dec(wf);
return xf;
dec(wf); dec(xf);
return bi_noFill;
}
B fill_both(B w, B x) { // doesn't consume

16
src/h.h
View File

@ -210,13 +210,14 @@ B inc(B x);
void ptr_dec(void* x);
void ptr_inc(void* x);
void printUTF8(u32 c);
void printRaw(B x); // doesn't consume
void print(B x); // doesn't consume
bool equal(B w, B x); // doesn't consume
void arr_print(B x); // doesn't consume
u8 fillElType(B x); // doesn't consume
bool eqShape(B w, B x); // doesn't consume
usz arr_csz(B x); // doesn't consume
void printRaw(B x); // doesn't consume
void print(B x); // doesn't consume
bool equal(B w, B x); // doesn't consume
void arr_print(B x); // doesn't consume
u8 fillElType(B x); // doesn't consume
bool eqShape(B w, B x); // doesn't consume
usz arr_csz(B x); // doesn't consume
bool atomEqual(B w, B x); // doesn't consume
bool eqShPrefix(usz* w, usz* x, ur len);
B m_v1(B a ); // consumes all
@ -355,6 +356,7 @@ void slice_free(B x) { dec(c(Slice,x)->p); 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);

View File

@ -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;

View File

@ -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;

View File

@ -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; i<wia; i++) if(!equal(wdp[i], xdp[i]))
{ dec(wd);dec(xd); return false; }
dec(wd);dec(xd); return true;
}
bool equal(B w, B x) { // doesn't consume
bool wa = isArr(w);
bool xa = isArr(x);
bool wa = isAtm(w);
bool xa = isAtm(x);
if (wa!=xa) return false;
if (!wa) return o2iu(eq_c2(bi_N, inc(w), inc(x)))?1:0;
if (wa) return atomEqual(w, x);
if (!eqShape(w,x)) return false;
usz ia = a(x)->ia;
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++) {