summaryrefslogtreecommitdiff
path: root/mark.c
diff options
context:
space:
mode:
authorIvan Maidanski <ivmai@mail.ru>2023-04-09 10:53:15 +0300
committerIvan Maidanski <ivmai@mail.ru>2023-04-10 10:04:13 +0300
commit48e520afb80fdcb9d422cd3e20b79da7e704169b (patch)
tree9ae7ca53694f53b6ca5d13635bb6c53be9f642b0 /mark.c
parentbb0cc849f288cd4f72320cd153bcc9f13560c447 (diff)
downloadbdwgc-48e520afb80fdcb9d422cd3e20b79da7e704169b.tar.gz
Minimize code difference between GC_push_marked/unconditionally
(refactoring) * mark.c (GC_push_marked): Rename GC_mark_stack_top_reg local variable to mark_stack_top; use conditional expression to set lim variable. * mark.c [ENABLE_DISCLAIM] (GC_push_unconditionally): Likewise. * mark.c (GC_push_marked): Move lim variable assignment to the place of its use. * mark.c [ENABLE_DISCLAIM] (GC_push_unconditionally): Reformat code to match that of GC_push_marked.
Diffstat (limited to 'mark.c')
-rw-r--r--mark.c53
1 files changed, 24 insertions, 29 deletions
diff --git a/mark.c b/mark.c
index 96feab76..058c0262 100644
--- a/mark.c
+++ b/mark.c
@@ -1808,23 +1808,18 @@ STATIC void GC_push_marked(struct hblk *h, hdr *hhdr)
ptr_t p;
word bit_no;
ptr_t lim;
- mse * GC_mark_stack_top_reg;
+ mse * mark_stack_top;
mse * mark_stack_limit = GC_mark_stack_limit;
/* Some quick shortcuts: */
- if ((/* 0 | */ GC_DS_LENGTH) == descr) return;
- if (GC_block_empty(hhdr)/* nothing marked */) return;
+ if ((/* 0 | */ GC_DS_LENGTH) == descr) return;
+ if (GC_block_empty(hhdr)/* nothing marked */) return;
+
# if !defined(GC_DISABLE_INCREMENTAL)
GC_n_rescuing_pages++;
# endif
GC_objects_are_marked = TRUE;
- if (sz > MAXOBJBYTES) {
- lim = h -> hb_body;
- } else {
- lim = (ptr_t)((word)(h + 1)->hb_body - sz);
- }
-
- switch(BYTES_TO_GRANULES(sz)) {
+ switch (BYTES_TO_GRANULES(sz)) {
# if defined(USE_PUSH_MARKED_ACCELERATORS)
case 1:
GC_push_marked1(h, hhdr);
@@ -1843,16 +1838,18 @@ STATIC void GC_push_marked(struct hblk *h, hdr *hhdr)
case 1: /* to suppress "switch statement contains no case" warning */
# endif
default:
- GC_mark_stack_top_reg = GC_mark_stack_top;
+ lim = sz > MAXOBJBYTES ? h -> hb_body
+ : (ptr_t)((word)(h + 1) -> hb_body - sz);
+ mark_stack_top = GC_mark_stack_top;
for (p = h -> hb_body, bit_no = 0; (word)p <= (word)lim;
p += sz, bit_no += MARK_BIT_OFFSET(sz)) {
+ /* Mark from fields inside the object. */
if (mark_bit_from_hdr(hhdr, bit_no)) {
- /* Mark from fields inside the object. */
- GC_mark_stack_top_reg = GC_push_obj(p, hhdr, GC_mark_stack_top_reg,
- mark_stack_limit);
+ mark_stack_top = GC_push_obj(p, hhdr, mark_stack_top,
+ mark_stack_limit);
}
}
- GC_mark_stack_top = GC_mark_stack_top_reg;
+ GC_mark_stack_top = mark_stack_top;
}
}
@@ -1872,27 +1869,25 @@ STATIC void GC_push_marked(struct hblk *h, hdr *hhdr)
word descr = hhdr -> hb_descr;
ptr_t p;
ptr_t lim;
- mse * GC_mark_stack_top_reg;
+ mse * mark_stack_top;
mse * mark_stack_limit = GC_mark_stack_limit;
- if ((/* 0 | */ GC_DS_LENGTH) == descr)
- return;
+ if ((/* 0 | */ GC_DS_LENGTH) == descr) return;
# if !defined(GC_DISABLE_INCREMENTAL)
GC_n_rescuing_pages++;
# endif
GC_objects_are_marked = TRUE;
- if (sz > MAXOBJBYTES)
- lim = h -> hb_body;
- else
- lim = (ptr_t)((word)(h + 1)->hb_body - sz);
-
- GC_mark_stack_top_reg = GC_mark_stack_top;
- for (p = h -> hb_body; (word)p <= (word)lim; p += sz)
- if ((*(word *)p & 0x3) != 0)
- GC_mark_stack_top_reg = GC_push_obj(p, hhdr, GC_mark_stack_top_reg,
- mark_stack_limit);
- GC_mark_stack_top = GC_mark_stack_top_reg;
+ lim = sz > MAXOBJBYTES ? h -> hb_body
+ : (ptr_t)((word)(h + 1) -> hb_body - sz);
+ mark_stack_top = GC_mark_stack_top;
+ for (p = h -> hb_body; (word)p <= (word)lim; p += sz) {
+ if ((*(word *)p & 0x3) != 0) {
+ mark_stack_top = GC_push_obj(p, hhdr, mark_stack_top,
+ mark_stack_limit);
+ }
+ }
+ GC_mark_stack_top = mark_stack_top;
}
#endif /* ENABLE_DISCLAIM */