rearrange common array case to top

This commit is contained in:
dzaima 2022-06-14 02:40:50 +03:00
parent f3fffd2b8d
commit 6307356bab

View File

@ -545,52 +545,55 @@ NOINLINE void v_setF(Scope* pscs[], B s, B x, bool upd) {
} }
} }
NOINLINE bool v_sethF(Scope* pscs[], B s, B x) { NOINLINE bool v_sethF(Scope* pscs[], B s, B x) {
if (v(s)->type==t_vfyObj) return equal(c(WrappedObj,s)->obj,x); if (isArr(s)) {
if (v(s)->type==t_arrMerge) return v_merge(pscs, s, x, false, true); VTY(s, t_harr);
VTY(s, t_harr); B* sp = harr_ptr(s);
B* sp = harr_ptr(s); usz ia = a(s)->ia;
usz ia = a(s)->ia; if (isAtm(x) || !eqShape(s, x)) {
if (isAtm(x) || !eqShape(s, x)) { if (!isNsp(x)) return false;
if (!isNsp(x)) return false; for (u64 i = 0; i < ia; i++) {
for (u64 i = 0; i < ia; i++) { B c = sp[i];
B c = sp[i]; if (isVar(c)) {
if (isVar(c)) { Scope* sc = pscs[(u16)(c.u>>32)];
Scope* sc = pscs[(u16)(c.u>>32)]; B g = ns_qgetU(x, pos2gid(sc->body, (u32)c.u));
B g = ns_qgetU(x, pos2gid(sc->body, (u32)c.u)); if (q_N(g) || !v_seth(pscs, c, g)) return false;
if (q_N(g) || !v_seth(pscs, c, g)) return false; } else if (isObj(c) && v(c)->type==t_fldAlias) {
} else if (isObj(c) && v(c)->type==t_fldAlias) { assert(v(c)->type == t_fldAlias);
assert(v(c)->type == t_fldAlias); FldAlias* cf = c(FldAlias,c);
FldAlias* cf = c(FldAlias,c); B g = ns_qgetU(x, cf->p);
B g = ns_qgetU(x, cf->p); if (q_N(g) || !v_seth(pscs, cf->obj, g)) return false;
if (q_N(g) || !v_seth(pscs, cf->obj, g)) return false; } else return false;
} else return false; }
return true;
} }
SGetU(x)
for (u64 i = 0; i < ia; i++) if (!v_seth(pscs, sp[i], GetU(x,i))) return false;
return true; return true;
} }
SGetU(x) if (v(s)->type==t_vfyObj) return equal(c(WrappedObj,s)->obj,x);
for (u64 i = 0; i < ia; i++) if (!v_seth(pscs, sp[i], GetU(x,i))) return false; assert(v(s)->type==t_arrMerge);
return true; return v_merge(pscs, s, x, false, true);
} }
NOINLINE B v_getF(Scope* pscs[], B s) { NOINLINE B v_getF(Scope* pscs[], B s) {
if (isExt(s)) { if (isArr(s)) {
Scope* sc = pscs[(u16)(s.u>>32)];
B r = sc->ext->vars[(u32)s.u];
if (r.u==bi_noVar.u) thrM("↩: Reading variable that hasn't been set");
sc->ext->vars[(u32)s.u] = bi_optOut;
return r;
} else if (isObj(s)) {
assert(v(s)->type == t_arrMerge);
return bqn_merge(v_getF(pscs, c(WrappedObj,s)->obj));
} else {
VTY(s, t_harr); VTY(s, t_harr);
usz ia = a(s)->ia; usz ia = a(s)->ia;
B* sp = harr_ptr(s); B* sp = harr_ptr(s);
HArr_p r = m_harrUv(ia); HArr_p r = m_harrUv(ia);
for (u64 i = 0; i < ia; i++) r.a[i] = v_get(pscs, sp[i], true); for (u64 i = 0; i < ia; i++) r.a[i] = v_get(pscs, sp[i], true);
return r.b; return r.b;
} else if (isExt(s)) {
Scope* sc = pscs[(u16)(s.u>>32)];
B r = sc->ext->vars[(u32)s.u];
if (r.u==bi_noVar.u) thrM("↩: Reading variable that hasn't been set");
sc->ext->vars[(u32)s.u] = bi_optOut;
return r;
} else {
assert(isObj(s) && v(s)->type==t_arrMerge);
return bqn_merge(v_getF(pscs, c(WrappedObj,s)->obj));
} }
} }