~ chicken-core (chicken-5) 2d1f3dbdb2a57cf01c6720648ad7cc5e8bc27d7c


commit 2d1f3dbdb2a57cf01c6720648ad7cc5e8bc27d7c
Author:     felix <felix@call-with-current-continuation.org>
AuthorDate: Thu May 19 12:00:24 2022 +0200
Commit:     Peter Bex <peter@more-magic.net>
CommitDate: Fri May 20 11:36:10 2022 +0200

    avoid interning parent procedure name in character-comparators unnecessarily, only do so in error case
    
    Signed-off-by: Peter Bex <peter@more-magic.net>

diff --git a/runtime.c b/runtime.c
index c8304913..76f0e12c 100644
--- a/runtime.c
+++ b/runtime.c
@@ -7524,38 +7524,49 @@ C_regparm C_word C_fcall C_i_null_pointerp(C_word x)
   return C_SCHEME_FALSE;
 }
 
+/* only used here for char comparators below: */
+static C_word C_fcall check_char_internal(C_word x, C_char *loc)
+{
+  if((x & C_IMMEDIATE_TYPE_BITS) != C_CHARACTER_BITS) {
+    error_location = intern0(loc);
+    barf(C_BAD_ARGUMENT_TYPE_NO_CHAR_ERROR, NULL, x);
+  }
+
+  return C_SCHEME_UNDEFINED;
+}
+
 C_regparm C_word C_i_char_equalp(C_word x, C_word y)
 {
-  C_i_check_char_2(x, intern0("char=?"));
-  C_i_check_char_2(y, intern0("char=?"));
+  check_char_internal(x, "char=?");
+  check_char_internal(y, "char=?");
   return C_u_i_char_equalp(x, y);
 }
 
 C_regparm C_word C_i_char_greaterp(C_word x, C_word y)
 {
-  C_i_check_char_2(x, intern0("char>?"));
-  C_i_check_char_2(y, intern0("char>?"));
+  check_char_internal(x, "char>?");
+  check_char_internal(y, "char>?");
   return C_u_i_char_greaterp(x, y);
 }
 
 C_regparm C_word C_i_char_lessp(C_word x, C_word y)
 {
-  C_i_check_char_2(x, intern0("char<?"));
-  C_i_check_char_2(y, intern0("char<?"));
+  check_char_internal(x, "char<?");
+  check_char_internal(y, "char<?");
   return C_u_i_char_lessp(x, y);
 }
 
 C_regparm C_word C_i_char_greater_or_equal_p(C_word x, C_word y)
 {
-  C_i_check_char_2(x, intern0("char>=?"));
-  C_i_check_char_2(y, intern0("char>=?"));
+  check_char_internal(x, "char>=?");
+  check_char_internal(y, "char>=?");
   return C_u_i_char_greater_or_equal_p(x, y);
 }
 
 C_regparm C_word C_i_char_less_or_equal_p(C_word x, C_word y)
 {
-  C_i_check_char_2(x, intern0("char<=?"));
-  C_i_check_char_2(y, intern0("char<=?"));
+  check_char_internal(x, "char<=?");
+  check_char_internal(y, "char<=?");
   return C_u_i_char_less_or_equal_p(x, y);
 }
 
Trap