method vfunc f =
let local v =
if VarinfoHashtbl.mem cursor_to_base v && not (isArrayType v.vtype) then
let name = unique_name ("__jc_off_" ^ v.vname) in
let voff = makeLocalVar f ~insert:true name almost_integer_type in
VarinfoHashtbl.add cursor_to_offset v voff
in
let formal v =
if VarinfoHashtbl.mem formal_to_base v then
begin
local v;
let voff = VarinfoHashtbl.find cursor_to_offset v in
let vb = VarinfoHashtbl.find formal_to_base v in
let initst =
mkStmt(
Instr(Set((Var voff,NoOffset),
new_exp (BinOp(MinusPP,
new_exp (Lval(Var v,NoOffset)),
lval_base vb,
theMachine.ptrdiffType)),
CurrentLoc.get())))
in
add_pending_statement ~beginning:true initst
end
else if VarinfoHashtbl.mem cursor_to_base v
&& VarinfoSet.mem v assigned_vars then
begin
local v;
let voff = VarinfoHashtbl.find cursor_to_offset v in
let initst =
mkStmt(Instr(Set((Var voff,NoOffset),
constant_expr 0L,
CurrentLoc.get ())))
in
add_pending_statement ~beginning:true initst
end
else ()
in
List.iter formal f.sformals;
List.iter local f.slocals;
DoChildren