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 new file mode 100644 index 0000000..e417738 --- /dev/null +++ b/org.ntlab.traceCollector/src/org/ntlab/traceCollector/tracer/trace/Alias.java @@ -0,0 +1,49 @@ +package org.ntlab.traceCollector.tracer.trace; + +/** + * �I�u�W�F�N�g�̎Q�Ə��(�G�C���A�X)��\���N���X + * @author Isitani + * + */ +public class Alias { + private String objectId; + private TracePoint occurrencePoint; // ���Y�I�u�W�F�N�g�̎Q�Ƃ��s���Ă�����s�ӏ��ɑΉ�����TracePoint + /** + * ���Y�I�u�W�F�N�g�̎Q�Ƃ�TracePoint�ɂ����Ăǂ��Ɍ���Ă��邩��\��
+ * 0 �t�B�[���h�A�N�Z�X���̃R���e�i �������� ���\�b�h�Ăяo�����̃��V�[�o
+ * 1, 2, 3 �c�c n �t�B�[���h�A�N�Z�X���̃t�B�[���h(1) �������� ���\�b�h�Ăяo������n�Ԗڂ̎����� (1���珇�Ԃ�)
+ * -1 ���\�b�h�Ăяo�����̖߂�l
+ *
+ * ��1: d = a.m(b, c);
+ *
+ * ��1�̎��s���ɂ�����, a�̓��\�b�h�Ăяo���̃��V�[�o�Ȃ̂�0, b�̓��\�b�h�Ăяo����1�Ԗڂ̎������Ȃ̂�1,
+ * c�̓��\�b�h�Ăяo����2�Ֆڂ̎������Ȃ̂�2, a.m(b, c)�̖߂�l��-1 �ƂȂ�.
+ *
+ * ��2: d = a.f;
+ * ��2�̎��s���ɂ�����, a�̓t�B�[���h�̃R���e�i�Ȃ̂�0, b�̓t�B�[���h�Ȃ̂�1 �ƂȂ�. + * + */ + private int occurrenceExp; + public static final int OCCURRENCE_EXP_CONTAINER = 0; + public static final int OCCURRENCE_EXP_RECEIVER = 0; + public static final int OCCURRENCE_EXP_FIELD = 1; + public static final int OCCURRENCE_EXP_RETURN = -1; + + public Alias(String objectId, TracePoint occurrencePoint, int occurrenceExp) { + this.objectId = objectId; + this.occurrencePoint = occurrencePoint; + this.occurrenceExp = occurrenceExp; + } + + public String getObjectId() { + return objectId; + } + + public TracePoint getOccurrencePoint() { + return occurrencePoint; + } + + public int getOccurrenceExp() { + return occurrenceExp; + } +} diff --git a/org.ntlab.traceCollector/src/org/ntlab/traceCollector/tracer/trace/MethodExecution.java b/org.ntlab.traceCollector/src/org/ntlab/traceCollector/tracer/trace/MethodExecution.java index 1b581d2..3eabbf5 100644 --- a/org.ntlab.traceCollector/src/org/ntlab/traceCollector/tracer/trace/MethodExecution.java +++ b/org.ntlab.traceCollector/src/org/ntlab/traceCollector/tracer/trace/MethodExecution.java @@ -274,4 +274,16 @@ } return null; } + + /** + * order���w�肵�đΉ�����TracePoint��Ԃ� + * @param order TracePoint��order + * @return + */ + public TracePoint getTracePoint(int order) { + if (order < this.getStatements().size()) { + return new TracePoint(this, order); + } + return null; + } } 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 9fd4929..ebb496d 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 @@ -975,4 +975,49 @@ } return null; } + + public static Alias getAlias(String objectId, TracePoint occurrencePoint, int occurrenceExp) { + return new Alias(objectId, occurrencePoint, occurrenceExp); + } + + public static ArrayList getObjectFlow(Alias alias) { + ArrayList aliases = new ArrayList<>(); + aliases.add(alias); + String aliasObjId = alias.getObjectId(); + TracePoint tracePoint = alias.getOccurrencePoint(); + while (tracePoint.stepBackOver()) { + Statement statement = tracePoint.getStatement(); + if (statement instanceof FieldAccess) { + FieldAccess fs = (FieldAccess)statement; + String containerObjId = fs.getContainerObjId(); + String valueObjId = fs.getValueObjId(); + if (aliasObjId.equals(valueObjId)) { + aliases.add(new Alias(aliasObjId, tracePoint, Alias.OCCURRENCE_EXP_FIELD)); + tracePoint = getFieldUpdateTracePoint(containerObjId, fs.getFieldName(), tracePoint); + } + } else if (statement instanceof ArrayAccess) { + ArrayAccess aa = (ArrayAccess)statement; + String arrayObjId = aa.getArrayObjectId(); + String valueObjId = aa.getValueObjectId(); + if (aliasObjId.equals(valueObjId)) { + aliases.add(new Alias(aliasObjId, tracePoint, Alias.OCCURRENCE_EXP_FIELD)); + tracePoint = getArrayUpdateTracePoint(arrayObjId, aa.getIndex(), tracePoint); + } + } else if (statement instanceof ArrayCreate) { + ArrayCreate ac = (ArrayCreate)statement; + + } else if (statement instanceof MethodInvocation) { + MethodExecution prevChildMethodExecution = ((MethodInvocation)statement).getCalledMethodExecution(); + ObjectReference returnValue = prevChildMethodExecution.getReturnValue(); + String returnId = returnValue.getId(); + if (aliasObjId.equals(returnId)) { + aliases.add(new Alias(aliasObjId, tracePoint, Alias.OCCURRENCE_EXP_RETURN)); + tracePoint.stepBackNoReturn(); + } + } + } + + + return aliases; + } }