vm: report callstack overflow

release
Slava Pestov 2010-03-27 07:45:11 -04:00
parent 11ddbc03a4
commit b5f7e91bdc
4 changed files with 18 additions and 2 deletions

View File

@ -120,6 +120,8 @@ HOOK: signal-error. os ( obj -- )
: datastack-overflow. ( obj -- ) "Data" stack-overflow. ;
: retainstack-underflow. ( obj -- ) "Retain" stack-underflow. ;
: retainstack-overflow. ( obj -- ) "Retain" stack-overflow. ;
: callstack-underflow. ( obj -- ) "Call" stack-underflow. ;
: callstack-overflow. ( obj -- ) "Call" stack-overflow. ;
: memory-error. ( error -- )
"Memory protection fault at address " write third .h ;
@ -153,8 +155,10 @@ PREDICATE: vm-error < array
{ 11 [ datastack-overflow. ] }
{ 12 [ retainstack-underflow. ] }
{ 13 [ retainstack-overflow. ] }
{ 14 [ memory-error. ] }
{ 15 [ fp-trap-error. ] }
{ 13 [ callstack-underflow. ] }
{ 14 [ callstack-overflow. ] }
{ 15 [ memory-error. ] }
{ 16 [ fp-trap-error. ] }
} ; inline
M: vm-error summary drop "VM error" ;

View File

@ -46,6 +46,10 @@ IN: kernel.tests
[ ] [ :c ] unit-test
: overflow-c ( -- ) overflow-c overflow-c ;
[ overflow-c ] [ { "kernel-error" 14 f f } = ] must-fail-with
[ -7 <byte-array> ] must-fail
[ 3 ] [ t 3 and ] unit-test

View File

@ -87,6 +87,8 @@ void factor_vm::not_implemented_error()
void factor_vm::memory_protection_error(cell addr, stack_frame *stack)
{
/* Retain and call stack underflows are not supposed to happen */
if(ctx->datastack_seg->underflow_p(addr))
general_error(ERROR_DATASTACK_UNDERFLOW,false_object,false_object,stack);
else if(ctx->datastack_seg->overflow_p(addr))
@ -95,6 +97,10 @@ void factor_vm::memory_protection_error(cell addr, stack_frame *stack)
general_error(ERROR_RETAINSTACK_UNDERFLOW,false_object,false_object,stack);
else if(ctx->retainstack_seg->overflow_p(addr))
general_error(ERROR_RETAINSTACK_OVERFLOW,false_object,false_object,stack);
else if(ctx->callstack_seg->underflow_p(addr))
general_error(ERROR_CALLSTACK_UNDERFLOW,false_object,false_object,stack);
else if(ctx->callstack_seg->overflow_p(addr))
general_error(ERROR_CALLSTACK_OVERFLOW,false_object,false_object,stack);
else
general_error(ERROR_MEMORY,allot_cell(addr),false_object,stack);
}

View File

@ -18,6 +18,8 @@ enum vm_error_type
ERROR_DATASTACK_OVERFLOW,
ERROR_RETAINSTACK_UNDERFLOW,
ERROR_RETAINSTACK_OVERFLOW,
ERROR_CALLSTACK_UNDERFLOW,
ERROR_CALLSTACK_OVERFLOW,
ERROR_MEMORY,
ERROR_FP_TRAP,
};