diff --git a/src/engine/function.cpp b/src/engine/function.cpp index ec6048482..e17b0b45b 100644 --- a/src/engine/function.cpp +++ b/src/engine/function.cpp @@ -285,7 +285,9 @@ struct _stack { int32_t const size = 1 << 21; start = BJAM_MALLOC( size ); + assert( ((ptrdiff_t)start) > (1<<4) ); end = (char *)start + size; + assert( ((ptrdiff_t)end) > (1<<4) ); data = end; } @@ -348,7 +350,7 @@ struct _stack void pop( int32_t n ) { check_alignment(); - data = nth( n ); + set_data( nth( n ) ); check_alignment(); --cleanups_size; } @@ -382,6 +384,12 @@ struct _stack assert( (size_t)data % LISTPTR_ALIGN == 0 ); } + void set_data(void * d) + { + assert( ((ptrdiff_t)d) > (1<<4) ); + data = d; + } + template remove_cref_t * nth( int32_t n ) { @@ -431,7 +439,7 @@ struct _stack template static void cleanup_item(_stack * s, int32_t n, T*_=nullptr) { - s->data = s->nth( n ); + s->set_data( s->nth( n ) ); s->check_alignment(); } @@ -446,7 +454,7 @@ void _stack::cleanup_item(_stack * s, int32_t n, LIST**) { list_free( s->top(i) ); } - s->data = s->nth( n ); + s->set_data( s->nth( n ) ); s->check_alignment(); } @@ -461,7 +469,7 @@ remove_cref_t * _stack::push( T v, int32_t n ) { using U = remove_cref_t; check_alignment(); - data = nth( -n ); + set_data( nth( -n ) ); check_alignment(); std::uninitialized_fill_n( static_cast( data ), n, v ); assert( ((ptrdiff_t)data) > (1<<4) );