vm: report callstack overflow
parent
11ddbc03a4
commit
b5f7e91bdc
|
@ -120,6 +120,8 @@ HOOK: signal-error. os ( obj -- )
|
||||||
: datastack-overflow. ( obj -- ) "Data" stack-overflow. ;
|
: datastack-overflow. ( obj -- ) "Data" stack-overflow. ;
|
||||||
: retainstack-underflow. ( obj -- ) "Retain" stack-underflow. ;
|
: retainstack-underflow. ( obj -- ) "Retain" stack-underflow. ;
|
||||||
: retainstack-overflow. ( obj -- ) "Retain" stack-overflow. ;
|
: retainstack-overflow. ( obj -- ) "Retain" stack-overflow. ;
|
||||||
|
: callstack-underflow. ( obj -- ) "Call" stack-underflow. ;
|
||||||
|
: callstack-overflow. ( obj -- ) "Call" stack-overflow. ;
|
||||||
|
|
||||||
: memory-error. ( error -- )
|
: memory-error. ( error -- )
|
||||||
"Memory protection fault at address " write third .h ;
|
"Memory protection fault at address " write third .h ;
|
||||||
|
@ -153,8 +155,10 @@ PREDICATE: vm-error < array
|
||||||
{ 11 [ datastack-overflow. ] }
|
{ 11 [ datastack-overflow. ] }
|
||||||
{ 12 [ retainstack-underflow. ] }
|
{ 12 [ retainstack-underflow. ] }
|
||||||
{ 13 [ retainstack-overflow. ] }
|
{ 13 [ retainstack-overflow. ] }
|
||||||
{ 14 [ memory-error. ] }
|
{ 13 [ callstack-underflow. ] }
|
||||||
{ 15 [ fp-trap-error. ] }
|
{ 14 [ callstack-overflow. ] }
|
||||||
|
{ 15 [ memory-error. ] }
|
||||||
|
{ 16 [ fp-trap-error. ] }
|
||||||
} ; inline
|
} ; inline
|
||||||
|
|
||||||
M: vm-error summary drop "VM error" ;
|
M: vm-error summary drop "VM error" ;
|
||||||
|
|
|
@ -46,6 +46,10 @@ IN: kernel.tests
|
||||||
|
|
||||||
[ ] [ :c ] unit-test
|
[ ] [ :c ] unit-test
|
||||||
|
|
||||||
|
: overflow-c ( -- ) overflow-c overflow-c ;
|
||||||
|
|
||||||
|
[ overflow-c ] [ { "kernel-error" 14 f f } = ] must-fail-with
|
||||||
|
|
||||||
[ -7 <byte-array> ] must-fail
|
[ -7 <byte-array> ] must-fail
|
||||||
|
|
||||||
[ 3 ] [ t 3 and ] unit-test
|
[ 3 ] [ t 3 and ] unit-test
|
||||||
|
|
|
@ -87,6 +87,8 @@ void factor_vm::not_implemented_error()
|
||||||
|
|
||||||
void factor_vm::memory_protection_error(cell addr, stack_frame *stack)
|
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))
|
if(ctx->datastack_seg->underflow_p(addr))
|
||||||
general_error(ERROR_DATASTACK_UNDERFLOW,false_object,false_object,stack);
|
general_error(ERROR_DATASTACK_UNDERFLOW,false_object,false_object,stack);
|
||||||
else if(ctx->datastack_seg->overflow_p(addr))
|
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);
|
general_error(ERROR_RETAINSTACK_UNDERFLOW,false_object,false_object,stack);
|
||||||
else if(ctx->retainstack_seg->overflow_p(addr))
|
else if(ctx->retainstack_seg->overflow_p(addr))
|
||||||
general_error(ERROR_RETAINSTACK_OVERFLOW,false_object,false_object,stack);
|
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
|
else
|
||||||
general_error(ERROR_MEMORY,allot_cell(addr),false_object,stack);
|
general_error(ERROR_MEMORY,allot_cell(addr),false_object,stack);
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,6 +18,8 @@ enum vm_error_type
|
||||||
ERROR_DATASTACK_OVERFLOW,
|
ERROR_DATASTACK_OVERFLOW,
|
||||||
ERROR_RETAINSTACK_UNDERFLOW,
|
ERROR_RETAINSTACK_UNDERFLOW,
|
||||||
ERROR_RETAINSTACK_OVERFLOW,
|
ERROR_RETAINSTACK_OVERFLOW,
|
||||||
|
ERROR_CALLSTACK_UNDERFLOW,
|
||||||
|
ERROR_CALLSTACK_OVERFLOW,
|
||||||
ERROR_MEMORY,
|
ERROR_MEMORY,
|
||||||
ERROR_FP_TRAP,
|
ERROR_FP_TRAP,
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue