Don't use GNU extensions for SCM_MAKE_CHAR macro
authorMichael Gran <spk121@yahoo.com>
Sat, 1 Aug 2009 17:15:20 +0000 (10:15 -0700)
committerMichael Gran <spk121@yahoo.com>
Sat, 1 Aug 2009 17:15:20 +0000 (10:15 -0700)
Since the contents of SCM_MAKE_CHAR are evaluated more than once,
don't use it in situations where this could cause side-effects.

        * libguile/vm-i-system.c (make-char8): avoid side-effects with
        SCM_MAKE_CHAR call

        * libguile/chars.h (SCM_MAKE_CHAR): modified

libguile/chars.h
libguile/vm-i-system.c

index e68f06d..8e1bc64 100644 (file)
@@ -37,10 +37,10 @@ typedef scm_t_int32 scm_t_wchar;
 #define SCM_CHARP(x) (SCM_ITAG8(x) == scm_tc8_char)
 #define SCM_CHAR(x) ((scm_t_wchar)SCM_ITAG8_DATA(x))
 
-#define SCM_MAKE_CHAR(x) ({scm_t_int32 _x = (x);                        \
-      _x < 0                                                            \
-        ? SCM_MAKE_ITAG8((scm_t_bits)(unsigned char)_x, scm_tc8_char)   \
-        : SCM_MAKE_ITAG8((scm_t_bits)_x, scm_tc8_char);})
+#define SCM_MAKE_CHAR(x)                                              \
+  (x < 0                                                              \
+   ? SCM_MAKE_ITAG8 ((scm_t_bits) (unsigned char) x, scm_tc8_char)    \
+   : SCM_MAKE_ITAG8 ((scm_t_bits) x, scm_tc8_char))
 
 #define SCM_CODEPOINT_MAX (0x10ffff)
 #define SCM_IS_UNICODE_CHAR(c)                                          \
index ecafbeb..4536b91 100644 (file)
@@ -171,7 +171,13 @@ VM_DEFINE_INSTRUCTION (15, make_uint64, "make-uint64", 8, 0, 1)
 
 VM_DEFINE_INSTRUCTION (16, make_char8, "make-char8", 1, 0, 1)
 {
-  PUSH (SCM_MAKE_CHAR (FETCH ()));
+  scm_t_uint8 v = 0;
+  v = FETCH ();
+
+  PUSH (SCM_MAKE_CHAR (v));
+  /* Don't simplify this to PUSH (SCM_MAKE_CHAR (FETCH ())).  The
+     contents of SCM_MAKE_CHAR may be evaluated more than once,
+     resulting in a double fetch.  */
   NEXT;
 }