diff options
author | Michael Gran <spk121@yahoo.com> | 2009-08-01 10:15:20 -0700 |
---|---|---|
committer | Michael Gran <spk121@yahoo.com> | 2009-08-01 10:15:20 -0700 |
commit | 4c402b889eecaa7ffc61da6656f415c8c983507a (patch) | |
tree | 3f2abeffb8a43afce6e04fcdeebfa0ce007edfb2 | |
parent | 64bad3f5a8d7351a41a5b9ccb1df5c393a48b4a9 (diff) | |
download | guile-4c402b889eecaa7ffc61da6656f415c8c983507a.tar.gz |
Don't use GNU extensions for SCM_MAKE_CHAR macro
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
-rw-r--r-- | libguile/chars.h | 8 | ||||
-rw-r--r-- | libguile/vm-i-system.c | 8 |
2 files changed, 11 insertions, 5 deletions
diff --git a/libguile/chars.h b/libguile/chars.h index e68f06d21..8e1bc64b4 100644 --- a/libguile/chars.h +++ b/libguile/chars.h @@ -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) \ diff --git a/libguile/vm-i-system.c b/libguile/vm-i-system.c index ecafbebdd..4536b91da 100644 --- a/libguile/vm-i-system.c +++ b/libguile/vm-i-system.c @@ -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; } |