2
0
mirror of https://github.com/boostorg/build.git synced 2026-02-13 00:12:11 +00:00

More thorough asserts.

[SVN r75792]
This commit is contained in:
Steven Watanabe
2011-12-03 19:54:28 +00:00
parent 8e6bfafdaf
commit 5bb06a8bd3

View File

@@ -170,45 +170,60 @@ STACK * stack_global()
return &result;
}
void stack_push( STACK * s, LIST * l )
static void check_alignment( STACK * s )
{
*--(*(LIST * * *)&s->data) = l;
}
LIST * stack_pop( STACK * s )
{
return *(*(LIST * * *)&s->data)++;
}
LIST * stack_top(STACK * s)
{
return *(LIST * *)s->data;
}
LIST * stack_at( STACK * s, int n )
{
return *((LIST * *)s->data + n);
}
void stack_set( STACK * s, int n, LIST * value )
{
*((LIST * *)s->data + n) = value;
}
void * stack_get( STACK * s )
{
return (LIST * *)s->data;
assert( (unsigned long)s->data % sizeof( LIST * ) == 0 );
}
void * stack_allocate( STACK * s, int size )
{
*(char * *)&s->data -= size;
check_alignment( s );
s->data = (char *)s->data - size;
check_alignment( s );
return s->data;
}
void stack_deallocate( STACK * s, int size )
{
*(char * *)&s->data += size;
check_alignment( s );
s->data = (char *)s->data + size;
check_alignment( s );
}
void stack_push( STACK * s, LIST * l )
{
*(LIST * *)stack_allocate( s, sizeof( LIST * ) ) = l;
}
LIST * stack_pop( STACK * s )
{
LIST * result = *(LIST * *)s->data;
stack_deallocate( s, sizeof( LIST * ) );
return result;
}
LIST * stack_top(STACK * s)
{
check_alignment( s );
return *(LIST * *)s->data;
}
LIST * stack_at( STACK * s, int n )
{
check_alignment( s );
return *((LIST * *)s->data + n);
}
void stack_set( STACK * s, int n, LIST * value )
{
check_alignment( s );
*((LIST * *)s->data + n) = value;
}
void * stack_get( STACK * s )
{
check_alignment( s );
return (LIST * *)s->data;
}
LIST * frame_get_local( FRAME * frame, int idx )
@@ -2450,6 +2465,27 @@ void function_free( FUNCTION * function_ )
BJAM_FREE( function_ );
}
/* Alignment check for stack */
struct align_var_edits
{
char ch;
VAR_EDITS e;
};
struct align_expansion_item
{
char ch;
expansion_item e;
};
static char check_align_var_edits[ sizeof(struct align_var_edits) <= sizeof(VAR_EDITS) + sizeof(void *) ? 1 : -1 ];
static char check_align_expansion_item[ sizeof(struct align_expansion_item) <= sizeof(expansion_item) + sizeof(void *) ? 1 : -1 ];
static char check_ptr_size1[ sizeof(LIST *) <= sizeof(void *) ? 1 : -1 ];
static char check_ptr_size2[ sizeof(char *) <= sizeof(void *) ? 1 : -1 ];
/*
* WARNING: The instruction set is tuned for Jam and
* is not really generic. Be especially careful about
@@ -2714,6 +2750,18 @@ LIST * function_run( FUNCTION * function_, FRAME * frame, STACK * s )
case INSTR_RETURN:
{
#ifndef NDEBUG
if ( !( saved_stack == s->data ) )
{
frame->file = function->file;
frame->line = function->line;
backtrace_line( frame );
printf( "error: stack check failed.\n" );
backtrace( frame );
assert( saved_stack == s->data );
}
#endif
assert( saved_stack == s->data );
return result;
}