Factor can now recover from certain out of memory conditions

slava 2006-11-24 10:00:51 +00:00
parent 2d1c7f5e0f
commit f9f708739e
4 changed files with 19 additions and 2 deletions

View File

@ -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 ;

View File

@ -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)

View File

@ -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);
}

View File

@ -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);