diff --git a/src/builtins/internal.c b/src/builtins/internal.c index 8ff39486..8618dcc1 100644 --- a/src/builtins/internal.c +++ b/src/builtins/internal.c @@ -231,21 +231,13 @@ static B unshare(B x) { if (!isArr(x)) return x; usz xia = a(x)->ia; switch (v(x)->type) { - case t_i32arr: { - i32* rp; B r = m_i32arrc(&rp, x); - memcpy(rp, i32arr_ptr(x), xia*4); - return r; - } - case t_c32arr: { - u32* rp; B r = m_c32arrc(&rp, x); - memcpy(rp, c32arr_ptr(x), xia*4); - return r; - } - case t_f64arr: { - f64* rp; B r = m_f64arrc(&rp, x); - memcpy(rp, f64arr_ptr(x), xia*8); - return r; - } + case t_i8arr: { i8 * rp; B r = m_i8arrc (&rp, x); memcpy(rp, i8arr_ptr (x), xia*1); return r; } + case t_i16arr: { i16* rp; B r = m_i16arrc(&rp, x); memcpy(rp, i16arr_ptr(x), xia*2); return r; } + case t_i32arr: { i32* rp; B r = m_i32arrc(&rp, x); memcpy(rp, i32arr_ptr(x), xia*4); return r; } + case t_c8arr: { u8 * rp; B r = m_c8arrc (&rp, x); memcpy(rp, c8arr_ptr (x), xia*1); return r; } + case t_c16arr: { u16* rp; B r = m_c16arrc(&rp, x); memcpy(rp, c16arr_ptr(x), xia*2); return r; } + case t_c32arr: { u32* rp; B r = m_c32arrc(&rp, x); memcpy(rp, c32arr_ptr(x), xia*4); return r; } + case t_f64arr: { f64* rp; B r = m_f64arrc(&rp, x); memcpy(rp, f64arr_ptr(x), xia*8); return r; } case t_harr: { HArr_p r = m_harrUc(x); B* xp = harr_ptr(x); diff --git a/src/core/fillarr.c b/src/core/fillarr.c index ecc910e8..274da0ce 100644 --- a/src/core/fillarr.c +++ b/src/core/fillarr.c @@ -111,12 +111,8 @@ B withFill(B x, B fill) { // consumes both if (noFill(fill) && xt!=t_fillarr && xt!=t_fillslice) return x; switch(xt) { case t_f64arr: case t_f64slice: - case t_i8arr: case t_i8slice: if(fill.u == m_i32(0 ).u) return x; break; - case t_i16arr: case t_i16slice: if(fill.u == m_i32(0 ).u) return x; break; - case t_i32arr: case t_i32slice: if(fill.u == m_i32(0 ).u) return x; break; - case t_c8arr: case t_c8slice: if(fill.u == m_c32(' ').u) return x; break; - case t_c16arr: case t_c16slice: if(fill.u == m_c32(' ').u) return x; break; - case t_c32arr: case t_c32slice: if(fill.u == m_c32(' ').u) return x; break; + case t_i32arr: case t_i32slice: case t_i16arr: case t_i16slice: case t_i8arr: case t_i8slice: if(fill.u == m_i32(0 ).u) return x; break; + case t_c32arr: case t_c32slice: case t_c16arr: case t_c16slice: case t_c8arr: case t_c8slice: if(fill.u == m_c32(' ').u) return x; break; case t_fillslice: if (fillEqual(((FillArr*)c(Slice,x)->p)->fill, fill)) { dec(fill); return x; } break; case t_fillarr: if (fillEqual(c(FillArr,x)->fill, fill)) { dec(fill); return x; } if (reusable(x)) { @@ -128,13 +124,11 @@ B withFill(B x, B fill) { // consumes both } usz ia = a(x)->ia; if (isNum(fill)) { - B r = num_squeeze(x); - if (elNum(TI(r,elType))) return r; - x = r; + x = num_squeeze(x); + if (elNum(TI(x,elType))) return x; } else if (isC32(fill)) { - B r = chr_squeeze(x); - if (elChr(TI(r,elType))) return r; - x = r; + x = chr_squeeze(x); + if (elChr(TI(x,elType))) return x; } FillArr* r = m_arr(fsizeof(FillArr,a,B,ia), t_fillarr, ia); arr_shCopy((Arr*)r, x); @@ -144,7 +138,7 @@ B withFill(B x, B fill) { // consumes both B* xp = harr_ptr(x); B* rp = r->a; memcpy(rp, xp, ia*sizeof(B)); - decSh(v(x)); mm_free(v(x)); // manually free x so that refcounting is skipped + tyarr_freeF(v(x)); // manually free x so that decreasing its refcounts is skipped } else { B* xp = hany_ptr(x); B* rp = r->a; @@ -152,12 +146,11 @@ B withFill(B x, B fill) { // consumes both for (usz i = 0; i < ia; i++) inc(rp[i]); dec(x); } - return taga(r); } else { B* rp = r->a; BS2B xget = TI(x,get); for (usz i = 0; i < ia; i++) rp[i] = xget(x,i); dec(x); - return taga(r); } + return taga(r); } diff --git a/src/utils/mut.h b/src/utils/mut.h index 71ef5376..dc464b35 100644 --- a/src/utils/mut.h +++ b/src/utils/mut.h @@ -248,11 +248,10 @@ static B vec_join(B w, B x) { // consumes both if (wt==t_harr && fsizeof(HArr,a,B,ria)ia = ria; B* rp = harr_ptr(w)+wia; - u8 xt = v(x)->type; u8 xe = TI(x,elType); - if (xt==t_harr | xt==t_hslice | xt==t_fillarr) { - B* xp = xt==t_harr? harr_ptr(x) : xt==t_hslice? c(HSlice, x)->a : fillarr_ptr(a(x)); - memcpy(rp, xp, xia*sizeof(B)); + B* xpB = arr_bptr(x); + if (xpB!=NULL) { + memcpy(rp, xpB, xia*sizeof(B)); for (usz i = 0; i < xia; i++) inc(rp[i]); } else if (xe==el_i8 ) { i8* xp=i8any_ptr (x); for (usz i=0; iia; usz ria = wia+1; if (v(w)->refc==1) { diff --git a/src/vm.c b/src/vm.c index e06394db..19f60183 100644 --- a/src/vm.c +++ b/src/vm.c @@ -18,7 +18,7 @@ u32* nextBC(u32* p) { i32 off; - switch(*p) { + switch(*p) { default: UD; case FN1C: case FN2C: case FN1O: case FN2O: case MD1C: case MD2C: case MD2R: case TR2D: case TR3D: case TR3O: @@ -38,7 +38,6 @@ u32* nextBC(u32* p) { off = 3; break; case FN2Oi: case SETHi: off = 5; break; - default: UD; } return p+off; }