From 76dbabb03d426f2b5d44ec4da87c0a57826e56fe Mon Sep 17 00:00:00 2001 From: dzaima Date: Mon, 26 Apr 2021 10:46:33 +0300 Subject: [PATCH] finish separating arr_shAlloc --- src/c32arr.c | 6 ++++-- src/fillarr.c | 4 ++-- src/h.h | 27 ++++++++++++++------------- src/harr.c | 6 ++++-- src/i32arr.c | 6 ++++-- src/main.c | 2 +- src/md1.c | 2 +- src/sfns.c | 2 +- 8 files changed, 31 insertions(+), 24 deletions(-) diff --git a/src/c32arr.c b/src/c32arr.c index 5c6a8948..7645da04 100644 --- a/src/c32arr.c +++ b/src/c32arr.c @@ -16,8 +16,10 @@ B m_c32arrc(B x) { assert(isArr(x)); arr_shCopy(r, x); return r; } -B m_c32arrp(usz ia) { // doesn't write any shape/size info! be careful! - return m_arr(fsizeof(C32Arr,a,u32,ia), t_c32arr); +B m_c32arrp(usz ia) { // doesn't write shape/rank + B r = m_arr(fsizeof(C32Arr,a,u32,ia), t_c32arr); + a(r)->ia = ia; + return r; } diff --git a/src/fillarr.c b/src/fillarr.c index 24ce91cc..fe503b24 100644 --- a/src/fillarr.c +++ b/src/fillarr.c @@ -89,12 +89,12 @@ B m_unit(B x) { B xf = asFill(inc(x)); if (noFill(xf)) { HArr_p r = m_harrp(1); - arr_shAlloc(r.b, 1, 0); + arr_shAllocR(r.b, 0); r.a[0] = x; return r.b; } B r = m_arr(fsizeof(FillArr,a,B,1), t_fillarr); - arr_shAlloc(r, 1, 0); + arr_shAllocI(r, 1, 0); c(FillArr,r)->fill = xf; c(FillArr,r)->a[0] = x; return r; diff --git a/src/h.h b/src/h.h index 55babeb2..2ab7fe02 100644 --- a/src/h.h +++ b/src/h.h @@ -32,16 +32,6 @@ #define CTR_PRINT(N) printf(#N ": %lu\n", N); CTR_FOR(CTR_DEF) -#ifdef DEBUG - #include - B VALIDATE(B x); - Value* VALIDATEP(Value* x); -#else - #define assert(x) {if (!(x)) __builtin_unreachable();} - #define VALIDATE(x) (x) - #define VALIDATEP(x) (x) -#endif - #define fsizeof(T,F,E,n) (offsetof(T, F) + sizeof(E)*(n)) // type, flexible array member name, flexible array member type, item amount #define ftag(x) ((u64)(x) << 48) #define tag(v, t) b(((u64)(v)) | ftag(t)) @@ -161,6 +151,16 @@ typedef struct Arr { usz* sh; } Arr; +#ifdef DEBUG + #include + B VALIDATE(B x); + Value* VALIDATEP(Value* x); +#else + #define assert(x) {if (!(x)) __builtin_unreachable();} + #define VALIDATE(x) (x) + #define VALIDATEP(x) (x) +#endif + // memory manager typedef void (*V2v)(Value*); typedef void (*vfn)(); @@ -187,6 +187,7 @@ B mm_alloc(usz sz, u8 type, u64 tag) { return b((u64)mm_allocN(sz,type) | tag); } + // some primitive actions void dec(B x); B inc(B x); @@ -278,14 +279,14 @@ void arr_shVec(B x, usz ia) { a(x)->sh = &a(x)->ia; } bool gotShape[t_COUNT]; -usz* arr_shAlloc(B x, usz ia, ur r) { +usz* arr_shAllocI(B x, usz ia, ur r) { a(x)->ia = ia; srnk(x,r); if (r>1) return a(x)->sh = ((ShArr*)mm_allocN(fsizeof(ShArr, a, usz, r), t_shape))->a; a(x)->sh = &a(x)->ia; return 0; } -usz* arr_shAllocR(B x, ur r) { // allocates shape, leaves ia unchanged +usz* arr_shAllocR(B x, ur r) { // allocates shape, sets rank, leaves ia unchanged srnk(x,r); if (r>1) return a(x)->sh = ((ShArr*)mm_allocN(fsizeof(ShArr, a, usz, r), t_shape))->a; a(x)->sh = &a(x)->ia; @@ -467,7 +468,7 @@ B m_atop( B g, B h); #include -u64 nsTime() { +static inline u64 nsTime() { struct timespec t; timespec_get(&t, TIME_UTC); // clock_gettime(CLOCK_REALTIME, &t); diff --git a/src/harr.c b/src/harr.c index 98f3818d..1332f31b 100644 --- a/src/harr.c +++ b/src/harr.c @@ -28,8 +28,10 @@ HArr_p m_harrc(B x) { assert(isArr(x)); return harr_parts(r); } -HArr_p m_harrp(usz ia) { // doesn't write any shape/size info! be careful! - return harr_parts(m_arr(fsizeof(HArr,a,B,ia), t_harr)); +HArr_p m_harrp(usz ia) { // doesn't write shape/rank + B r = m_arr(fsizeof(HArr,a,B,ia), t_harr); + a(r)->ia = ia; + return harr_parts(r); } diff --git a/src/i32arr.c b/src/i32arr.c index 1f389033..3d1fc628 100644 --- a/src/i32arr.c +++ b/src/i32arr.c @@ -16,8 +16,10 @@ B m_i32arrc(B x) { assert(isArr(x)); arr_shCopy(r, x); return r; } -B m_i32arrp(usz ia) { // doesn't write any shape/size info! be careful! - return m_arr(fsizeof(I32Arr,a,i32,ia), t_i32arr); +B m_i32arrp(usz ia) { // doesn't write shape/rank + B r = m_arr(fsizeof(I32Arr,a,i32,ia), t_i32arr); + a(r)->ia = ia; + return r; } diff --git a/src/main.c b/src/main.c index a7f57eee..1a8b246a 100644 --- a/src/main.c +++ b/src/main.c @@ -52,7 +52,7 @@ Block* ca3(B b) { return r; } -ssize_t getline(char** __lineptr, size_t* n, FILE* stream); +ssize_t getline(char** line, size_t* n, FILE* stream); void printAllocStats() { diff --git a/src/md1.c b/src/md1.c index 31dfed5b..1f3d3a85 100644 --- a/src/md1.c +++ b/src/md1.c @@ -13,7 +13,7 @@ B tbl_c2(B d, B w, B x) { B f = c(Md1D,d)->f; usz ria = wia*xia; ur rr = wr+xr; if (rrsh, wr*sizeof(usz)); memcpy(rsh+wr, a(x)->sh, xr*sizeof(usz)); diff --git a/src/sfns.c b/src/sfns.c index af82242f..3f7e0628 100644 --- a/src/sfns.c +++ b/src/sfns.c @@ -156,7 +156,7 @@ B shape_c2(B t, B w, B x) { B r; if (reusable(x)) { r = x; decSh(x); } else r = TI(x).slice(x, 0); - usz* sh = arr_shAlloc(r, nia, nr); + usz* sh = arr_shAllocI(r, nia, nr); if (sh) for (i32 i = 0; i < nr; i++) sh[i] = o2s(wget(w,i)); dec(w); return r;