~ chicken-core (chicken-5) c157ff502829c6f2856df4a963d81a88ee241ebf
commit c157ff502829c6f2856df4a963d81a88ee241ebf Author: felix <felix@call-with-current-continuation.org> AuthorDate: Mon Dec 6 04:58:45 2010 -0500 Commit: felix <felix@call-with-current-continuation.org> CommitDate: Mon Dec 6 04:58:45 2010 -0500 more useful error message in case equal? recurses too deep diff --git a/chicken.h b/chicken.h index 25cd834f..c228f028 100644 --- a/chicken.h +++ b/chicken.h @@ -581,6 +581,7 @@ typedef unsigned __int64 uint64_t; #define C_BAD_ARGUMENT_TYPE_NO_FLONUM_ERROR 33 #define C_BAD_ARGUMENT_TYPE_NO_CLOSURE_ERROR 34 #define C_BAD_ARGUMENT_TYPE_BAD_BASE_ERROR 35 +#define C_CIRCULAR_DATA_ERROR 36 /* Platform information */ @@ -1004,13 +1005,15 @@ extern double trunc(double); #if C_STACK_GROWS_DOWNWARD # define C_demand(n) (C_stress && ((C_word)(C_stack_pointer - C_stack_limit) > (n))) # define C_stack_probe(p) (C_stress && ((C_word *)(p) >= C_stack_limit)) -# define C_stack_check if(!C_disable_overflow_check && (C_byte*)(C_stack_pointer) + C_STACK_RESERVE < (C_byte *)C_stack_limit) C_stack_overflow() +# define C_stack_test (!C_disable_overflow_check && (C_byte*)(C_stack_pointer) + C_STACK_RESERVE < (C_byte *)C_stack_limit) #else # define C_demand(n) (C_stress && ((C_word)(C_stack_limit - C_stack_pointer) > (n))) # define C_stack_probe(p) (C_stress && ((C_word *)(p) < C_stack_limit)) -# define C_stack_check if(!C_disable_overflow_check && (C_byte*)(C_stack_pointer) - C_STACK_RESERVE > (C_byte *)C_stack_limit) C_stack_overflow() +# define C_stack_test (!C_disable_overflow_check && (C_byte*)(C_stack_pointer) - C_STACK_RESERVE > (C_byte *)C_stack_limit) #endif +#define C_stack_check if(C_stack_test) C_stack_overflow() + #define C_zero_length_p(x) C_mk_bool(C_header_size(x) == 0) #define C_boundp(x) C_mk_bool(((C_SCHEME_BLOCK *)(x))->data[ 0 ] != C_SCHEME_UNBOUND) #define C_unboundvaluep(x) C_mk_bool((x) == C_SCHEME_UNBOUND) diff --git a/library.scm b/library.scm index ffb9ff6d..30fbce6b 100644 --- a/library.scm +++ b/library.scm @@ -3970,6 +3970,7 @@ EOF ((33) (apply ##sys#signal-hook #:type-error loc "bad argument type - not a flonum" args)) ((34) (apply ##sys#signal-hook #:type-error loc "bad argument type - not a procedure" args)) ((35) (apply ##sys#signal-hook #:type-error loc "bad argument type - invalid base" args)) + ((36) (apply ##sys#signal-hook #:limit-error loc "recursion too deep or circular data encountered" args)) (else (apply ##sys#signal-hook #:runtime-error loc "unknown internal error" args)) ) ) ) ) diff --git a/runtime.c b/runtime.c index 7e20f67c..08ca44f8 100644 --- a/runtime.c +++ b/runtime.c @@ -1601,6 +1601,11 @@ void barf(int code, char *loc, ...) c = 1; break; + case C_CIRCULAR_DATA_ERROR: + msg = C_text("recursion too deep or circular data encountered"); + c = 0; + break; + default: panic(C_text("illegal internal error code")); } @@ -2205,6 +2210,12 @@ void C_stack_overflow(void) } +void C_stack_overflow_with_msg(C_char *msg) +{ + barf(C_STACK_OVERFLOW_ERROR, NULL); +} + + void C_unbound_error(C_word sym) { barf(C_UNBOUND_VARIABLE_ERROR, NULL, sym); @@ -3865,7 +3876,8 @@ C_regparm C_word C_fcall C_equalp(C_word x, C_word y) C_header header; C_word bits, n, i; - C_stack_check; + if(C_stack_test) + barf(C_CIRCULAR_DATA_ERROR, "equal?"); loop: if(x == y) return 1;Trap