Compute GC_CONS arguments just once
authorIvan Maidanski <ivmai@mail.ru>
Sat, 30 Jun 2018 04:37:54 +0000 (07:37 +0300)
committerIvan Maidanski <ivmai@mail.ru>
Sat, 30 Jun 2018 04:37:54 +0000 (07:37 +0300)
(fix of commit 8eb6f8d)

* include/gc_inline.h (GC_CONS): Declare l and r local variables;
compute first and second expression even in case of
GC_MALLOC_WORDS_KIND failure; pass l and r to GC_reachable_here (instead
of first and second).

include/gc_inline.h

index 0117dd3..6527c3e 100644 (file)
@@ -189,13 +189,15 @@ GC_API GC_ATTR_MALLOC GC_ATTR_ALLOC_SIZE(1) void * GC_CALL
 /* And once more for two word initialized objects: */
 # define GC_CONS(result, first, second, tiny_fl) \
     do { \
+      void *l = (void *)(first); \
+      void *r = (void *)(second); \
       GC_MALLOC_WORDS_KIND(result, 2, tiny_fl, GC_I_NORMAL, (void)0); \
       if ((result) != NULL) { \
-        *(void **)(result) = (void *)(first); \
-        ((void **)(result))[1] = (void *)(second); \
+        *(void **)(result) = l; \
+        ((void **)(result))[1] = r; \
         GC_end_stubborn_change(result); \
-        GC_reachable_here(first); \
-        GC_reachable_here(second); \
+        GC_reachable_here(l); \
+        GC_reachable_here(r); \
       } \
     } while (0)