Merge pull request #51 from nitta-lab/aliasForStaticInvocation
>static呼び出しの履歴もエイリアスとして収集できるようにした.

確認しました.ありがとうございます.
commit 174fef1cb45589067a49706c7b212704a27e33c6
2 parents 55b1766 + 87787e6
Hongo Aki authored on 8 Sep 2021
Showing 2 changed files
View
19
src/org/ntlab/deltaExtractor/DeltaExtractor.java
aliasCollector.addAlias(new Alias(Alias.AliasType.RECEIVER, 0, childMethodExecution.getThisObjId(), tracePoint.duplicate()));
}
}
if (childMethodExecution != null && childMethodExecution.isStatic() && objList.contains(null)) {
// staticな呼び出し先でthisに依存した
removeList.add(thisObjectId); // 後で一旦、thisObject を取り除く
isTrackingThis = true; // 呼び出し元探索前に復活
if (methodExecution.isStatic()) {
// 呼び出し元もstaticの場合
aliasCollector.addAlias(new Alias(Alias.AliasType.THIS, 0, methodExecution.getThisObjId(), tracePoint.duplicate())); // static呼び出しもエイリアスとして記録する
}
}
if (childMethodExecution != null) {
for (String objId : objList) {
if (!objId.equals(childMethodExecution.getThisObjId())) {
aliasCollector.addAlias(new Alias(Alias.AliasType.ACTUAL_ARGUMENT, -1, objId, tracePoint.duplicate())); // 引数番号がわからない
trackingObj = dstObject;
aliasCollector.changeTrackingObject(objectId, thisObjectId, false);
aliasCollector.addAlias(new Alias(Alias.AliasType.THIS, 0, thisObjectId, tracePoint.duplicate()));
}
if (Trace.isNull(thisObjectId)) objectId = null; // static変数の場合
if (Trace.isNull(thisObjectId)) objectId = null; // 呼び出し元がstaticの場合
else objectId = thisObjectId;
objList.set(index, objectId);
isResolved = true;
isLost = false;
continue;
}
objectId = objList.get(index);
if (objectId == null) {
// static呼び出しの戻り値だった場合(たぶん)
// static呼び出しの戻り値だった場合
trackingObj = null;
isResolved = true;
aliasCollector.addAlias(new Alias(Alias.AliasType.THIS, 0, thisObjectId, tracePoint.duplicate())); // static呼び出しもエイリアスとして記録する
} else if (objectId.equals(srcObject.getId())) {
trackingObj = srcObject;
} else if (objectId.equals(dstObject.getId())) {
trackingObj = dstObject;
}
}
}
if (objectId == null && isResolved && !isStatic) { // static 呼び出しからの戻り値を返している場合
objList.set(index, thisObjectId); // 自分を追跡させる
if (objectId == null && isResolved && !isStatic) { // staticな呼び出し先からの戻り値を追跡した結果、呼び出し先でthisに依存したが、自分自身はstaticでない場合
objList.set(index, thisObjectId); // thisの追跡を復活させる
if (Trace.isNull(srcObject.getId())) {
srcObject = thisObj;
} else if (Trace.isNull(dstObject.getId())) {
dstObject = thisObj;
View
19
src/org/ntlab/deltaExtractor/DeltaExtractorJSON.java
aliasCollector.addAlias(new Alias(Alias.AliasType.RECEIVER, 0, childMethodExecution.getThisObjId(), tracePoint.duplicate()));
} else if (!childMethodExecution.isConstructor()) {
// オブジェクト間呼び出しで呼び出し先がコンストラクタでない場合※2(※3の逆)
aliasCollector.addAlias(new Alias(Alias.AliasType.RECEIVER, 0, childMethodExecution.getThisObjId(), tracePoint.duplicate()));
}
}
if (childMethodExecution != null && childMethodExecution.isStatic() && objList.contains(null)) {
// staticな呼び出し先でthisに依存した
removeList.add(thisObjectId); // 後で一旦、thisObject を取り除く
isTrackingThis = true; // 呼び出し元探索前に復活
if (methodExecution.isStatic()) {
// 呼び出し元もstaticの場合
aliasCollector.addAlias(new Alias(Alias.AliasType.THIS, 0, methodExecution.getThisObjId(), tracePoint.duplicate())); // static呼び出しもエイリアスとして記録する
}
}
if (childMethodExecution != null) {
trackingObj = dstObject;
aliasCollector.changeTrackingObject(objectId, thisObjectId, false);
aliasCollector.addAlias(new Alias(Alias.AliasType.THIS, 0, thisObjectId, tracePoint.duplicate()));
}
if (Trace.isNull(thisObjectId)) objectId = null; // static変数の場合
if (Trace.isNull(thisObjectId)) objectId = null; // 呼び出し元がstaticの場合
else objectId = thisObjectId;
objList.set(index, objectId);
isResolved = true;
isLost = false;
continue;
}
objectId = objList.get(index);
if (objectId == null) {
// static呼び出しの戻り値だった場合(たぶん)
// static呼び出しの戻り値だった場合
trackingObj = null;
isResolved = true;
aliasCollector.addAlias(new Alias(Alias.AliasType.THIS, 0, thisObjectId, tracePoint.duplicate())); // static呼び出しもエイリアスとして記録する
} else if (objectId.equals(srcObject.getId())) {
trackingObj = srcObject;
} else if (objectId.equals(dstObject.getId())) {
trackingObj = dstObject;
}
isResolved = true; // 必要なのでは?
}
if (objectId == null && isResolved && !isStatic) { // static 呼び出しからの戻り値を返している場合
objList.set(index, thisObjectId); // 自分を追跡させる
if (objectId == null && isResolved && !isStatic) { // staticな呼び出し先からの戻り値を追跡した結果、呼び出し先でthisに依存したが、自分自身はstaticでない場合
objList.set(index, thisObjectId); // thisの追跡を復活させる
if (Trace.isNull(srcObject.getId())) {
srcObject = thisObj;
} else if (Trace.isNull(dstObject.getId())) {
dstObject = thisObj;