diff options
author | Ivan Maidanski <ivmai@mail.ru> | 2023-04-09 10:53:15 +0300 |
---|---|---|
committer | Ivan Maidanski <ivmai@mail.ru> | 2023-04-10 10:04:13 +0300 |
commit | 48e520afb80fdcb9d422cd3e20b79da7e704169b (patch) | |
tree | 9ae7ca53694f53b6ca5d13635bb6c53be9f642b0 /mark.c | |
parent | bb0cc849f288cd4f72320cd153bcc9f13560c447 (diff) | |
download | bdwgc-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.c | 53 |
1 files changed, 24 insertions, 29 deletions
@@ -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 */ |