]> gitweb.factorcode.org Git - factor.git/commitdiff
VM: try and recover with a kernel error from the callback heap running out
authorBjörn Lindqvist <bjourne@gmail.com>
Tue, 9 Sep 2014 10:44:01 +0000 (12:44 +0200)
committerJohn Benediktsson <mrjbq7@gmail.com>
Mon, 29 Sep 2014 14:30:20 +0000 (07:30 -0700)
basis/debugger/debugger.factor
core/kernel/kernel.factor
vm/callbacks.cpp
vm/errors.hpp

index cc98a168b69a4fc46a0b3c09ca60cb7c9e381bdd..e1c23923a1c853c897736ac64b2bdd9d28491f7f 100755 (executable)
@@ -148,6 +148,9 @@ HOOK: signal-error. os ( obj -- )
 : interrupt-error. ( error -- )
     "Interrupt" print drop ;
 
+: callback-space-overflow. ( error -- )
+    "Callback space overflow" print drop ;
+
 PREDICATE: vm-error < array
     dup length 2 < [ drop f ] [
         {
@@ -158,26 +161,27 @@ PREDICATE: vm-error < array
 
 : vm-errors ( error -- n errors )
     second {
-        [ expired-error.          ]
-        [ io-error.               ]
-        [ primitive-error.        ]
-        [ type-check-error.       ]
-        [ divide-by-zero-error.   ]
-        [ signal-error.           ]
-        [ array-size-error.       ]
-        [ fixnum-range-error.     ]
-        [ c-string-error.         ]
-        [ ffi-error.              ]
-        [ undefined-symbol-error. ]
-        [ datastack-underflow.    ]
-        [ datastack-overflow.     ]
-        [ retainstack-underflow.  ]
-        [ retainstack-overflow.   ]
-        [ callstack-underflow.    ]
-        [ callstack-overflow.     ]
-        [ memory-error.           ]
-        [ fp-trap-error.          ]
-        [ interrupt-error.        ]
+        [ expired-error.           ]
+        [ io-error.                ]
+        [ primitive-error.         ]
+        [ type-check-error.        ]
+        [ divide-by-zero-error.    ]
+        [ signal-error.            ]
+        [ array-size-error.        ]
+        [ fixnum-range-error.      ]
+        [ c-string-error.          ]
+        [ ffi-error.               ]
+        [ undefined-symbol-error.  ]
+        [ datastack-underflow.     ]
+        [ datastack-overflow.      ]
+        [ retainstack-underflow.   ]
+        [ retainstack-overflow.    ]
+        [ callstack-underflow.     ]
+        [ callstack-overflow.      ]
+        [ memory-error.            ]
+        [ fp-trap-error.           ]
+        [ interrupt-error.         ]
+        [ callback-space-overflow. ]
     } ; inline
 
 M: vm-error summary drop "VM error" ;
index a397331bcf6c1205f92f8f4a00a5b90e71b1f21b..ddf1fa8fd23f66998aba6684d6fc099d74d8f2d0 100644 (file)
@@ -352,6 +352,8 @@ CONSTANT: OBJ-WAITING-CALLBACKS 73
 
 CONSTANT: OBJ-SIGNAL-PIPE 74
 
+CONSTANT: OBJ-INSTALL-PREFIX 75
+
 ! Context object count and identifiers must be kept in sync with:
 !   vm/contexts.hpp
 
@@ -363,9 +365,10 @@ CONSTANT: CONTEXT-OBJ-CONTEXT 2
 CONSTANT: CONTEXT-OBJ-IN-CALLBACK-P 3
 
 ! Runtime errors must be kept in sync with:
+!   basis/debugger/debugger.factor
 !   vm/errors.hpp
 
-CONSTANT: kernel-error-count 20
+CONSTANT: kernel-error-count 21
 
 CONSTANT: ERROR-EXPIRED 0
 CONSTANT: ERROR-IO      1
@@ -387,5 +390,6 @@ CONSTANT: ERROR-CALLSTACK-OVERFLOW 16
 CONSTANT: ERROR-MEMORY 17
 CONSTANT: ERROR-FP-TRAP 18
 CONSTANT: ERROR-INTERRUPT 19
+CONSTANT: ERROR-CALLBACK-SPACE-OVERFLOW 20
 
 PRIVATE>
index 01811f297ad514f4c768e8137c8bb858e2ac633d..0f7bdfb9408472e62f4c8fe6ce4c3f2b6a553a4b 100644 (file)
@@ -61,8 +61,12 @@ code_block* callback_heap::add(cell owner, cell return_rewind) {
   cell size = array_capacity(insns.untagged());
 
   cell bump = align(size + sizeof(code_block), data_alignment);
-  if (here + bump > seg->end)
-    fatal_error("Out of callback space", 0);
+
+  if (here + bump > seg->end) {
+    parent->general_error(ERROR_CALLBACK_SPACE_OVERFLOW,
+                          false_object,
+                          false_object);
+  }
 
   free_heap_block* free_block = (free_heap_block*)here;
   free_block->make_free(bump);
index 8d01571ee05584ef56baffa75256bd79ebca4195..e580fa12348b96d1bd0d133d6ecb6216494501d7 100644 (file)
@@ -24,6 +24,7 @@ enum vm_error_type {
   ERROR_MEMORY,
   ERROR_FP_TRAP,
   ERROR_INTERRUPT,
+  ERROR_CALLBACK_SPACE_OVERFLOW
 };
 
 void fatal_error(const char* msg, cell tagged);