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
        (* Formal is a cursor of another formal *)
        begin
          local v; (* Create an offset variable for this formal *)
          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
        (* Formal is assigned and still a self-base, an offset is needed *)
        begin
          local v; (* Create an offset variable for this formal *)
          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