From e6f2fc93bede578bb6aee4644c0c9243d4e07d8b Mon Sep 17 00:00:00 2001 From: dzaima Date: Mon, 24 May 2021 12:11:53 +0300 Subject: [PATCH] =?UTF-8?q?=E2=8A=8F=20improvements?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/builtins/arith.c | 2 +- src/builtins/sfns.c | 18 +++++++++++++----- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/builtins/arith.c b/src/builtins/arith.c index 94563386..4368da64 100644 --- a/src/builtins/arith.c +++ b/src/builtins/arith.c @@ -138,7 +138,7 @@ CMP(> , gt, 1) #undef ffn #undef ffnx -static B decp_c1(B t, B x); +B decp_c1(B t, B x); #define CMP_IMPL(OP) \ if (isF64(w)&isF64(x)) return m_i32(w.f OP x.f); \ bool wa = isArr(w); \ diff --git a/src/builtins/sfns.c b/src/builtins/sfns.c index 0e3d3501..2833983e 100644 --- a/src/builtins/sfns.c +++ b/src/builtins/sfns.c @@ -103,8 +103,17 @@ B select_c2(B t, B w, B x) { i32* xp = i32any_ptr(x); for (usz i = 0; i < wia; i++) { i64 c = wp[i]; - if (c<0) c+= xia; - if (c<0 | c>=xia) thrF("โŠ: Indexing out-of-bounds (%iโˆŠ๐•จ, %sโ‰กโ‰ ๐•ฉ)", wp[i], xia); + if (c<0) c+= xia; if ((u64)c >= xia) thrF("โŠ: Indexing out-of-bounds (%iโˆŠ๐•จ, %sโ‰กโ‰ ๐•ฉ)", wp[i], xia); + rp[i] = xp[c]; + } + dec(w); dec(x); + return r; + } else if (TI(x).elType==el_c32) { + u32* rp; B r = m_c32arrc(&rp, w); + u32* xp = c32any_ptr(x); + for (usz i = 0; i < wia; i++) { + i64 c = wp[i]; + if (c<0) c+= xia; if ((u64)c >= xia) thrF("โŠ: Indexing out-of-bounds (%iโˆŠ๐•จ, %sโ‰กโ‰ ๐•ฉ)", wp[i], xia); rp[i] = xp[c]; } dec(w); dec(x); @@ -113,8 +122,7 @@ B select_c2(B t, B w, B x) { HArr_p r = m_harrUc(w); for (usz i = 0; i < wia; i++) { i64 c = wp[i]; - if (c<0) c+= xia; - if (c<0 | c>=xia) thrF("โŠ: Indexing out-of-bounds (%iโˆŠ๐•จ, %sโ‰กโ‰ ๐•ฉ)", wp[i], xia); + if (c<0) c+= xia; if ((u64)c >= xia) thrF("โŠ: Indexing out-of-bounds (%iโˆŠ๐•จ, %sโ‰กโ‰ ๐•ฉ)", wp[i], xia); r.a[i] = xget(x, c); } dec(w); dec(x); @@ -675,7 +683,7 @@ B reverse_c2(B t, B w, B x) { usz cam = a(x)->sh[0]; usz csz = arr_csz(x); i64 am = o2i64(w); - if (am<0 || am>=cam) { am%= cam; if(am<0) am+= cam; } + if ((usz)am >= cam) { am%= cam; if(am<0) am+= cam; } am*= csz; MAKE_MUT(r, xia); mut_to(r, TI(x).elType); mut_copy(r, 0, x, am, xia-am);