| |
---|
| | List<ObjectReference> args = calledMe.getArguments(); |
---|
| | for (int j = 0; j < args.size(); j++) { |
---|
| | startAliasList.add(new Alias(args.get(j).getId(), tp, (j + Alias.OCCURRENCE_EXP_FIRST_ARG))); |
---|
| | } |
---|
| | startAliasList.add(new Alias(calledMe.getReturnValue().getId(), tp, Alias.OCCURRENCE_EXP_RETURN)); |
---|
| | ObjectReference returnValue = calledMe.getReturnValue(); |
---|
| | if (returnValue != null) { |
---|
| | startAliasList.add(new Alias(returnValue.getId(), tp, Alias.OCCURRENCE_EXP_RETURN)); |
---|
| | } |
---|
| | } |
---|
| | } |
---|
| | return startAliasList; |
---|
| | } |
---|
| |
---|
| | // aliasList.add(alias); |
---|
| | String objId = startAlias.getObjectId(); |
---|
| | TracePoint tp = startAlias.getOccurrencePoint().duplicate(); |
---|
| | ArrayList<ArrayList<Alias>> resultLists = getObjectFlow(aliasLists, objId, tp, 0); |
---|
| | for (int i = 0; i < resultLists.size(); i++) { |
---|
| | ArrayList<Alias> resultList = resultLists.get(i); |
---|
| | System.out.println("---------------------------------------------------------"); // 確認用 |
---|
| | for (Alias alias : resultList) System.out.println(alias); // 確認用 |
---|
| | // for (int i = 0; i < resultLists.size(); i++) { |
---|
| | // ArrayList<Alias> resultList = resultLists.get(i); |
---|
| | // System.out.println("---------------------------------------------------------"); // 確認用 |
---|
| | // for (Alias alias : resultList) System.out.println(alias); // 確認用 |
---|
| | // int lastAliasOccurrenceEXP = resultList.get(resultList.size() - 1).getOccurrenceExp(); |
---|
| | // if (lastAliasOccurrenceEXP != Alias.OCCURRENCE_EXP_RETURN) { |
---|
| | // resultLists.remove(resultList); // 末尾のエイリアスが配列生成やコンストラクタ呼び出しではないリストを削除する |
---|
| | // } |
---|
| | } |
---|
| | // } |
---|
| | return resultLists; |
---|
| | } |
---|
| | |
---|
| | private static ArrayList<ArrayList<Alias>> getObjectFlow(ArrayList<ArrayList<Alias>> aliasLists, |
---|
| |
---|
| | if (returnValue.getId().equals(objId)) { |
---|
| | // 戻り値にエイリアスのオブジェクトIDが一致した場合 |
---|
| | aliasList.add(new Alias(objId, tp.duplicate(), Alias.OCCURRENCE_EXP_RETURN)); |
---|
| | if (calledMethodExecution.isConstructor()) { |
---|
| | System.out.println("return (Constructor)"); |
---|
| | return aliasLists; // コンストラクタ呼び出し箇所はエイリアスの起源なのでそれ以前にはもうないはず |
---|
| | } |
---|
| | TracePoint exitTp = calledMethodExecution.getExitPoint(); // 呼び出しメソッド実行の最終ステートメントを指すtpを取得 |
---|
| | aliasLists = getObjectFlow(aliasLists, objId, exitTp, side + 1); // 呼び出し先のメソッド実行に潜る |
---|
| |
---|
| | |