From 99896fbace7392e97403da54b8da351dabd7419a Mon Sep 17 00:00:00 2001 From: dzaima Date: Tue, 20 Jul 2021 21:32:41 +0300 Subject: [PATCH] improving loop counter variable types --- src/builtins/sfns.c | 23 +++++++++++++++-------- src/core/harr.c | 2 +- src/core/stuff.c | 6 +++--- src/load.c | 8 ++++---- 4 files changed, 23 insertions(+), 16 deletions(-) diff --git a/src/builtins/sfns.c b/src/builtins/sfns.c index 2e1fe2df..166baff5 100644 --- a/src/builtins/sfns.c +++ b/src/builtins/sfns.c @@ -204,18 +204,25 @@ B slash_c1(B t, B x) { if(s<0) thrM("/: Argument must consist of natural numbers"); usz xia = a(x)->ia; if (RARE(xia>=I32_MAX)) return slash_c1R(x, s); - i32* rp; B r = m_i32arrv(&rp, s); usz ri = 0; + i32* rp; B r = m_i32arrv(&rp, s); if (TI(x,elType)==el_i32) { i32* xp = i32any_ptr(x); + while (xia>0 && !xp[xia-1]) xia--; for (i32 i = 0; i < xia; i++) { - if (RARE(xp[i])<0) thrF("/: Argument must consist of natural numbers (contained %i)", xp[i]); - for (usz j = 0; j < xp[i]; j++) rp[ri++] = i; + i32 c = xp[i]; + if (LIKELY(c==0 || c==1)) { + *rp = i; + rp+= c; + } else { + if (RARE(c)<0) thrF("/: Argument must consist of natural numbers (contained %i)", c); + for (i32 j = 0; j < c; j++) *rp++ = i; + } } } else { BS2B xgetU = TI(x,getU); - for (i32 i = 0; i < xia; i++) { + for (u64 i = 0; i < xia; i++) { usz c = o2s(xgetU(x, i)); - for (usz j = 0; j < c; j++) rp[ri++] = i; + for (u64 j = 0; j < c; j++) *rp++ = i; } } dec(x); @@ -256,7 +263,7 @@ B slash_c2(B t, B w, B x) { for (usz i = 0; i < wia; i++) { i32 cw = wp[i]; i32 cx = xp[i]; - for (usz j = 0; j < cw; j++) *rp++ = cx; + for (i64 j = 0; j < cw; j++) *rp++ = cx; } } dec(w); dec(x); @@ -267,7 +274,7 @@ B slash_c2(B t, B w, B x) { for (usz i = 0; i < wia; i++) { i32 cw = wp[i]; f64 cx = xp[i]; - for (usz j = 0; j < cw; j++) *rp++ = cx; + for (i64 j = 0; j < cw; j++) *rp++ = cx; } dec(w); dec(x); return r; @@ -278,7 +285,7 @@ B slash_c2(B t, B w, B x) { i32 cw = wp[i]; if (cw==0) continue; B cx = xgetU(x, i); - for (usz j = 0; j < cw; j++) r.a[ri++] = inc(cx); + for (i64 j = 0; j < cw; j++) r.a[ri++] = inc(cx); } dec(w); dec(x); return withFill(harr_fv(r), xf); diff --git a/src/core/harr.c b/src/core/harr.c index 7b862a36..2d33b683 100644 --- a/src/core/harr.c +++ b/src/core/harr.c @@ -22,7 +22,7 @@ B toCells(B x) { usz cr = rnk(x)-1; ShArr* csh = m_shArr(cr); usz* xsh = a(x)->sh; - for (i32 i = 0; i < cr; i++) csh->a[i] = xsh[i+1]; + for (u64 i = 0; i < cr; i++) csh->a[i] = xsh[i+1]; for (; i < cam; i++) { Arr* s = slice(inc(x), p); arr_shSetI(s, csz, cr, csh); diff --git a/src/core/stuff.c b/src/core/stuff.c index a914a38a..db6db5f8 100644 --- a/src/core/stuff.c +++ b/src/core/stuff.c @@ -319,7 +319,7 @@ NOINLINE bool atomEqualR(B w, B x) { if (o2i(wdp[0])<=1) { dec(wd);dec(xd); return false; } usz wia = a(wd)->ia; if (wia!=a(xd)->ia) { dec(wd);dec(xd); return false; } - for (i32 i = 0; iia; if (wia!=a(xd)->ia) { dec(wd);dec(xd); return false; } - for (i32 i = 0; iia; - for (i32 i = 1; iia; diff --git a/src/load.c b/src/load.c index c749a7b0..c26167dc 100644 --- a/src/load.c +++ b/src/load.c @@ -148,13 +148,13 @@ NOINLINE Block* bqn_compSc(B str, B path, B args, Scope* sc, bool repl) { // con i32 depth = repl? -1 : 0; Scope* csc = sc; while (csc) { - for (i32 i = 0; i < csc->varAm; i++) { + for (u64 i = 0; i < csc->varAm; i++) { i32 nameID = csc->body->varIDs[i]; B nl = csc->body->nsDesc->nameList; vName = vec_add(vName, TI(nl,get)(nl, nameID)); vDepth = vec_add(vDepth, m_i32(depth)); } - if (csc->ext) for (i32 i = 0; i < csc->ext->varAm; i++) { + if (csc->ext) for (u64 i = 0; i < csc->ext->varAm; i++) { vName = vec_add(vName, inc(csc->ext->vars[i+csc->ext->varAm])); vDepth = vec_add(vDepth, m_i32(depth)); } @@ -205,7 +205,7 @@ static inline void load_init() { // very last init function /* ⚇⍟⎊ */ 0,1,1 }; assert(sizeof(fruntime)/sizeof(B) == rtLen); - for (i32 i = 0; i < rtLen; i++) inc(fruntime[i]); + for (u64 i = 0; i < rtLen; i++) inc(fruntime[i]); B frtObj = m_caB(rtLen, fruntime); #ifndef NO_RT @@ -375,7 +375,7 @@ static B empty_getU(B x, usz n) { #endif static inline void base_init() { // very first init function - for (i32 i = 0; i < t_COUNT; i++) { + for (u64 i = 0; i < t_COUNT; i++) { TIi(i,free) = def_free; TIi(i,visit) = def_visit; TIi(i,get) = def_get;