@@ -866,42 +866,12 @@ void interpretert::evaluate(
866
866
}
867
867
return ;
868
868
}
869
- else if (expr.id ()==ID_byte_extract_little_endian ||
870
- expr.id ()==ID_byte_extract_big_endian)
871
- {
872
- if (expr.operands ().size ()!=2 )
873
- throw " byte_extract should have two operands" ;
874
- mp_vectort extract_offset;
875
- evaluate (expr.op1 (), extract_offset);
876
- mp_vectort extract_from;
877
- evaluate (expr.op0 (), extract_from);
878
- if (extract_offset.size ()==1 && extract_from.size ()!=0 )
879
- {
880
- const typet &target_type=expr.type ();
881
- mp_integer memory_offset;
882
- // If memory offset is found (which should normally be the case)
883
- // extract the corresponding data from the appropriate memory location
884
- if (!byte_offset_to_memory_offset (
885
- expr.op0 ().type (),
886
- extract_offset[0 ],
887
- memory_offset))
888
- {
889
- mp_integer target_type_leaves;
890
- if (!count_type_leaves (target_type, target_type_leaves) &&
891
- target_type_leaves>0 )
892
- {
893
- dest.insert (dest.end (),
894
- extract_from.begin ()+memory_offset.to_long (),
895
- extract_from.begin ()+(memory_offset+target_type_leaves).to_long ());
896
- return ;
897
- }
898
- }
899
- }
900
- }
901
869
else if (expr.id ()==ID_dereference ||
902
870
expr.id ()==ID_index ||
903
871
expr.id ()==ID_symbol ||
904
- expr.id ()==ID_member)
872
+ expr.id ()==ID_member ||
873
+ expr.id () == ID_byte_extract_little_endian ||
874
+ expr.id () == ID_byte_extract_big_endian)
905
875
{
906
876
mp_integer address=evaluate_address (
907
877
expr,
@@ -955,16 +925,41 @@ void interpretert::evaluate(
955
925
}
956
926
else if (!address.is_zero ())
957
927
{
928
+ if (expr.id ()==ID_byte_extract_little_endian ||
929
+ expr.id ()==ID_byte_extract_big_endian)
930
+ {
931
+ mp_vectort extract_from;
932
+ evaluate (expr.op0 (), extract_from);
933
+ INVARIANT (
934
+ !extract_from.empty (),
935
+ " evaluate_address should have returned address == 0" );
936
+ const mp_integer memory_offset =
937
+ address - evaluate_address (expr.op0 (), true );
938
+ const typet &target_type = expr.type ();
939
+ mp_integer target_type_leaves;
940
+ if (!count_type_leaves (target_type, target_type_leaves) &&
941
+ target_type_leaves > 0 )
942
+ {
943
+ dest.insert (
944
+ dest.end (),
945
+ extract_from.begin () + numeric_cast_v<std::size_t >(memory_offset),
946
+ extract_from.begin () +
947
+ numeric_cast_v<std::size_t >(memory_offset + target_type_leaves));
948
+ return ;
949
+ }
950
+ // we fail
951
+ }
958
952
if (!unbounded_size (expr.type ()))
959
953
{
960
954
dest.resize (integer2size_t (get_size (expr.type ())));
961
955
read (address, dest);
956
+ return ;
962
957
}
963
958
else
964
959
{
965
960
read_unbounded (address, dest);
961
+ return ;
966
962
}
967
- return ;
968
963
}
969
964
}
970
965
else if (expr.id ()==ID_typecast)
0 commit comments