From 6307356bab7c64fe695c67aec95c7987ae88ae06 Mon Sep 17 00:00:00 2001 From: dzaima Date: Tue, 14 Jun 2022 02:40:50 +0300 Subject: [PATCH] rearrange common array case to top --- src/vm.c | 67 +++++++++++++++++++++++++++++--------------------------- 1 file changed, 35 insertions(+), 32 deletions(-) diff --git a/src/vm.c b/src/vm.c index 96d5f058..b1f77590 100644 --- a/src/vm.c +++ b/src/vm.c @@ -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) { - if (v(s)->type==t_vfyObj) return equal(c(WrappedObj,s)->obj,x); - if (v(s)->type==t_arrMerge) return v_merge(pscs, s, x, false, true); - VTY(s, t_harr); - B* sp = harr_ptr(s); - usz ia = a(s)->ia; - if (isAtm(x) || !eqShape(s, x)) { - if (!isNsp(x)) return false; - for (u64 i = 0; i < ia; i++) { - B c = sp[i]; - if (isVar(c)) { - Scope* sc = pscs[(u16)(c.u>>32)]; - B g = ns_qgetU(x, pos2gid(sc->body, (u32)c.u)); - if (q_N(g) || !v_seth(pscs, c, g)) return false; - } else if (isObj(c) && v(c)->type==t_fldAlias) { - assert(v(c)->type == t_fldAlias); - FldAlias* cf = c(FldAlias,c); - B g = ns_qgetU(x, cf->p); - if (q_N(g) || !v_seth(pscs, cf->obj, g)) return false; - } else return false; + if (isArr(s)) { + VTY(s, t_harr); + B* sp = harr_ptr(s); + usz ia = a(s)->ia; + if (isAtm(x) || !eqShape(s, x)) { + if (!isNsp(x)) return false; + for (u64 i = 0; i < ia; i++) { + B c = sp[i]; + if (isVar(c)) { + Scope* sc = pscs[(u16)(c.u>>32)]; + B g = ns_qgetU(x, pos2gid(sc->body, (u32)c.u)); + if (q_N(g) || !v_seth(pscs, c, g)) return false; + } else if (isObj(c) && v(c)->type==t_fldAlias) { + assert(v(c)->type == t_fldAlias); + FldAlias* cf = c(FldAlias,c); + B g = ns_qgetU(x, cf->p); + if (q_N(g) || !v_seth(pscs, cf->obj, g)) 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; } - SGetU(x) - for (u64 i = 0; i < ia; i++) if (!v_seth(pscs, sp[i], GetU(x,i))) return false; - return true; + if (v(s)->type==t_vfyObj) return equal(c(WrappedObj,s)->obj,x); + assert(v(s)->type==t_arrMerge); + return v_merge(pscs, s, x, false, true); } NOINLINE B v_getF(Scope* pscs[], B s) { - 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 if (isObj(s)) { - assert(v(s)->type == t_arrMerge); - return bqn_merge(v_getF(pscs, c(WrappedObj,s)->obj)); - } else { + if (isArr(s)) { VTY(s, t_harr); usz ia = a(s)->ia; B* sp = harr_ptr(s); HArr_p r = m_harrUv(ia); for (u64 i = 0; i < ia; i++) r.a[i] = v_get(pscs, sp[i], true); 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)); } }