]> gitweb.factorcode.org Git - factor.git/commitdiff
vm: report callstack overflow
authorSlava Pestov <slava@slava-pestovs-macbook-pro.local>
Sat, 27 Mar 2010 11:45:11 +0000 (07:45 -0400)
committerSlava Pestov <slava@slava-pestovs-macbook-pro.local>
Sat, 27 Mar 2010 11:45:11 +0000 (07:45 -0400)
basis/debugger/debugger.factor
core/kernel/kernel-tests.factor
vm/errors.cpp
vm/errors.hpp

index c34a50190f8d4a0d84c19fe620d8d51eb3a6a0b3..d10fd4f73a66a9f1edf0a90cb93822a5f5d7a017 100644 (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" ;
index ca8aa8286b20e464e9c549b25ccce3ff90fd7028..bf16d9439fd88fa772afe240a7b459e05d83531e 100644 (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
index d0c72989a320c63384a9c48f0c844ed271b685cc..21dff5a4758dbd3c26f19baebf2451b0701f7804 100755 (executable)
@@ -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);
 }
index 0ce5957aef9331ce838985cbf3eedd49d0561007..34a23bd46dbda3b49f92dbd55072e9f355fc86cf 100755 (executable)
@@ -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,
 };