@@ -156,32 +156,29 @@ bool interpretert::byte_offset_to_memory_offset(
156
156
if (source_type.id ()==ID_struct)
157
157
{
158
158
const auto &st=to_struct_type (source_type);
159
- const struct_typet::componentst &components=st.components ();
160
- member_offset_iterator component_offsets (st, ns);
161
159
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 ())
166
162
{
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);
169
167
if (component_byte_size<0 )
170
168
return true ;
171
- if ((component_offsets->second +component_byte_size)>offset)
169
+
170
+ if (comp_offset + component_byte_size > offset)
172
171
{
173
172
mp_integer subtype_result;
174
173
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);
178
175
result=previous_member_offsets+subtype_result;
179
176
return ret;
180
177
}
181
178
else
182
179
{
183
180
mp_integer component_count;
184
- if (count_type_leaves (component_type , component_count))
181
+ if (count_type_leaves (comp. type () , component_count))
185
182
return true ;
186
183
previous_member_offsets+=component_count;
187
184
}
@@ -236,33 +233,24 @@ bool interpretert::memory_offset_to_byte_offset(
236
233
if (source_type.id ()==ID_struct)
237
234
{
238
235
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;
242
236
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 ())
244
239
{
245
- const auto &component_type=components[offsets->first ].type ();
246
240
mp_integer component_count;
247
- if (count_type_leaves (component_type , component_count))
241
+ if (count_type_leaves (comp. type () , component_count))
248
242
return true ;
249
243
if (component_count>cell_offset)
250
244
{
251
245
mp_integer subtype_result;
252
246
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;
257
249
return ret;
258
250
}
259
251
else
260
252
{
261
253
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;
266
254
}
267
255
}
268
256
// Ran out of members, or member of indefinite size
0 commit comments