Skip to content

Commit 98379b3

Browse files
committed
Interpreter: simplify code by not using member_offset_iterator
1 parent 6d5e446 commit 98379b3

File tree

1 file changed

+15
-27
lines changed

1 file changed

+15
-27
lines changed

src/goto-programs/interpreter_evaluate.cpp

+15-27
Original file line numberDiff line numberDiff line change
@@ -156,32 +156,29 @@ bool interpretert::byte_offset_to_memory_offset(
156156
if(source_type.id()==ID_struct)
157157
{
158158
const auto &st=to_struct_type(source_type);
159-
const struct_typet::componentst &components=st.components();
160-
member_offset_iterator component_offsets(st, ns);
161159
mp_integer previous_member_offsets=0;
162-
for(; component_offsets->first<components.size() &&
163-
component_offsets->second!=-1 &&
164-
component_offsets->second<=offset;
165-
++component_offsets)
160+
161+
for(const auto &comp : st.components())
166162
{
167-
const auto &component_type=components[component_offsets->first].type();
168-
mp_integer component_byte_size=pointer_offset_size(component_type, ns);
163+
const mp_integer comp_offset = member_offset(st, comp.get_name(), ns);
164+
165+
const mp_integer component_byte_size =
166+
pointer_offset_size(comp.type(), ns);
169167
if(component_byte_size<0)
170168
return true;
171-
if((component_offsets->second+component_byte_size)>offset)
169+
170+
if(comp_offset + component_byte_size > offset)
172171
{
173172
mp_integer subtype_result;
174173
bool ret=byte_offset_to_memory_offset(
175-
component_type,
176-
offset-(component_offsets->second),
177-
subtype_result);
174+
comp.type(), offset - comp_offset, subtype_result);
178175
result=previous_member_offsets+subtype_result;
179176
return ret;
180177
}
181178
else
182179
{
183180
mp_integer component_count;
184-
if(count_type_leaves(component_type, component_count))
181+
if(count_type_leaves(comp.type(), component_count))
185182
return true;
186183
previous_member_offsets+=component_count;
187184
}
@@ -236,33 +233,24 @@ bool interpretert::memory_offset_to_byte_offset(
236233
if(source_type.id()==ID_struct)
237234
{
238235
const auto &st=to_struct_type(source_type);
239-
const struct_typet::componentst &components=st.components();
240-
member_offset_iterator offsets(st, ns);
241-
mp_integer previous_member_sizes;
242236
mp_integer cell_offset=full_cell_offset;
243-
for(; offsets->first<components.size() && offsets->second!=-1; ++offsets)
237+
238+
for(const auto &comp : st.components())
244239
{
245-
const auto &component_type=components[offsets->first].type();
246240
mp_integer component_count;
247-
if(count_type_leaves(component_type, component_count))
241+
if(count_type_leaves(comp.type(), component_count))
248242
return true;
249243
if(component_count>cell_offset)
250244
{
251245
mp_integer subtype_result;
252246
bool ret=memory_offset_to_byte_offset(
253-
component_type,
254-
cell_offset,
255-
subtype_result);
256-
result=previous_member_sizes+subtype_result;
247+
comp.type(), cell_offset, subtype_result);
248+
result = member_offset(st, comp.get_name(), ns) + subtype_result;
257249
return ret;
258250
}
259251
else
260252
{
261253
cell_offset-=component_count;
262-
mp_integer component_size=pointer_offset_size(component_type, ns);
263-
if(component_size<0)
264-
return true;
265-
previous_member_sizes+=component_size;
266254
}
267255
}
268256
// Ran out of members, or member of indefinite size

0 commit comments

Comments
 (0)