diff --git a/ChangeLog b/ChangeLog index 2345b9966c..b3b7146320 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Wed Jul 15 08:59:19 2015 Nobuyoshi Nakada + + * gc.h (RUBY_MARK_UNLESS_NULL): evaluate the argument only once + to get rid of inadvertent side effects. + Wed Jul 15 02:53:11 2015 Koichi Sasada * vm_core.h, vm.c: remove rb_proc_t::envval because we can know it via diff --git a/gc.h b/gc.h index 19c712b44d..d1021df444 100644 --- a/gc.h +++ b/gc.h @@ -57,7 +57,10 @@ rb_gc_debug_body(const char *mode, const char *msg, int st, void *ptr) #define RUBY_GC_INFO if(0)printf #endif -#define RUBY_MARK_UNLESS_NULL(ptr) if(RTEST(ptr)){rb_gc_mark(ptr);} +#define RUBY_MARK_UNLESS_NULL(ptr) do { \ + VALUE markobj = (ptr); \ + if (RTEST(markobj)) {rb_gc_mark(markobj);} \ +} while (0) #define RUBY_FREE_UNLESS_NULL(ptr) if(ptr){ruby_xfree(ptr);(ptr)=NULL;} #if STACK_GROW_DIRECTION > 0