Ltac method_call witness hist' result :=
repeat apply seq_assoc1;
match goal with
|- semax _ (PROPx _ (LOCALx ?Q (SEPx ?R)))
(Ssequence (Sset ?mt (Efield (Ederef (Etempvar ?x _)  _) _ _))
_) _  =>
match Q with context [temp ?x ?x'] =>
match R with context [object_mpred _ x'] =>
let instance := fresh "instance" in let mtable := fresh "mtable" in
unfold object_mpred; Intros instance mtable;
forward;
unfold object_methods at 1;
let sh := fresh "sh" in let r := fresh "r" in let t := fresh "t" in
Intros sh r t;
forward;
forward_call witness;
[ .. | try Intros result;
sep_apply (make_object_methods sh instance r t mtable); [ auto .. | ];
sep_apply (object_mpred_i hist' x' instance mtable);
deadvars; try clear dependent sh; try clear r; try clear t
]
end end
end.

Lemma body_main:  semax_body Vprog Gprog f_main main_spec.