protected JsonObject toJson(LocalPointerKey ptr) {
   JsonObjectBuilder builder = Json.createObjectBuilder();
   builder.add("type", "LocalPointerKey");
   builder.add("method", ptr.getNode().getMethod().getSignature());
   builder.add("valueNumber", ptr.getValueNumber());
   return builder.build();
 }
  /** @param pk value being def'fed by a call instruction (either normal or exceptional) */
  private void addReturnEdges(LocalPointerKey pk, SSAInvokeInstruction callInstr) {
    boolean isExceptional = pk.getValueNumber() == callInstr.getException();

    // get call targets
    Collection<CGNode> possibleCallees =
        cg.getPossibleTargets(pk.getNode(), callInstr.getCallSite());
    // construct graph for each target
    for (CGNode callee : possibleCallees) {
      addSubgraphForNode(callee);
      PointerKey retVal =
          isExceptional
              ? heapModel.getPointerKeyForExceptionalReturnValue(callee)
              : heapModel.getPointerKeyForReturnValue(callee);
      assert containsNode(retVal);
      addEdge(pk, retVal);
    }
  }