From b47e52db9e6a5a8b0a870296a829850cb7ff53c1 Mon Sep 17 00:00:00 2001 From: dzaima Date: Tue, 1 Jun 2021 17:52:51 +0300 Subject: [PATCH] preserve array reading through DONT_FREE --- src/load.c | 19 +++++++++++++++++++ src/opt/mm_buddyTemplate.h | 2 +- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/load.c b/src/load.c index 82fd6d19..d9be7767 100644 --- a/src/load.c +++ b/src/load.c @@ -284,6 +284,21 @@ static B def_m1_d(B m, B f ) { thrM("cannot derive this"); } static B def_m2_d(B m, B f, B g) { thrM("cannot derive this"); } static B def_slice(B x, usz s) { thrM("cannot slice non-array!"); } +#ifdef DONT_FREE +static B empty_get(B x, usz n) { + v(x)->type = v(x)->flags; + B r = TI(x).get(x, n); + v(x)->type = t_empty; + return r; +} +static B empty_getU(B x, usz n) { + v(x)->type = v(x)->flags; + B r = TI(x).getU(x, n); + v(x)->type = t_empty; + return r; +} +#endif + static inline void base_init() { // very first init function for (i32 i = 0; i < t_COUNT; i++) { ti[i].free = def_free; @@ -310,6 +325,10 @@ static inline void base_init() { // very first init function ti[t_empty].free = empty_free; ti[t_freed].free = def_free; ti[t_freed].visit = freed_visit; + #ifdef DONT_FREE + ti[t_empty].get = empty_get; + ti[t_empty].getU = empty_getU; + #endif ti[t_shape].visit = noop_visit; ti[t_funBI].visit = ti[t_md1BI].visit = ti[t_md2BI].visit = noop_visit; ti[t_funBI].free = ti[t_md1BI].free = ti[t_md2BI].free = builtin_free; diff --git a/src/opt/mm_buddyTemplate.h b/src/opt/mm_buddyTemplate.h index b30ee725..ee8afcf7 100644 --- a/src/opt/mm_buddyTemplate.h +++ b/src/opt/mm_buddyTemplate.h @@ -45,7 +45,7 @@ static void* BN(allocL)(u8 bucket, u8 type) { x->flags = x->extra = x->type = 0; x->refc = 1; x->type = type; - #ifdef DEBUG + #if defined(DEBUG) && !defined(DONT_FREE) u64* p = (u64*)x; u64* s = p + sizeof(Value)/8; u64* e = p + BSZ(bucket)/8;