more changes

This commit is contained in:
dzaima 2021-09-09 18:42:48 +03:00
parent 85dd03ac11
commit 337a6bbc5e
4 changed files with 20 additions and 37 deletions

View File

@ -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);

View File

@ -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);
}

View File

@ -248,11 +248,10 @@ static B vec_join(B w, B x) { // consumes both
if (wt==t_harr && fsizeof(HArr,a,B,ria)<wsz) {
a(w)->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; i<xia; i++) rp[i] = m_i32(xp[i]); }
@ -276,7 +275,7 @@ static B vec_join(B w, B x) { // consumes both
dec(w); dec(x);
return mut_fv(r);
}
static inline bool inplace_add(B w, B x) { // fails if fills wouldn't be correct
static inline bool inplace_add(B w, B x) { // consumes x if returns true; fails if fills wouldn't be correct
usz wia = a(w)->ia;
usz ria = wia+1;
if (v(w)->refc==1) {

View File

@ -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;
}