From b191baec8b2fd1a1b3a941d90d7c01f17a5fccb0 Mon Sep 17 00:00:00 2001 From: Patrick Pelissier Date: Sat, 6 Apr 2024 19:14:36 +0200 Subject: [PATCH] Make array functions exception aware --- m-array.h | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/m-array.h b/m-array.h index d2a31fcb..bdfad7f2 100644 --- a/m-array.h +++ b/m-array.h @@ -254,10 +254,12 @@ size_t step1 = M_MIN(s->size, d->size); \ for(i = 0; i < step1; i++) \ M_CALL_SET(oplist, d->ptr[i], s->ptr[i]); \ - for( ; i < s->size; i++) \ - M_CALL_INIT_SET(oplist, d->ptr[i], s->ptr[i]); \ for( ; i < d->size; i++) \ M_CALL_CLEAR(oplist, d->ptr[i]); \ + for( ; i < s->size; i++) { \ + M_CALL_INIT_SET(oplist, d->ptr[i], s->ptr[i]); \ + M_IF_EXCEPTION( d->size = i + 1 ); \ + } \ d->size = s->size; \ M_ARRA4_CONTRACT(d); \ } \ @@ -266,8 +268,10 @@ M_F(name, _init_set)(array_t d, const array_t s) \ { \ M_ASSERT (d != s); \ - M_F(name, _init)(d); \ - M_F(name, _set)(d, s); \ + M_ON_EXCEPTION(M_F(name, _clear)(d) ) { \ + M_F(name, _init)(d); \ + M_F(name, _set)(d, s); \ + } \ } \ , /* No SET & INIT_SET */) \ \ @@ -348,7 +352,9 @@ type *data = M_F(name, _push_raw)(v); \ if (M_UNLIKELY (data == NULL) ) \ return; \ - M_CALL_INIT_SET(oplist, *data, x); \ + M_IF_EXCEPTION( v->size --); \ + M_CALL_INIT_SET(oplist, *data, x); \ + M_IF_EXCEPTION( v->size ++); \ } \ , /* No INIT_SET */ ) \ \ @@ -359,7 +365,9 @@ type *data = M_F(name, _push_raw)(v); \ if (M_UNLIKELY (data == NULL) ) \ return NULL; \ + M_IF_EXCEPTION( v->size --); \ M_CALL_INIT(oplist, *data); \ + M_IF_EXCEPTION( v->size ++); \ return data; \ } \ , /* No INIT */ ) \ @@ -400,8 +408,10 @@ } \ M_ASSERT(v->ptr != NULL); \ memmove(&v->ptr[key+1], &v->ptr[key], (v->size-key)*sizeof(type)); \ + M_ON_EXCEPTION( memmove(&v->ptr[key], &v->ptr[v->size], sizeof(type))) { \ + M_CALL_INIT_SET(oplist, v->ptr[key], x); \ + } \ v->size++; \ - M_CALL_INIT_SET(oplist, v->ptr[key], x); \ M_ARRA4_CONTRACT(v); \ } \ , /* No INIT_SET */ ) \ @@ -428,8 +438,10 @@ v->ptr = ptr; \ v->alloc = alloc; \ } \ - for(size_t i = v->size ; i < size; i++) \ + for(size_t i = v->size ; i < size; i++) { \ M_CALL_INIT(oplist, v->ptr[i]); \ + M_IF_EXCEPTION( v->size = i+1); \ + } \ v->size = size; \ } \ M_ARRA4_CONTRACT(v); \ @@ -484,8 +496,10 @@ v->ptr = ptr; \ v->alloc = alloc; \ } \ - for(size_t i = v->size ; i < size; i++) \ + for(size_t i = v->size ; i < size; i++) { \ M_CALL_INIT(oplist, v->ptr[i]); \ + M_IF_EXCEPTION( v->size = i+1); \ + } \ v->size = size; \ } \ M_ASSERT (idx < v->size); \