From aa365317838f4f466e60c34bae23342adec53794 Mon Sep 17 00:00:00 2001 From: dzaima Date: Fri, 21 May 2021 00:05:11 +0300 Subject: [PATCH] temporary allocations --- src/file.c | 7 +++++-- src/fns.c | 4 ++-- src/h.h | 8 ++++---- src/hash.c | 3 ++- src/md1.c | 1 + src/md2.c | 4 ++-- src/sfns.c | 25 ++++++++++++++----------- src/sort.c | 3 ++- src/stuff.c | 6 ++++++ src/sysfn.c | 5 ++--- src/utf.c | 2 +- 11 files changed, 41 insertions(+), 27 deletions(-) diff --git a/src/file.c b/src/file.c index 6376f796..b07f7381 100644 --- a/src/file.c +++ b/src/file.c @@ -5,11 +5,13 @@ typedef struct TmpFile { // to be turned into a proper I8Arr FILE* file_open(B path, char* desc, char* mode) { // consumes path; can error u64 plen = utf8lenB(path); - char p[plen+1]; + TALLOC(char, p, plen+1); toUTF8(path, p); p[plen] = 0; FILE* f = fopen(p, mode); + TFREE(p); if (f==NULL) thrF("Couldn't %S file \"%R\"", desc, path); + dec(path); return f; } @@ -76,9 +78,10 @@ void file_write(B path, B x) { // consumes path FILE* f = file_open(path, "write to", "w"); u64 len = utf8lenB(x); - char val[len]; + TALLOC(char, val, len); toUTF8(x, val); fwrite(val, 1, len, f); + TFREE(val); fclose(f); } diff --git a/src/fns.c b/src/fns.c index ba1ec3af..383d8ebd 100644 --- a/src/fns.c +++ b/src/fns.c @@ -234,7 +234,7 @@ B indexOf_c1(B t, B x) { i32 dst = 1 + max-(i64)min; if ((dstf; if (p[pos]=='\r' && pos+1f; diff --git a/src/md2.c b/src/md2.c index 09221a60..76adc409 100644 --- a/src/md2.c +++ b/src/md2.c @@ -81,7 +81,7 @@ B repeat_replace(B g, B* q) { // doesn't consume i64 bound[2] = {0,0}; \ repeat_bounds(bound, g); \ u64 min=(u64)-bound[0]; u64 max=(u64)bound[1]; \ - B all[min+max+1]; \ + TALLOC(B, all, min+max+1); \ B* q = all+min; \ q[0] = inc(x); \ if (min) { \ @@ -96,7 +96,7 @@ B repeat_replace(B g, B* q) { // doesn't consume B r = repeat_replace(g, q); \ dec(g); \ for (u64 i = 0; i < min+max+1; i++) dec(all[i]); \ - END; \ + END; TFREE(all); \ return r; B repeat_c1(B d, B x) { REPEAT_T(c1,{} ); } diff --git a/src/sfns.c b/src/sfns.c index 76cd2b5c..d1acaaf5 100644 --- a/src/sfns.c +++ b/src/sfns.c @@ -651,8 +651,8 @@ B group_c2(B t, B w, B x) { for (usz i = 0; i < xia; i++) if (wp[i]>ria) ria = wp[i]; if (ria>USZ_MAX-1) thrOOM(); ria++; - i32 len[ria]; - i32 pos[ria]; + TALLOC(i32, len, ria); + TALLOC(i32, pos, ria); for (usz i = 0; i < ria; i++) len[i] = pos[i] = 0; for (usz i = 0; i < xia; i++) { i32 n = wp[i]; if (n>=0) len[n]++; } @@ -689,7 +689,7 @@ B group_c2(B t, B w, B x) { } for (usz i = 0; i < ria; i++) { arr_shVec(rp[i], len[i]); } } - dec(w); dec(x); + dec(w); dec(x); TFREE(len); TFREE(pos); return r; } else { BS2B wgetU = TI(w).getU; @@ -701,8 +701,8 @@ B group_c2(B t, B w, B x) { } if (ria>USZ_MAX-1) thrOOM(); ria++; - i32 len[ria]; - i32 pos[ria]; + TALLOC(i32, len, ria); + TALLOC(i32, pos, ria); for (usz i = 0; i < ria; i++) len[i] = pos[i] = 0; for (usz i = 0; i < xia; i++) { i64 n = o2i64u(wgetU(w, i)); @@ -732,7 +732,7 @@ B group_c2(B t, B w, B x) { if (n>=0) fillarr_ptr(rp[n])[pos[n]++] = xget(x, i); } for (usz i = 0; i < ria; i++) { arr_shVec(rp[i], len[i]); } - dec(w); dec(x); + dec(w); dec(x); TFREE(len); TFREE(pos); return r; } } @@ -872,11 +872,13 @@ B select_ucw(B t, B o, B w, B x) { B rep = c1(o, arg); if (isAtm(rep) || rnk(rep)!=1 || a(rep)->ia != wia) thrF("š”½āŒ¾(aāŠøāŠ)š•©: Result of š”½ must have the same shape as aāŠš•© (expected ⟨%s⟩, got %H)", wia, rep); #if CHECK_VALID - bool set[xia]; + TALLOC(bool, set, xia); for (i64 i = 0; i < xia; i++) set[i] = false; #define EQ(F) if (set[cw] && (F)) thrM("š”½āŒ¾(aāŠøāŠ): Incompatible result elements"); set[cw] = true; + #define FREE_CHECK TFREE(set) #else #define EQ(F) + #define FREE_CHECK #endif if (TI(w).elType==el_i32) { i32* wp = i32any_ptr(w); @@ -890,7 +892,7 @@ B select_ucw(B t, B o, B w, B x) { EQ(cr!=xp[cw]); xp[cw] = cr; } - dec(w); dec(rep); + dec(w); dec(rep); FREE_CHECK; return x; } else if (v(x)->type==t_harr) { B* xp = harr_ptr(x); @@ -902,7 +904,7 @@ B select_ucw(B t, B o, B w, B x) { dec(xp[cw]); xp[cw] = cr; } - dec(w); dec(rep); + dec(w); dec(rep); FREE_CHECK; return x; } } @@ -916,7 +918,7 @@ B select_ucw(B t, B o, B w, B x) { mut_rm(r, cw); mut_setS(r, cw, cr); } - dec(w); dec(rep); + dec(w); dec(rep); FREE_CHECK; return mut_fcd(r, x); } MAKE_MUT(r, xia); mut_to(r, el_or(TI(x).elType, TI(rep).elType)); @@ -929,9 +931,10 @@ B select_ucw(B t, B o, B w, B x) { mut_rm(r, cw); mut_set(r, cw, cr); } - dec(w); dec(rep); + dec(w); dec(rep); FREE_CHECK; return mut_fcd(r, x); #undef EQ + #undef FREE_CHECK } diff --git a/src/sort.c b/src/sort.c index a3f28b5a..b6afce29 100644 --- a/src/sort.c +++ b/src/sort.c @@ -30,10 +30,11 @@ B gradeUp_c1(B t, B x) { // } i32* rp; B r = m_i32arrv(&rp, ia); - i32 tmp[ia]; + TALLOC(i32, tmp, ia); for (usz i = 0; i < ia; i++) tmp[i] = rp[i] = i; gradeUp_rec(xp, tmp, rp, 0, ia); dec(x); + TFREE(tmp); return r; } return c1(rt_gradeUp, x); diff --git a/src/stuff.c b/src/stuff.c index f11b4ae8..ca26f016 100644 --- a/src/stuff.c +++ b/src/stuff.c @@ -9,6 +9,12 @@ #define MAP_NORESERVE 0 // apparently needed for freebsd or something #endif +typedef struct TAlloc { + struct Value; + u8 data[]; +} TAlloc; +#define TALLOC(T,N,AM) TAlloc* N##_obj = mm_allocN(sizeof(TAlloc) + (AM)*sizeof(T) + 8, t_temp); T* N = (T*) N##_obj->data; // +8 so mm is happy +#define TFREE(N) mm_free((Value*)N##_obj); void empty_free(Value* x) { err("FREEING EMPTY\n"); } void builtin_free(Value* x) { err("FREEING BUILTIN\n"); } diff --git a/src/sysfn.c b/src/sysfn.c index 91badf1e..fb2f48b6 100644 --- a/src/sysfn.c +++ b/src/sysfn.c @@ -91,7 +91,7 @@ B grOrd_c2(B t, B w, B x) { // assumes valid arguments if (xia==0) { dec(w); return x; } BS2B wgetU = TI(w).getU; BS2B xgetU = TI(x).getU; - usz tmp[wia]; + TALLOC(usz, tmp, wia); tmp[0] = 0; for (usz i = 1; i < wia; i++) tmp[i] = tmp[i-1]+o2su(wgetU(w,i-1)); usz ria = tmp[wia-1]+o2su(wgetU(w,wia-1)); @@ -101,8 +101,7 @@ B grOrd_c2(B t, B w, B x) { // assumes valid arguments i64 c = o2i64(xgetU(x,i)); if (c>=0) rp[tmp[c]++] = i; } - dec(w); - dec(x); + dec(w); dec(x); TFREE(tmp); return r; } diff --git a/src/utf.c b/src/utf.c index 878a2438..8561c3ff 100644 --- a/src/utf.c +++ b/src/utf.c @@ -64,7 +64,7 @@ u64 utf8lenB(B x) { // doesn't consume; may error as it verifies whether is all } return res; } -void toUTF8(B x, char* p) { // doesn't consume; doesn't verify anything; p must have utf8lenB(x) bytes +void toUTF8(B x, char* p) { // doesn't consume; doesn't verify anything; p must have utf8lenB(x) bytes (calculating which should verify that this call is ok) BS2B xgetU = TI(x).getU; usz ia = a(x)->ia; for (usz i = 0; i < ia; i++) {