diff --git a/org.ntlab.traceCollector/src/org/ntlab/traceCollector/tracer/trace/Alias.java b/org.ntlab.traceCollector/src/org/ntlab/traceCollector/tracer/trace/Alias.java index 54126ef..0628100 100644 --- a/org.ntlab.traceCollector/src/org/ntlab/traceCollector/tracer/trace/Alias.java +++ b/org.ntlab.traceCollector/src/org/ntlab/traceCollector/tracer/trace/Alias.java @@ -51,33 +51,92 @@ return occurrenceExp; } - @Override - public String toString() { - StringBuilder str = new StringBuilder(); + public MethodExecution getMethodExecution() { + return occurrencePoint.getMethodExecution(); + } + + public String getMethodSignature() { + return occurrencePoint.getMethodExecution().getCallerSideSignature(); + } + + public int getLineNo() { Statement statement = occurrencePoint.getStatement(); - String className = ""; + return statement.getLineNo(); + } + + public String getStatementType() { + Statement statement = occurrencePoint.getStatement(); String statementType = ""; if (statement instanceof FieldAccess) { + FieldAccess fa = (FieldAccess)statement; statementType = "FieldAccess"; - className = ((FieldAccess) statement).getValueClassName(); } else if (statement instanceof FieldUpdate) { + FieldUpdate fu = (FieldUpdate)statement; statementType = "FieldUpdate"; - className = ((FieldUpdate) statement).getValueClassName(); } else if (statement instanceof ArrayAccess) { + ArrayAccess aa = (ArrayAccess)statement; statementType = "ArrayAccess"; + } else if (statement instanceof ArrayUpdate) { + ArrayUpdate au = (ArrayUpdate)statement; + statementType = "ArrayUpdate"; + } else if (statement instanceof ArrayCreate) { + ArrayCreate ac = (ArrayCreate)statement; + statementType = "ArrayCreate"; + } else if (statement instanceof MethodInvocation) { + MethodExecution me = ((MethodInvocation)statement).getCalledMethodExecution(); + statementType = "MethodInvocation"; + } + return statementType; + } + + public String getStatementSignature() { + Statement statement = occurrencePoint.getStatement(); + String statementSignature = ""; + if (statement instanceof FieldAccess) { + FieldAccess fa = (FieldAccess)statement; + statementSignature = fa.getFieldName(); + } else if (statement instanceof FieldUpdate) { + FieldUpdate fu = (FieldUpdate)statement; + statementSignature = fu.getFieldName(); + } else if (statement instanceof ArrayAccess) { + ArrayAccess aa = (ArrayAccess)statement; + statementSignature = aa.getArrayClassName() + "[" + aa.getIndex() + "]"; + } else if (statement instanceof ArrayUpdate) { + ArrayUpdate au = (ArrayUpdate)statement; + statementSignature = au.getArrayClassName() + "[" + au.getIndex() + "]"; + } else if (statement instanceof ArrayCreate) { + ArrayCreate ac = (ArrayCreate)statement; + statementSignature = ac.getArrayClassName(); + } else if (statement instanceof MethodInvocation) { + MethodExecution me = ((MethodInvocation)statement).getCalledMethodExecution(); + statementSignature = me.getCallerSideSignature(); + } + return statementSignature; + } + + public String getClassName() { + Statement statement = occurrencePoint.getStatement(); + String className = ""; + if (statement instanceof FieldAccess) { + if (occurrenceExp == OCCURRENCE_EXP_CONTAINER) { + className = ((FieldAccess) statement).getContainerClassName(); + } else if (occurrenceExp == OCCURRENCE_EXP_FIELD) { + className = ((FieldAccess) statement).getValueClassName(); + } + } else if (statement instanceof FieldUpdate) { + if (occurrenceExp == OCCURRENCE_EXP_CONTAINER) { + className = ((FieldUpdate) statement).getContainerClassName(); + } else if (occurrenceExp == OCCURRENCE_EXP_FIELD) { + className = ((FieldUpdate) statement).getValueClassName(); + } + } else if (statement instanceof ArrayAccess) { className = ((ArrayAccess) statement).getValueClassName(); } else if (statement instanceof ArrayUpdate) { - statementType = "ArrayUpdate"; className = ((ArrayUpdate) statement).getValueClassName(); } else if (statement instanceof ArrayCreate) { - statementType = "ArrayCreate"; className = ((ArrayCreate) statement).getArrayClassName(); } else if (statement instanceof MethodInvocation) { MethodExecution me = ((MethodInvocation)statement).getCalledMethodExecution(); - statementType = "MethodInvocation -> " + me.getCallerSideSignature(); - if(((MethodInvocation)statement).getCalledMethodExecution().isConstructor()) { - statementType += " (Constructor)"; - } if (occurrenceExp == OCCURRENCE_EXP_RETURN) { className = me.getReturnValue().getActualType(); } else if (occurrenceExp == OCCURRENCE_EXP_RECEIVER) { @@ -90,12 +149,23 @@ } } } + return className; + } + + @Override + public String toString() { + Statement statement = occurrencePoint.getStatement(); + String className = getClassName(); + String methodSignature = getMethodSignature(); + String statementType = getStatementType(); + String statementSigunarure = getStatementSignature(); String indent = " "; + StringBuilder str = new StringBuilder(); str.append("objId: " + objectId + " (class = " + className + ")" + "\n"); str.append("tp: " + occurrencePoint + "\n"); - str.append(indent + "signature: " + occurrencePoint.getMethodExecution().getCallerSideSignature() + "\n"); + str.append(indent + "signature: " + methodSignature + "\n"); str.append(indent + "lineNo: " + statement.getLineNo() + "\n"); - str.append(indent + "statementType: " + statementType + "\n"); + str.append(indent + "statementType: " + statementType + " -> " + statementSigunarure + "\n"); str.append("occurrenceExp: " + occurrenceExp + "\n"); return str.toString(); } diff --git a/org.ntlab.traceCollector/src/org/ntlab/traceCollector/tracer/trace/TraceJSON.java b/org.ntlab.traceCollector/src/org/ntlab/traceCollector/tracer/trace/TraceJSON.java index f18e71d..f04a18a 100644 --- a/org.ntlab.traceCollector/src/org/ntlab/traceCollector/tracer/trace/TraceJSON.java +++ b/org.ntlab.traceCollector/src/org/ntlab/traceCollector/tracer/trace/TraceJSON.java @@ -7,6 +7,7 @@ import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Stack; @@ -997,56 +998,93 @@ return null; } - public static String findValueObjId(Statement statement, int occurrenceEXP) { - String valueObjId = ""; - if (statement instanceof FieldAccess) { - valueObjId = ((FieldAccess) statement).getValueObjId(); - } else if (statement instanceof FieldUpdate) { - valueObjId = ((FieldUpdate)statement).getValueObjId(); - } else if (statement instanceof ArrayAccess) { - valueObjId = ((ArrayAccess)statement).getValueObjectId(); - } else if (statement instanceof ArrayUpdate) { - valueObjId = ((ArrayUpdate)statement).getValueObjectId(); - } else if (statement instanceof ArrayCreate) { - valueObjId = ((ArrayCreate)statement).getArrayObjectId(); - } else if (statement instanceof MethodInvocation) { - MethodExecution me = ((MethodInvocation)statement).getCalledMethodExecution(); - if (occurrenceEXP == Alias.OCCURRENCE_EXP_RETURN) { - valueObjId = me.getReturnValue().getId(); - } else if (occurrenceEXP == Alias.OCCURRENCE_EXP_RECEIVER) { - valueObjId = me.getThisObjId(); - } else { - ArrayList args = me.getArguments(); - int index = occurrenceEXP - Alias.OCCURRENCE_EXP_FIRST_ARG; - if (index >= 0 && index < args.size()) { - valueObjId = args.get(index).getId(); + public static ArrayList findAllStartAlias(MethodExecution me) { + ArrayList startAliasList = new ArrayList<>(); + List statements = me.getStatements(); + for (int i = 0; i < statements.size(); i++) { + TracePoint tp = me.getTracePoint(i); + Statement statement = statements.get(i); + if (statement instanceof FieldAccess) { + FieldAccess fa = (FieldAccess)statement; + startAliasList.add(new Alias(fa.getContainerObjId(), tp, Alias.OCCURRENCE_EXP_CONTAINER)); + startAliasList.add(new Alias(fa.getValueObjId(), tp, Alias.OCCURRENCE_EXP_FIELD)); + } else if (statement instanceof FieldUpdate) { + FieldUpdate fu = (FieldUpdate)statement; + startAliasList.add(new Alias(fu.getContainerObjId(), tp, Alias.OCCURRENCE_EXP_CONTAINER)); + startAliasList.add(new Alias(fu.getValueObjId(), tp, Alias.OCCURRENCE_EXP_FIELD)); + } else if (statement instanceof ArrayAccess) { + String valueObjId = ((ArrayAccess)statement).getValueObjectId(); + startAliasList.add(new Alias(valueObjId, tp, Alias.OCCURRENCE_EXP_ARRAY)); + } else if (statement instanceof ArrayUpdate) { + String valueObjId = ((ArrayUpdate)statement).getValueObjectId(); + startAliasList.add(new Alias(valueObjId, tp, Alias.OCCURRENCE_EXP_ARRAY)); + } else if (statement instanceof ArrayCreate) { + String valueObjId = ((ArrayAccess)statement).getValueObjectId(); + startAliasList.add(new Alias(valueObjId, tp, Alias.OCCURRENCE_EXP_RETURN)); + } else if (statement instanceof MethodInvocation) { + MethodExecution calledMe = ((MethodInvocation)statement).getCalledMethodExecution(); + startAliasList.add(new Alias(calledMe.getThisObjId(), tp, Alias.OCCURRENCE_EXP_RECEIVER)); + List 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)); } } - return valueObjId; + return startAliasList; } + +// public static String findValueObjId(Statement statement, int occurrenceEXP) { +// String valueObjId = ""; +// if (statement instanceof FieldAccess) { +// valueObjId = ((FieldAccess) statement).getValueObjId(); +// } else if (statement instanceof FieldUpdate) { +// valueObjId = ((FieldUpdate)statement).getValueObjId(); +// } else if (statement instanceof ArrayAccess) { +// valueObjId = ((ArrayAccess)statement).getValueObjectId(); +// } else if (statement instanceof ArrayUpdate) { +// valueObjId = ((ArrayUpdate)statement).getValueObjectId(); +// } else if (statement instanceof ArrayCreate) { +// valueObjId = ((ArrayCreate)statement).getArrayObjectId(); +// } else if (statement instanceof MethodInvocation) { +// MethodExecution me = ((MethodInvocation)statement).getCalledMethodExecution(); +// if (occurrenceEXP == Alias.OCCURRENCE_EXP_RETURN) { +// valueObjId = me.getReturnValue().getId(); +// } else if (occurrenceEXP == Alias.OCCURRENCE_EXP_RECEIVER) { +// valueObjId = me.getThisObjId(); +// } else { +// ArrayList args = me.getArguments(); +// int index = occurrenceEXP - Alias.OCCURRENCE_EXP_FIRST_ARG; +// if (index >= 0 && index < args.size()) { +// valueObjId = args.get(index).getId(); +// } +// } +// } +// return valueObjId; +// } public static Alias getAlias(String objectId, TracePoint occurrencePoint, int occurrenceExp) { return new Alias(objectId, occurrencePoint, occurrenceExp); } - public static ArrayList> getObjectFlow(Alias alias) { + public static ArrayList> getObjectFlow(Alias startAlias) { ArrayList> aliasLists = new ArrayList<>(); ArrayList aliasList = new ArrayList<>(); aliasLists.add(aliasList); // aliasList.add(alias); - String objId = alias.getObjectId(); - TracePoint tp = alias.getOccurrencePoint().duplicate(); - ArrayList> result = getObjectFlow(aliasLists, objId, tp, 0); - // �ȉ���for���[�v�͊m�F�p - for (ArrayList list : result) { - System.out.println("-------------------------------------------"); - for (Alias element : list) { - System.out.println(element); - } + String objId = startAlias.getObjectId(); + TracePoint tp = startAlias.getOccurrencePoint().duplicate(); + ArrayList> resultLists = getObjectFlow(aliasLists, objId, tp, 0); + for (int i = 0; i < resultLists.size(); i++) { + ArrayList resultList = resultLists.get(i); + System.out.println("---------------------------------------------------------"); // �m�F�p + for (Alias alias : resultList) System.out.println(alias); // �m�F�p +// int lastAliasOccurrenceEXP = resultList.get(resultList.size() - 1).getOccurrenceExp(); +// if (lastAliasOccurrenceEXP != Alias.OCCURRENCE_EXP_RETURN) { +// resultLists.remove(resultList); // �����̃G�C���A�X���z�񐶐���R���X�g���N�^�Ăяo���ł͂Ȃ����X�g���폜���� +// } } - return result; -// return getObjectFlow(aliasLists, alias.getObjectId(), alias.getOccurrencePoint(), 0); + return resultLists; } private static ArrayList> getObjectFlow(ArrayList> aliasLists, @@ -1090,6 +1128,7 @@ // �߂�l�ɃG�C���A�X�̃I�u�W�F�N�gID����v�����ꍇ aliasList.add(new Alias(objId, tp.duplicate(), Alias.OCCURRENCE_EXP_RETURN)); if (calledMethodExecution.isConstructor()) { + System.out.println("return (Constructor)"); return aliasLists; // �R���X�g���N�^�Ăяo���ӏ��̓G�C���A�X�̋N���Ȃ̂ł���ȑO�ɂ͂����Ȃ��͂� } TracePoint exitTp = calledMethodExecution.getExitPoint(); // �Ăяo�����\�b�h���s�̍ŏI�X�e�[�g�����g���w��tp���擾