: 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 ;
{ 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" ;
[ ] [ :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
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))
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);
}
ERROR_DATASTACK_OVERFLOW,
ERROR_RETAINSTACK_UNDERFLOW,
ERROR_RETAINSTACK_OVERFLOW,
+ ERROR_CALLSTACK_UNDERFLOW,
+ ERROR_CALLSTACK_OVERFLOW,
ERROR_MEMORY,
ERROR_FP_TRAP,
};