~ chicken-core (chicken-5) 8f3446e2269f8ff3e5273516adee78bcfc32feab


commit 8f3446e2269f8ff3e5273516adee78bcfc32feab
Author:     felix <felix@call-with-current-continuation.org>
AuthorDate: Thu Mar 31 12:22:07 2011 +0200
Commit:     felix <felix@call-with-current-continuation.org>
CommitDate: Thu Mar 31 12:22:07 2011 +0200

    use safer character-comparison macros in generated C code that mask out garbage in the upper bits; increase C_STACK_RESERVE for deeply recursive direct-call-optimized code

diff --git a/c-platform.scm b/c-platform.scm
index 18e305c7..a815e1cb 100644
--- a/c-platform.scm
+++ b/c-platform.scm
@@ -626,11 +626,11 @@
 (rewrite 'string-set! 2 3 "C_i_string_set" #t)
 (rewrite 'vector-ref 2 2 "C_slot" #f)
 (rewrite 'vector-ref 2 2 "C_i_vector_ref" #t)
-(rewrite 'char=? 2 2 "C_eqp" #t)
-(rewrite 'char>? 2 2 "C_fixnum_greaterp" #t)
-(rewrite 'char<? 2 2 "C_fixnum_lessp" #t)
-(rewrite 'char>=? 2 2 "C_fixnum_greater_or_equal_p" #t)
-(rewrite 'char<=? 2 2 "C_fixnum_less_or_equal_p" #t)
+(rewrite 'char=? 2 2 "C_i_char_equalp" #t)   ; a bit of a lie: won't crash but accepts garbage
+(rewrite 'char>? 2 2 "C_i_char_greaterp" #t)
+(rewrite 'char<? 2 2 "C_i_char_lessp" #t)
+(rewrite 'char>=? 2 2 "C_i_char_greater_or_equal_p" #t)
+(rewrite 'char<=? 2 2 "C_i_char_less_or_equal_p" #t)
 (rewrite '##sys#slot 2 2 "C_slot" #t)		; consider as safe, the primitive is unsafe anyway.
 (rewrite '##sys#block-ref 2 2 "C_i_block_ref" #t) ;*** must be safe for pattern matcher (anymore?)
 (rewrite '##sys#size 2 1 "C_block_size" #t)
diff --git a/chicken.h b/chicken.h
index 040115ee..7a3f6891 100644
--- a/chicken.h
+++ b/chicken.h
@@ -349,7 +349,7 @@ void *alloca ();
 
 /* Constants: */
 
-#define C_STACK_RESERVE                   4096
+#define C_STACK_RESERVE                   0x10000
 #define C_DEFAULT_MAX_PENDING_FINALIZERS  2048
 
 #define C_IMMEDIATE_MARK_BITS     0x00000003
@@ -914,7 +914,7 @@ extern double trunc(double);
 #define C_fix(n)                   (((C_word)(n) << C_FIXNUM_SHIFT) | C_FIXNUM_BIT)
 #define C_unfix(x)                 ((x) >> C_FIXNUM_SHIFT)
 #define C_make_character(c)        ((((c) & C_CHAR_BIT_MASK) << C_CHAR_SHIFT) | C_CHARACTER_BITS)
-#define C_character_code(x)        (((x) >> C_CHAR_SHIFT) & C_CHAR_BIT_MASK)
+#define C_character_code(x)        (((C_word)(x) >> C_CHAR_SHIFT) & C_CHAR_BIT_MASK)
 #define C_flonum_magnitude(x)      (*((double *)(((C_SCHEME_BLOCK *)(x))->data)))
 #define C_c_string(x)              ((C_char *)(((C_SCHEME_BLOCK *)(x))->data))
 #define C_c_pointer(x)             ((void *)(x))
@@ -1066,6 +1066,11 @@ extern double trunc(double);
 
 #define C_fix_to_char(x)                (C_make_character(C_unfix(x)))
 #define C_char_to_fix(x)                (C_fix(C_character_code(x)))
+#define C_i_char_equalp(x, y)           C_mk_bool(C_character_code(x) == C_character_code(y))
+#define C_i_char_greaterp(x, y)         C_mk_bool(C_character_code(x) > C_character_code(y))
+#define C_i_char_lessp(x, y)            C_mk_bool(C_character_code(x) < C_character_code(y))
+#define C_i_char_greater_or_equal_p(x, y)  C_mk_bool(C_character_code(x) >= C_character_code(y))
+#define C_i_char_less_or_equal_p(x, y)  C_mk_bool(C_character_code(x) <= C_character_code(y))
 #define C_substring_copy(s1, s2, start1, end1, start2) \
                                         (C_memcpy((C_char *)C_data_pointer(s2) + C_unfix(start2), \
                                                   (C_char *)C_data_pointer(s1) + C_unfix(start1), \
diff --git a/library.scm b/library.scm
index 2c64448b..4e7a6f6b 100644
--- a/library.scm
+++ b/library.scm
@@ -1389,27 +1389,27 @@ EOF
 (define (char=? c1 c2)
   (##sys#check-char c1 'char=?)
   (##sys#check-char c2 'char=?)
-  (eq? c1 c2) )
+  (##core#inline "C_i_char_equalp" c1 c2) )
 
 (define (char>? c1 c2)
   (##sys#check-char c1 'char>?)
   (##sys#check-char c2 'char>?)
-  (fx> c1 c2) )
+  (##core#inline "C_i_char_greaterp" c1 c2) )
 
 (define (char<? c1 c2)
   (##sys#check-char c1 'char<?)
   (##sys#check-char c2 'char<?)
-  (fx< c1 c2) )
+  (##core#inline "C_i_char_lessp" c1 c2) )
 
 (define (char>=? c1 c2)
   (##sys#check-char c1 'char>=?)
   (##sys#check-char c2 'char>=?)
-  (fx>= c1 c2) )
+  (##core#inline "C_i_char_greater_or_equal_p" c1 c2) )
 
 (define (char<=? c1 c2)
   (##sys#check-char c1 'char<=?)
   (##sys#check-char c2 'char<=?)
-  (fx<= c1 c2) )
+  (##core#inline "C_i_char_less_or_equal_p" c1 c2) )
 
 (define (char-upcase c)
   (##sys#check-char c 'char-upcase)
Trap