let cast v ty_from ty_to =
if kind_equal ty_from ty_to then v
else
match ty_from with
| Kcint i ->
let vi = integer_of_data ty_from v in
begin match ty_to with
| Kcint j ->
if Ctypes.sub_c_int i j then v
else
Value (M.V_int(j,F.modulo j vi))
| Kint -> Data(F.wrap vi)
| Kreal -> Data(F.wrap (F.real_of_integer vi))
| Kptr te -> Loc (M.cast_int_to_loc i vi te)
| k -> WpLog.not_yet_implemented "logic cast from %a to %a"
Ctypes.pp_int i pp_kind k
end
| Kint ->
let vi = integer_of_data ty_from v in
begin match ty_to with
| Kcint j -> Value (M.V_int(j,F.modulo j vi))
| Kint -> Data(F.wrap vi)
| Kptr te -> Loc (M.cast_int_to_loc (Ctypes.c_ptr()) vi te)
| Kreal -> Data(F.wrap (F.real_of_integer vi))
| k -> WpLog.not_yet_implemented
"logic cast from integer to %a" pp_kind k
end
| Kreal ->
let vr = real_of_data ty_from v in
begin match ty_to with
| Kcint j -> Value(M.V_int(j,F.modulo j
(F.integer_of_real vr)))
| Kint -> Data(F.wrap (F.integer_of_real vr))
| Kreal -> Data(F.wrap vr)
| k -> WpLog.not_yet_implemented
"logic cast from real to %a" pp_kind k
end
| Kptr tfrom ->
let loc = loc_of_data (object_of tfrom) v in
begin match ty_to with
| Kcint j -> Value (M.V_int(j, M.cast_loc_to_int tfrom loc j))
| Kptr tto -> Loc (M.cast_loc_to_loc tfrom tto loc)
| k -> WpLog.not_yet_implemented
"logic cast from pointer over %a to %a"
!Ast_printer.d_type tfrom pp_kind k
end
| k -> WpLog.not_yet_implemented "logic cast from %a to %a"
pp_kind k pp_kind ty_to