reorganize: Introduce class__for_each_member_continue()

To get a lot of boilerplate behind a nice helper.

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
Arnaldo Carvalho de Melo 2019-04-05 15:58:49 -03:00
parent e7a56ee8cc
commit 10fef2916d
2 changed files with 21 additions and 22 deletions

View File

@ -1127,6 +1127,13 @@ const struct class_member *class__find_bit_hole(const struct class *cls,
continue; \
else
#define class__for_each_member_continue(cls, from, pos) \
pos = list_prepare_entry(from, class__tags(cls), tag.node); \
list_for_each_entry_continue(pos, class__tags(cls), tag.node) \
if (!tag__is_class_member(&pos->tag)) \
continue; \
else
enum base_type_float_type {
BT_FP_SINGLE = 1,
BT_FP_DOUBLE,

View File

@ -21,14 +21,12 @@ void class__subtract_offsets_from(struct class *class,
struct class_member *from,
const uint16_t size)
{
struct class_member *member =
list_prepare_entry(from, class__tags(class), tag.node);
struct class_member *member;
list_for_each_entry_continue(member, class__tags(class), tag.node)
if (member->tag.tag == DW_TAG_member) {
member->byte_offset -= size;
member->bit_offset -= size * 8;
}
class__for_each_member_continue(class, from, member) {
member->byte_offset -= size;
member->bit_offset -= size * 8;
}
if (class->padding != 0) {
struct class_member *last_member =
@ -46,14 +44,12 @@ void class__subtract_offsets_from(struct class *class,
void class__add_offsets_from(struct class *class, struct class_member *from,
const uint16_t size)
{
struct class_member *member =
list_prepare_entry(from, class__tags(class), tag.node);
struct class_member *member;
list_for_each_entry_continue(member, class__tags(class), tag.node)
if (member->tag.tag == DW_TAG_member) {
member->byte_offset += size;
member->bit_offset += size * 8;
}
class__for_each_member_continue(class, from, member) {
member->byte_offset += size;
member->bit_offset += size * 8;
}
}
/*
@ -137,13 +133,10 @@ static struct class_member *
class__find_next_hole_of_size(struct class *class,
struct class_member *from, size_t size)
{
struct class_member *member =
list_prepare_entry(from, class__tags(class), tag.node);
struct class_member *bitfield_head = NULL;
struct class_member *member;
list_for_each_entry_continue(member, class__tags(class), tag.node) {
if (member->tag.tag != DW_TAG_member)
continue;
class__for_each_member_continue(class, from, member) {
if (member->bitfield_size != 0) {
if (bitfield_head == NULL)
bitfield_head = member;
@ -197,10 +190,9 @@ static struct class_member *
struct class_member *from,
size_t size)
{
struct class_member *member =
list_prepare_entry(from, class__tags(class), tag.node);
struct class_member *member;
list_for_each_entry_continue(member, class__tags(class), tag.node) {
class__for_each_member_continue(class, from, member) {
if (member->tag.tag != DW_TAG_member)
continue;
if (member->bit_hole != 0 &&