From b7c3815d4a793cd2ac52f819329c9d8661b24429 Mon Sep 17 00:00:00 2001 From: dzaima Date: Fri, 13 Sep 2024 19:10:46 +0300 Subject: [PATCH] copy fallback instead of slice in take_head --- src/builtins/sfns.c | 42 +++++++++++++++++++++++++++++------------- 1 file changed, 29 insertions(+), 13 deletions(-) diff --git a/src/builtins/sfns.c b/src/builtins/sfns.c index 9c994a51..70042bc2 100644 --- a/src/builtins/sfns.c +++ b/src/builtins/sfns.c @@ -66,29 +66,45 @@ static Arr* take_head(usz ria, B x) { // consumes; returns ria↑x with unset sh if (reusable(x)) { usz xia = IA(x); u64 tgt = mm_sizeUsable(v(x)) / 4; // ÷4 to, even at minimum initial bucket utilization, require at least halving size before stopping in-place truncation - switch (TY(x)) { + u64 used; + u8 xt = TY(x); + switch (xt) { default: goto base; - case t_bitarr: if (BITARR_SZ( ria)ia = ria; return a(x); + + try_copy:; + // if (used > 64) goto base; + MAKE_MUT_INIT(rm, ria, TI(x,elType)); MUTG_INIT(rm); + mut_copyG(rm, 0, x, 0, ria); + Arr* r = mut_fp(rm); + if (xt==t_fillarr) r = a(withFill(taga(arr_shVec(r)), getFillR(x))); + decG(x); + return r; } base:; return TI(x,slice)(x,0,ria);