diff --git a/src/core/stuff.h b/src/core/stuff.h index 258f9810..460329c3 100644 --- a/src/core/stuff.h +++ b/src/core/stuff.h @@ -413,8 +413,10 @@ void tailVerifyAlloc(void* ptr, u64 origSz, i64 logAlloc, u8 type); void tailVerifyFree(void* ptr); void tailVerifyReinit(void* ptr, u64 s, u64 e); #define FINISH_OVERALLOC(P, S, E) tailVerifyReinit(P, S, E) +NOINLINE void reinit_portion(Arr* a, usz s, usz e); #else #define FINISH_OVERALLOC(P, S, E) +#define reinit_portion(...) #endif #define FINISH_OVERALLOC_A(A, S, L) FINISH_OVERALLOC(a(A), offsetof(TyArr,a)+(S), offsetof(TyArr,a)+(S)+(L)); FORCE_INLINE void preFree(Value* x, bool mmx) { diff --git a/src/opt/mm_buddy.c b/src/opt/mm_buddy.c index 82192e01..13387ecd 100644 --- a/src/opt/mm_buddy.c +++ b/src/opt/mm_buddy.c @@ -130,4 +130,18 @@ void tailVerifyFree(void* ptr) { memset(ptr+8, 'a', clr); } +NOINLINE void reinit_portion(Arr* a, usz s, usz e) { + ux sb, eb, head; + switch (PTY(a)) { default: UD; + case t_bitarr: sb = BIT_N(s)*8; eb = BIT_N(e)*8; head = offsetof(TyArr,a); break; + case t_i8arr: case t_c8arr: sb = s; eb = e; head = offsetof(TyArr,a); break; + case t_i16arr: case t_c16arr: sb = s*2; eb = e*2; head = offsetof(TyArr,a); break; + case t_i32arr: case t_c32arr: sb = s*4; eb = e*4; head = offsetof(TyArr,a); break; + case t_f64arr: sb = s*8; eb = e*8; head = offsetof(TyArr,a); break; + case t_fillarr: head = offsetof(FillArr,a); sb = s*sizeof(B); eb = e*sizeof(B); break; + case t_harr: head = offsetof(HArr,a); sb = s*sizeof(B); eb = e*sizeof(B); break; + } + FINISH_OVERALLOC(a, head+sb, head+eb); + return; +} #endif