rearrange common array case to top
This commit is contained in:
parent
f3fffd2b8d
commit
6307356bab
27
src/vm.c
27
src/vm.c
@ -545,8 +545,7 @@ 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;
|
||||||
@ -570,27 +569,31 @@ NOINLINE bool v_sethF(Scope* pscs[], B s, B x) {
|
|||||||
SGetU(x)
|
SGetU(x)
|
||||||
for (u64 i = 0; i < ia; i++) if (!v_seth(pscs, sp[i], GetU(x,i))) return false;
|
for (u64 i = 0; i < ia; i++) if (!v_seth(pscs, sp[i], GetU(x,i))) return false;
|
||||||
return true;
|
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) {
|
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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user