diff --git a/library/tools/errors.factor b/library/tools/errors.factor index 7d815a7fe9..33de4e618c 100644 --- a/library/tools/errors.factor +++ b/library/tools/errors.factor @@ -60,6 +60,10 @@ DEFER: objc-error. ( alien -- ) : callstack-underflow. "Call" stack-underflow. ; : callstack-overflow. "Call" stack-overflow. ; +: memory-error. + "Allocation of " write second pprint + " bytes failed due to insufficient room in data heap" print ; + : kernel-error ( error -- word ) #! Kernel errors are indexed by integers. second { @@ -80,7 +84,8 @@ DEFER: objc-error. ( alien -- ) retainstack-overflow. callstack-underflow. callstack-overflow. - objc-error. + memory-error. + objc-error. } nth ; M: kernel-error error. dup kernel-error execute ; diff --git a/vm/data_gc.h b/vm/data_gc.h index 6784a916f8..aea584c3b3 100644 --- a/vm/data_gc.h +++ b/vm/data_gc.h @@ -253,7 +253,12 @@ INLINE void maybe_gc(CELL a) if(nursery.here + a + ALLOT_BUFFER_ZONE > nursery.limit) garbage_collection(NURSERY,false); if(nursery.here + a + ALLOT_BUFFER_ZONE > nursery.limit) - critical_error("Out of memory in maybe_gc",0); + { + if(nursery.here + ALLOT_BUFFER_ZONE > nursery.limit) + critical_error("Out of memory in maybe_gc",0); + else + memory_error(a); + } } INLINE void *allot(CELL a) diff --git a/vm/run.c b/vm/run.c index 45eef646cc..368a31a53e 100644 --- a/vm/run.c +++ b/vm/run.c @@ -349,3 +349,8 @@ void type_error(CELL type, CELL tagged) { general_error(ERROR_TYPE,tag_fixnum(type),tagged,true); } + +void memory_error(CELL bytes) +{ + general_error(ERROR_MEMORY,allot_cell(bytes),F,false); +} diff --git a/vm/run.h b/vm/run.h index 7c443073fa..deeb4bf077 100644 --- a/vm/run.h +++ b/vm/run.h @@ -168,6 +168,7 @@ typedef enum ERROR_RS_OVERFLOW, ERROR_CS_UNDERFLOW, ERROR_CS_OVERFLOW, + ERROR_MEMORY, ERROR_OBJECTIVE_C } F_ERRORTYPE; @@ -192,6 +193,7 @@ void general_error(F_ERRORTYPE error, CELL arg1, CELL arg2, bool keep_stacks); void memory_protection_error(CELL addr, int signal); void signal_error(int signal); void type_error(CELL type, CELL tagged); +void memory_error(CELL bytes); void primitive_throw(void); void primitive_die(void);