@@ -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