aboutsummaryrefslogtreecommitdiffstats
path: root/erts/emulator/beam/copy.c
diff options
context:
space:
mode:
authorBjörn-Egil Dahlberg <[email protected]>2015-10-01 12:19:50 +0200
committerBjörn-Egil Dahlberg <[email protected]>2015-11-17 16:07:55 +0100
commit0d5ee7a4ad7bc41b7cca878990926fb5ba57f6a2 (patch)
treec73e5feeeec9d4ab5825b4d0bb4caecb514100cb /erts/emulator/beam/copy.c
parent1391715d8bbba315e1509e60e6245159a009bd9b (diff)
downloadotp-0d5ee7a4ad7bc41b7cca878990926fb5ba57f6a2.tar.gz
otp-0d5ee7a4ad7bc41b7cca878990926fb5ba57f6a2.tar.bz2
otp-0d5ee7a4ad7bc41b7cca878990926fb5ba57f6a2.zip
Do not use GCC extensions in copy
Diffstat (limited to 'erts/emulator/beam/copy.c')
-rw-r--r--erts/emulator/beam/copy.c37
1 files changed, 20 insertions, 17 deletions
diff --git a/erts/emulator/beam/copy.c b/erts/emulator/beam/copy.c
index 5bca3877b5..83ca527334 100644
--- a/erts/emulator/beam/copy.c
+++ b/erts/emulator/beam/copy.c
@@ -258,18 +258,19 @@ do { \
} \
} while(0)
-#define BITSTORE_GET(s) ({ \
- UWord result; \
- if (WSTK_CONCAT(s,_bitoffs) <= 0) { \
- WSTK_CONCAT(s,_buffer) = s.wstart[WSTK_CONCAT(s,_offset)]; \
- WSTK_CONCAT(s,_offset)++; \
- WSTK_CONCAT(s,_bitoffs) = 8*sizeof(UWord); \
- } \
- WSTK_CONCAT(s,_bitoffs) -= 2; \
- result = WSTK_CONCAT(s,_buffer) & 3; \
- WSTK_CONCAT(s,_buffer) >>= 2; \
- result; \
-})
+#define BITSTORE_FETCH(s,dst) \
+do { \
+ UWord result; \
+ if (WSTK_CONCAT(s,_bitoffs) <= 0) { \
+ WSTK_CONCAT(s,_buffer) = s.wstart[WSTK_CONCAT(s,_offset)]; \
+ WSTK_CONCAT(s,_offset)++; \
+ WSTK_CONCAT(s,_bitoffs) = 8*sizeof(UWord); \
+ } \
+ WSTK_CONCAT(s,_bitoffs) -= 2; \
+ result = WSTK_CONCAT(s,_buffer) & 3; \
+ WSTK_CONCAT(s,_buffer) >>= 2; \
+ (dst) = result; \
+} while(0)
#define BOXED_VISITED_MASK ((Eterm) 3)
#define BOXED_VISITED ((Eterm) 1)
@@ -476,7 +477,8 @@ cleanup:
/* if not already clean, clean it up */
if (primary_tag(tail) == TAG_PRIMARY_HEADER) {
if (primary_tag(head) == TAG_PRIMARY_HEADER) {
- Eterm saved = BITSTORE_GET(b);
+ Eterm saved;
+ BITSTORE_FETCH(b, saved);
CAR(ptr) = head = (head - TAG_PRIMARY_HEADER) | saved;
CDR(ptr) = tail = (tail - TAG_PRIMARY_HEADER) | TAG_PRIMARY_BOXED;
} else {
@@ -1396,10 +1398,11 @@ Uint copy_shared_perform(Eterm obj, Uint size, erts_shcopy_t *info,
/* if not already clean, clean it up and copy it */
if (primary_tag(tail) == TAG_PRIMARY_HEADER) {
if (primary_tag(head) == TAG_PRIMARY_HEADER) {
- Eterm saved = BITSTORE_GET(b);
- VERBOSE(DEBUG_SHCOPY, ("[pid=%T] unmangling L/B %p\n", mypid, ptr));
- CAR(ptr) = head = (head - TAG_PRIMARY_HEADER) + saved;
- CDR(ptr) = tail = (tail - TAG_PRIMARY_HEADER) + TAG_PRIMARY_BOXED;
+ Eterm saved;
+ BITSTORE_FETCH(b, saved);
+ VERBOSE(DEBUG_SHCOPY, ("[pid=%T] unmangling L/B %p\n", mypid, ptr));
+ CAR(ptr) = head = (head - TAG_PRIMARY_HEADER) + saved;
+ CDR(ptr) = tail = (tail - TAG_PRIMARY_HEADER) + TAG_PRIMARY_BOXED;
} else {
VERBOSE(DEBUG_SHCOPY, ("[pid=%T] unmangling L/L %p\n", mypid, ptr));
CDR(ptr) = tail = (tail - TAG_PRIMARY_HEADER) + TAG_PRIMARY_LIST;