store object pointer in slice

This commit is contained in:
dzaima 2021-08-01 18:59:31 +03:00
parent be10e0d509
commit 8d7a31c8e9
8 changed files with 21 additions and 22 deletions

View File

@ -19,14 +19,14 @@ B m_str32(u32* s) {
return r;
}
static Arr* m_c32slice(B p, u32* ptr) {
static Arr* m_c32slice(Arr* p, u32* ptr) {
C32Slice* r = mm_alloc(sizeof(C32Slice), t_c32slice);
r->p = p;
r->a = ptr;
return (Arr*)r;
}
static Arr* c32arr_slice (B x, usz s) { return m_c32slice(x , c(C32Arr ,x)->a+s); }
static Arr* c32slice_slice(B x, usz s) { Arr* r = m_c32slice(inc(c(Slice,x)->p), c(C32Slice,x)->a+s); dec(x); return r; }
static Arr* c32arr_slice (B x, usz s) { return m_c32slice(a(x), c(C32Arr,x)->a+s); }
static Arr* c32slice_slice(B x, usz s) { Arr* p=c(Slice,x)->p; ptr_inc(p); Arr* r = m_c32slice(p, c(C32Slice,x)->a+s); dec(x); return r; }
static B c32arr_get (B x, usz n) { VTY(x,t_c32arr ); return m_c32(c(C32Arr ,x)->a[n]); }
static B c32slice_get(B x, usz n) { VTY(x,t_c32slice); return m_c32(c(C32Slice,x)->a[n]); }

View File

@ -6,14 +6,14 @@ NOINLINE B m_caf64(usz sz, f64* a) {
return r;
}
static Arr* m_f64slice(B p, f64* ptr) {
static Arr* m_f64slice(Arr* p, f64* ptr) {
F64Slice* r = mm_alloc(sizeof(F64Slice), t_f64slice);
r->p = p;
r->a = ptr;
return (Arr*)r;
}
static Arr* f64arr_slice (B x, usz s) { return m_f64slice(x , c(F64Arr ,x)->a+s); }
static Arr* f64slice_slice(B x, usz s) { Arr* r = m_f64slice(inc(c(Slice,x)->p), c(F64Slice,x)->a+s); dec(x); return r; }
static Arr* f64arr_slice (B x, usz s) { return m_f64slice(a(x), c(F64Arr ,x)->a+s); }
static Arr* f64slice_slice(B x, usz s) { Arr* p=c(Slice,x)->p; ptr_inc(p); Arr* r = m_f64slice(p, c(F64Slice,x)->a+s); dec(x); return r; }
static B f64arr_get (B x, usz n) { VTY(x,t_f64arr ); return m_f64(c(F64Arr ,x)->a[n]); }
static B f64slice_get(B x, usz n) { VTY(x,t_f64slice); return m_f64(c(F64Slice,x)->a[n]); }

View File

@ -31,15 +31,14 @@ B asFill(B x) { // consumes
return bi_noFill;
}
static Arr* m_fillslice(B p, B* ptr) {
static Arr* m_fillslice(Arr* p, B* ptr) {
FillSlice* r = mm_alloc(sizeof(FillSlice), t_fillslice);
r->p = p;
r->a = ptr;
return (Arr*)r;
}
static Arr* fillarr_slice (B x, usz s) { return m_fillslice(x , c(FillArr ,x)->a+s); }
static Arr* fillslice_slice(B x, usz s) { Arr* r = m_fillslice(inc(c(Slice,x)->p), c(FillSlice,x)->a+s); dec(x); return r; }
static Arr* fillarr_slice (B x, usz s) { return m_fillslice(a(x), c(FillArr,x)->a+s); }
static Arr* fillslice_slice(B x, usz s) { Arr* p=c(Slice,x)->p; ptr_inc(p); Arr* r = m_fillslice(p, c(FillSlice,x)->a+s); dec(x); return r; }
static B fillarr_get (B x, usz n) { VTY(x,t_fillarr ); return inc(c(FillArr ,x)->a[n]); }
static B fillslice_get (B x, usz n) { VTY(x,t_fillslice); return inc(c(FillSlice,x)->a[n]); }
@ -116,7 +115,7 @@ B withFill(B x, B fill) { // consumes both
case t_f64arr: case t_f64slice:
case t_i32arr: case t_i32slice: if(fill.u == m_i32(0 ).u) return x; break;
case t_c32arr: case t_c32slice: if(fill.u == m_c32(' ').u) return x; break;
case t_fillslice: if (fillEqual(c(FillArr,c(Slice,x)->p)->fill, fill)) { dec(fill); 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)) {
dec(c(FillArr, x)->fill);

View File

@ -33,8 +33,8 @@ static B getFillR(B x) { // doesn't consume; can return bi_noFill
case el_c32: return m_c32(' ');
case el_B:;
u8 t = v(x)->type;
if (t==t_fillarr ) return inc(c(FillArr,x )->fill);
if (t==t_fillslice) return inc(c(FillArr,c(Slice,x)->p)->fill);
if (t==t_fillarr ) return inc(c(FillArr,x )->fill);
if (t==t_fillslice) return inc(((FillArr*)c(Slice,x)->p)->fill);
return bi_noFill;
}
}

View File

@ -91,14 +91,14 @@ NOINLINE void harr_pfree(B x, usz am) { // am - item after last written
static Arr* m_hslice(B p, B* ptr) {
static Arr* m_hslice(Arr* p, B* ptr) {
HSlice* r = mm_alloc(sizeof(HSlice), t_hslice);
r->p = p;
r->a = ptr;
return (Arr*)r;
}
static Arr* harr_slice (B x, usz s) { return m_hslice(x , c(HArr ,x)->a+s); }
static Arr* hslice_slice(B x, usz s) { Arr* r = m_hslice(inc(c(Slice,x)->p), c(HSlice,x)->a+s); dec(x); return r; }
static Arr* harr_slice (B x, usz s) { return m_hslice(a(x), c(HArr,x)->a+s); }
static Arr* hslice_slice(B x, usz s) { Arr* p=c(Slice,x)->p; ptr_inc(p); Arr* r = m_hslice(p, c(HSlice,x)->a+s); dec(x); return r; }
static B harr_get (B x, usz n) { VTY(x,t_harr ); return inc(c(HArr ,x)->a[n]); }
static B hslice_get (B x, usz n) { VTY(x,t_hslice); return inc(c(HSlice,x)->a[n]); }

View File

@ -6,14 +6,14 @@ NOINLINE B m_cai32(usz ia, i32* a) {
return r;
}
static Arr* m_i32slice(B p, i32* ptr) {
static Arr* m_i32slice(Arr* p, i32* ptr) {
I32Slice* r = mm_alloc(sizeof(I32Slice), t_i32slice);
r->p = p;
r->a = ptr;
return (Arr*)r;
}
static Arr* i32arr_slice (B x, usz s) { return m_i32slice(x , c(I32Arr ,x)->a+s); }
static Arr* i32slice_slice(B x, usz s) { Arr* r = m_i32slice(inc(c(Slice,x)->p), c(I32Slice,x)->a+s); dec(x); return r; }
static Arr* i32arr_slice (B x, usz s) { return m_i32slice(a(x), c(I32Arr,x)->a+s); }
static Arr* i32slice_slice(B x, usz s) { Arr* p=c(Slice,x)->p; ptr_inc(p); Arr* r = m_i32slice(p, c(I32Slice,x)->a+s); dec(x); return r; }
static B i32arr_get (B x, usz n) { VTY(x,t_i32arr ); return m_i32(c(I32Arr ,x)->a[n]); }
static B i32slice_get(B x, usz n) { VTY(x,t_i32slice); return m_i32(c(I32Slice,x)->a[n]); }

View File

@ -398,10 +398,10 @@ u64 depth(B x) { // doesn't consume
return r+1;
}
void tyarr_freeO(Value* x) { decSh(x); }
void slice_freeO(Value* x) { dec(((Slice*)x)->p); decSh(x); }
void slice_freeO(Value* x) { ptr_dec(((Slice*)x)->p); decSh(x); }
void tyarr_freeF(Value* x) { tyarr_freeO(x); mm_free(x); }
void slice_freeF(Value* x) { slice_freeO(x); mm_free(x); }
void slice_visit(Value* x) { mm_visit(((Slice*)x)->p); }
void slice_visit(Value* x) { mm_visitP(((Slice*)x)->p); }
void slice_print(B x) { arr_print(x); }
char* format_type(u8 u) {

View File

@ -344,7 +344,7 @@ static bool q_f64(B x) { return isF64(x) || isI32(x); }
typedef struct Slice {
struct Arr;
B p;
Arr* p;
} Slice;
void tyarr_freeO(Value* x); void tyarr_freeF(Value* x);
void slice_freeO(Value* x); void slice_freeF(Value* x);