diff --git a/src/org/ntlab/traceDebugger/analyzerProvider/DeltaAlias.java b/src/org/ntlab/traceDebugger/analyzerProvider/DeltaAlias.java new file mode 100644 index 0000000..381804c --- /dev/null +++ b/src/org/ntlab/traceDebugger/analyzerProvider/DeltaAlias.java @@ -0,0 +1,15 @@ +package org.ntlab.traceDebugger.analyzerProvider; + +import org.ntlab.traceAnalysisPlatform.tracer.trace.TracePoint; + +public class DeltaAlias extends Alias { + boolean bSrcSide = false; + + public DeltaAlias(AliasType aliasType, int index, String objectId, TracePoint occurrencePoint, boolean isSrcSide) { + super(aliasType, index, objectId, occurrencePoint); + } + + public boolean isSrcSide() { + return bSrcSide; + } +} diff --git a/src/org/ntlab/traceDebugger/analyzerProvider/DeltaExtractorJSON.java b/src/org/ntlab/traceDebugger/analyzerProvider/DeltaExtractorJSON.java index 9e9e56e..ce5a559 100644 --- a/src/org/ntlab/traceDebugger/analyzerProvider/DeltaExtractorJSON.java +++ b/src/org/ntlab/traceDebugger/analyzerProvider/DeltaExtractorJSON.java @@ -3,6 +3,7 @@ import java.util.AbstractMap; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map.Entry; @@ -57,7 +58,8 @@ ObjectReference thisObj = new ObjectReference(thisObjectId, methodExecution.getThisClassName(), Trace.getDeclaringType(methodExecution.getSignature(), methodExecution.isConstructor()), Trace.getDeclaringType(methodExecution.getCallerSideSignature(), methodExecution.isConstructor())); - HashMap aliasList = new HashMap<>(); + HashMap srcAliasList = new HashMap<>(); + HashMap dstAliasList = new HashMap<>(); if (childMethodExecution == null) { // �T���J�n���͈�U�폜���A�Ăяo�����̒T���𑱂���ۂɕ��������� @@ -120,11 +122,15 @@ if (ownerObjectId.equals(thisObjectId)) { // �t�B�[���h�Q�Ƃ̏ꍇ - if (!removeList.contains(refObjectId)) { + if (Collections.frequency(objList, refObjectId) > Collections.frequency(removeList, refObjectId)) { // ��ԋ߂��t�B�[���h�Q�Ƃ�D�悷�� removeList.add(refObjectId); removeList.add(thisObjectId); // ��ň�U�AthisObject ����菜�� - aliasList.put(refObjectId, new Alias(Alias.AliasType.FIELD, 0, refObjectId, tracePoint.duplicate())); + if (refObjectId.equals(srcObject.getId())) { + srcAliasList.put(refObjectId, new DeltaAlias(Alias.AliasType.FIELD, 0, refObjectId, tracePoint.duplicate(), true)); + } else if (refObjectId.equals(dstObject.getId())) { + dstAliasList.put(refObjectId, new DeltaAlias(Alias.AliasType.FIELD, 0, refObjectId, tracePoint.duplicate(), false)); + } existsInFields++; // set�������get�����o���Ă���”\�������� } } else { @@ -181,7 +187,11 @@ removeList.add(arrayObjectId); existsInFields++; removeList.add(thisObjectId); // ��ň�U�AthisObject ����菜�� - aliasList.put(arrayObjectId, new Alias(Alias.AliasType.ARRAY_CREATE, 0, arrayObjectId, tracePoint.duplicate())); + if (arrayObjectId.equals(srcObject.getId())) { + srcAliasList.put(arrayObjectId, new DeltaAlias(Alias.AliasType.ARRAY_CREATE, 0, arrayObjectId, tracePoint.duplicate(), true)); + } else if (arrayObjectId.equals(dstObject.getId())) { + dstAliasList.put(arrayObjectId, new DeltaAlias(Alias.AliasType.ARRAY_CREATE, 0, arrayObjectId, tracePoint.duplicate(), false)); + } } } else if (statement instanceof MethodInvocation) { MethodExecution prevChildMethodExecution = ((MethodInvocation)statement).getCalledMethodExecution(); @@ -204,10 +214,19 @@ removeList.add(thisObjectId); // ��ň�U�AthisObject ����菜�� ((DeltaAugmentationInfo)prevChildMethodExecution.getAugmentation()).setTraceObjectId(Integer.parseInt(newObjId)); // �ǐՑΏ� ((DeltaAugmentationInfo)prevChildMethodExecution.getAugmentation()).setSetterSide(false); // getter�Ăяo���Ɠ��l - aliasList.put(newObjId, new Alias(Alias.AliasType.CONSTRACTOR_INVOCATION, 0, newObjId, tracePoint.duplicate())); + if (newObjId.equals(srcObject.getId())) { + srcAliasList.put(newObjId, new DeltaAlias(Alias.AliasType.CONSTRACTOR_INVOCATION, 0, newObjId, tracePoint.duplicate(), true)); + } else if (newObjId.equals(dstObject.getId())) { + dstAliasList.put(newObjId, new DeltaAlias(Alias.AliasType.CONSTRACTOR_INVOCATION, 0, newObjId, tracePoint.duplicate(), false)); + } continue; } String retObj = objList.get(retIndex); + if (retObj.equals(srcObject.getId())) { + isSrcSide = true; + } else if (retObj.equals(dstObject.getId())) { + isSrcSide = false; + } aliasCollector.addAlias(new Alias(Alias.AliasType.METHOD_INVOCATION, 0, retObj, tracePoint.duplicate())); if (removeList.contains(retObj)) { // ��xget�Ō��o���ăt�B�[���h�Ɉˑ����Ă���Ɣ��f�������{���̗R�����߂�l���������Ƃ����������̂ŁA�t�B�[���h�ւ̈ˑ����L�����Z������ @@ -227,7 +246,11 @@ removeList.add(thisObjectId); // ��ň�U�AthisObject ����菜�� isTrackingThis = true; // �Ăяo�����T���O�ɕ��� } - aliasCollector.addAlias(new Alias(Alias.AliasType.RECEIVER, 0, objList.get(retIndex), tracePoint.duplicate())); + if (isSrcSide) { + aliasCollector.addAlias(new DeltaAlias(Alias.AliasType.RECEIVER, 0, objList.get(retIndex), tracePoint.duplicate(), true)); + } else { + aliasCollector.addAlias(new DeltaAlias(Alias.AliasType.RECEIVER, 0, objList.get(retIndex), tracePoint.duplicate(), false)); + } } if (isLost) { checkList.add(objList.get(retIndex)); @@ -259,22 +282,27 @@ objList.remove(removeId); // �ǐՑΏۂ���O�� if (!removeId.equals(thisObjectId)) { // �t�B�[���h�ithis ���� removeId �ւ̎Q�Ɓj���f���^�̍\���v�f�ɂȂ� - if (removeId.equals(srcObject.getId())) { + if (srcAliasList.get(removeId) != null) { r = new Reference(thisObj, srcObject); r.setCreation(creationList.contains(removeId)); // �I�u�W�F�N�g�̐�����? eStructure.addSrcSide(r); srcObject = thisObj; isSrcSide = true; - } else if (removeId.equals(dstObject.getId())) { + aliasCollector.addAlias(srcAliasList.get(removeId)); + aliasCollector.changeTrackingObject(removeId, thisObjectId, isSrcSide); + aliasCollector.addAlias(new Alias(Alias.AliasType.THIS, 0, thisObjectId, srcAliasList.get(removeId).getOccurrencePoint())); + srcAliasList.remove(removeId); + } else if (dstAliasList.get(removeId) != null) { r = new Reference(thisObj, dstObject); r.setCreation(creationList.contains(removeId)); // �I�u�W�F�N�g�̐�����? eStructure.addDstSide(r); dstObject = thisObj; isSrcSide = false; + aliasCollector.addAlias(dstAliasList.get(removeId)); + aliasCollector.changeTrackingObject(removeId, thisObjectId, isSrcSide); + aliasCollector.addAlias(new Alias(Alias.AliasType.THIS, 0, thisObjectId, dstAliasList.get(removeId).getOccurrencePoint())); + dstAliasList.remove(removeId); } - aliasCollector.addAlias(aliasList.get(removeId)); - aliasCollector.changeTrackingObject(removeId, thisObjectId, isSrcSide); - aliasCollector.addAlias(new Alias(Alias.AliasType.THIS, 0, thisObjectId, aliasList.get(removeId).getOccurrencePoint())); } } }