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