| |
---|
| | 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; |
---|
| |
---|
| | |