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 8beca16..cf4ce7c 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
@@ -17,7 +17,7 @@
* ��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 �ƂȂ�.
+ * 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 �ƂȂ�.
@@ -47,5 +47,17 @@
public int getOccurrenceExp() {
return occurrenceExp;
- }
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder str = new StringBuilder();
+ String indent = " ";
+ str.append("objId: " + objectId + "\n");
+ str.append("tp: " + occurrencePoint + "\n");
+ str.append(indent + "signature: " + occurrencePoint.getMethodExecution().getSignature() + "\n");
+ str.append(indent + "lineNo: " + occurrencePoint.getStatement().getLineNo() + "\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 41b079c..43f1ff9 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
@@ -890,6 +890,15 @@
return null;
}
+ private static TracePoint getRecentlyFieldUpdate(TracePoint tp) {
+ Statement statement = tp.getStatement();
+ if (statement instanceof FieldAccess) {
+ FieldAccess fa = (FieldAccess)statement;
+ return getFieldUpdateTracePoint(fa.getContainerObjId(), fa.getFieldName(), tp);
+ }
+ return null;
+ }
+
/**
* �����Ŏw�肵���R���e�i�̎�����̃t�B�[���h���Ō�ɍX�V���ꂽstatement���t�����ɒT�����āA
* ��������statement�ɑΉ�����TracePoint��Ԃ�
@@ -943,7 +952,16 @@
}
return null;
}
-
+
+ private static TracePoint getRecentlyArrayUpdate(TracePoint tp) {
+ Statement statement = tp.getStatement();
+ if (statement instanceof ArrayAccess) {
+ ArrayAccess aa = (ArrayAccess)statement;
+ return getArrayUpdateTracePoint(aa.getArrayObjectId(), aa.getIndex(), tp);
+ }
+ return null;
+ }
+
/**
* �����Ŏw�肵���z��ŁA���w�肵���C���f�b�N�X���Ō�ɍX�V���ꂽstatement���t�����ɒT�����āA
* ��������statement�ɑΉ�����TracePoint��Ԃ�
@@ -979,159 +997,81 @@
public static Alias getAlias(String objectId, TracePoint occurrencePoint, int occurrenceExp) {
return new Alias(objectId, occurrencePoint, occurrenceExp);
}
-
+
public static ArrayList> getObjectFlow(Alias alias) {
ArrayList> aliasLists = new ArrayList<>();
ArrayList aliasList = new ArrayList<>();
aliasList.add(alias);
- aliasLists.add(aliasList);
- return getObjectFlow(aliasLists, alias.getObjectId(), alias.getOccurrencePoint());
+ return getObjectFlow(aliasLists, alias.getObjectId(), alias.getOccurrencePoint(), 0);
}
-
- public static ArrayList> getObjectFlow(final ArrayList> aliasLists, final String aliasObjId, TracePoint tracePoint) {
- while (tracePoint.stepBackOver()) {
- Statement statement = tracePoint.getStatement();
+
+ private static ArrayList> getObjectFlow(ArrayList> aliasLists,
+ String objId, TracePoint tp, int side) {
+ ArrayList aliasList = aliasLists.get(aliasLists.size() - 1); // ����getObjectFlow���\�b�h���s���Ō��������G�C���A�X�����Ă������X�g
+ do {
+ Statement statement = tp.getStatement();
if (statement instanceof FieldAccess) {
- // �t�B�[���h�A�N�Z�X�̏ꍇ
- FieldAccess fs = (FieldAccess)statement;
- String containerObjId = fs.getContainerObjId();
- String valueObjId = fs.getValueObjId();
- if (aliasObjId.equals(valueObjId)) {
- // ���Y�n�_�ł̃G�C���A�X�����X�g�ɒlj�������Ƀt�B�[���h�ŏI�X�V�ɔ�ԃp�^�[���Ƃ��̂܂ܑk��p�^�[���Ƃŕ���
- Alias alias = new Alias(aliasObjId, tracePoint, Alias.OCCURRENCE_EXP_FIELD);
- ArrayList aliasList = aliasLists.get(aliasLists.size() - 1);
- aliasList.add(alias);
- ArrayList aliasListCopy = new ArrayList<>(aliasList); // ���X�g���̂��f�B�[�v�R�s�[���Ă���(�t�B�[���h�ŏI�X�V�ɔ�ԍċA�����I�����, ���̂܂ܑk��p�^�[���ŗp����)
- getObjectFlow(aliasLists, aliasObjId, getFieldUpdateTracePoint(containerObjId, fs.getFieldName(), tracePoint));
- aliasLists.add(aliasListCopy); // �ċA�����ɓ���O�Ƀf�B�[�v�R�s�[���Ă������X�g���Ō���ɒlj� (�ȍ~�̑k��ɂ���Č������G�C���A�X�͂��̃��X�g�ɓ������)
+ // �t�B�[���h�Q�Ƃ̏ꍇ
+ FieldAccess fa = (FieldAccess)statement;
+ if (fa.getValueObjId().equals(objId)) {
+ // ���Y�n�_�ł̃G�C���A�X�����X�g�ɒlj��������, �t�B�[���h�ŏI�X�V�ɔ�ԃp�^�[���Ƃ��̂܂ܑk��p�^�[���Ƃŕ���
+ aliasList.add(new Alias(objId, tp.duplicate(), Alias.OCCURRENCE_EXP_FIELD));
+ aliasList = new ArrayList<>(aliasList); // ���X�g���̂��f�B�[�v�R�s�[���Ă���(�t�B�[���h�ŏI�X�V�ɔ�ԍċA�����I�����, ���̂܂ܑk��p�^�[���ŗp����)
+ TracePoint fieldUpdateTp = getRecentlyFieldUpdate(tp);
+ aliasLists = getObjectFlow(aliasLists, objId, fieldUpdateTp, 0);
+ aliasLists.add(aliasList); // �ċA�����ɓ���O�Ƀf�B�[�v�R�s�[���Ă������X�g���Ō���ɒlj� (�ȍ~�̑k��ɂ���Č������G�C���A�X�͂��̃��X�g�ɓ������)
}
} else if (statement instanceof ArrayAccess) {
- // �z��A�N�Z�X�̏ꍇ
+ // �z��v�f�Q�Ƃ̏ꍇ
ArrayAccess aa = (ArrayAccess)statement;
- String arrayObjId = aa.getArrayObjectId();
- String valueObjId = aa.getValueObjectId();
- if (aliasObjId.equals(valueObjId)) {
- // ���Y�n�_�ł̃G�C���A�X�����X�g�ɒlj�������Ƀt�B�[���h�ŏI�X�V�ɔ�ԃp�^�[���Ƃ��̂܂ܑk��p�^�[���Ƃŕ���
- Alias alias = new Alias(aliasObjId, tracePoint, Alias.OCCURRENCE_EXP_ARRAY);
- ArrayList aliasList = aliasLists.get(aliasLists.size() - 1);
- aliasList.add(alias);
- ArrayList aliasListCopy = new ArrayList<>(aliasList); // ���X�g���̂��f�B�[�v�R�s�[���Ă���(�t�B�[���h�ŏI�X�V�ɔ�ԍċA�����I�����, ���̂܂ܑk��p�^�[���ŗp����)
- getObjectFlow(aliasLists, aliasObjId, getArrayUpdateTracePoint(arrayObjId, aa.getIndex(), tracePoint));
- aliasLists.add(aliasListCopy); // �ċA�����ɓ���O�Ƀf�B�[�v�R�s�[���Ă������X�g���Ō���ɒlj� (�ȍ~�̑k��ɂ���Č������G�C���A�X�͂��̃��X�g�ɓ������)
+ if (aa.getValueObjectId().equals(objId)) {
+ aliasList.add(new Alias(objId, tp.duplicate(), Alias.OCCURRENCE_EXP_ARRAY));
+ aliasList = new ArrayList<>(aliasList);
+ TracePoint arrayUpdateTp = getRecentlyArrayUpdate(tp);
+ aliasLists = getObjectFlow(aliasLists, objId, arrayUpdateTp, 0);
+ aliasLists.add(aliasList);
}
} else if (statement instanceof ArrayCreate) {
// �z���̏ꍇ
ArrayCreate ac = (ArrayCreate)statement;
- String arrayObjId = ac.getArrayObjectId();
- if (aliasObjId.equals(arrayObjId)) {
- Alias alias = new Alias(aliasObjId, tracePoint, Alias.OCCURRENCE_EXP_RETURN); // �z���� new �^��[] �̖߂�l
- ArrayList aliasList = aliasLists.get(aliasLists.size() - 1);
- aliasList.add(alias);
+ if (ac.getArrayObjectId().equals(objId)) {
+ aliasList.add(new Alias(objId, tp.duplicate(), Alias.OCCURRENCE_EXP_RETURN)); // �z���� new �^��[] �̖߂�l
return aliasLists; // �z���ӏ��̓G�C���A�X�̋N���Ȃ̂ł���ȑO�ɂ͂����Ȃ��͂�
}
} else if (statement instanceof MethodInvocation) {
- MethodExecution prevChildMethodExecution = ((MethodInvocation)statement).getCalledMethodExecution();
- ObjectReference returnValue = prevChildMethodExecution.getReturnValue();
- String returnId = returnValue.getId();
- if (aliasObjId.equals(returnId)) {
+ // ���\�b�h�Ăяo���̏ꍇ
+ MethodExecution calledMethodExecution = ((MethodInvocation)statement).getCalledMethodExecution();
+ ObjectReference returnValue = calledMethodExecution.getReturnValue();
+ if (returnValue.getId().equals(objId)) {
// �߂�l�ɃG�C���A�X�̃I�u�W�F�N�gID����v�����ꍇ
- ArrayList aliasList = aliasLists.get(aliasLists.size() - 1);
- aliasList.add(new Alias(aliasObjId, tracePoint, Alias.OCCURRENCE_EXP_RETURN));
- if (prevChildMethodExecution.isConstructor()) {
+ aliasList.add(new Alias(objId, tp.duplicate(), Alias.OCCURRENCE_EXP_RETURN));
+ if (calledMethodExecution.isConstructor()) {
return aliasLists; // �R���X�g���N�^�Ăяo���ӏ��̓G�C���A�X�̋N���Ȃ̂ł���ȑO�ɂ͂����Ȃ��͂�
}
- tracePoint.stepBackNoReturn(); // ���\�b�h�̌Ăяo����ɐ���
- continue;
- }
- int argOrder = 0;
- List args = prevChildMethodExecution.getArguments();
- for (ObjectReference objrf : args) {
- if (aliasObjId.equalsIgnoreCase(objrf.getId())) {
- // ���\�b�h�Ăяo���̎������ɃG�C���A�X�̃I�u�W�F�N�gID����v�����ꍇ
- ArrayList aliasList = aliasLists.get(aliasLists.size() - 1);
- aliasList.add(new Alias(aliasObjId, tracePoint, (Alias.OCCURRENCE_EXP_FIRST_ARG + argOrder)));
- break;
- }
- argOrder++;
- }
- if (argOrder == args.size()) {
- // ���\�b�h�Ăяo���̂ǂ̎������ɂ��G�C���A�X�̃I�u�W�F�N�gID����v���Ȃ������ꍇ
- if (aliasObjId.equals(prevChildMethodExecution.getThisObjId())) {
- // ���\�b�h�Ăяo���̃R���e�i�ɃG�C���A�X�̃I�u�W�F�N�gID����v�����ꍇ
- ArrayList aliasList = aliasLists.get(aliasLists.size() - 1);
- aliasList.add(new Alias(aliasObjId, tracePoint, (Alias.OCCURRENCE_EXP_RECEIVER)));
- continue; // �R���e�i���t�B�[���h�̏ꍇ�͂��̂܂ܑk��t�B�[���h�A�N�Z�X�ɂ��ǂ蒅���͂�
- }
+ TracePoint exitTp = calledMethodExecution.getExitPoint(); // �Ăяo�����\�b�h���s�̍ŏI�X�e�[�g�����g���w��tp���擾
+ aliasLists = getObjectFlow(aliasLists, objId, exitTp, side + 1); // �Ăяo����̃��\�b�h���s�ɐ���
+ aliasList = aliasLists.get(aliasLists.size() - 1);
}
}
+ } while (tp.stepBackOver());
+ if (!tp.isValid()) {
+ return aliasLists; // ����ȏチ�\�b�h���s��k��Ȃ��ꍇ(main���\�b�h�̂���ɑO�Ȃ�)�͂��̎��_�ŏI��
}
-
- // ���̉��Ɉ������G�C���A�X�ƂȂ��Ă��邩�ɂ��Ă̊֘A����������
-
+ // --- ���̎��_�� tracePoint�� �Ăяo�������w���Ă��� (���O�܂ők���Ă������\�b�h���s�ɂ��Ẵ��\�b�h�Ăяo�����w���Ă���) ---
+ MethodExecution calledMethodExecution = ((MethodInvocation)tp.getStatement()).getCalledMethodExecution();
+ ArrayList args = calledMethodExecution.getArguments();
+ for (int i = 0; i < args.size(); i++) {
+ if (args.get(i).equals(objId)) {
+ // ���\�b�h�Ăяo���̎������ɃG�C���A�X�̃I�u�W�F�N�gID����v�����ꍇ
+ aliasList.add(new Alias(objId, tp.duplicate(), (i + Alias.OCCURRENCE_EXP_FIRST_ARG)));
+ if (side == 0) {
+ // �T���J�n���\�b�h���s�܂��̓t�B�[���h��z��v�f�̍ŏI�X�V�T���Ŕ��̃��\�b�h���s����, �X�^�b�N�g���[�X�ł��ǂ��S���\�b�h���s�̏ꍇ
+ TracePoint previousTp = tp.duplicate();
+ previousTp.stepBackOver();
+ aliasLists = getObjectFlow(aliasLists, objId, previousTp, 0); // �Ăяo�����̃��\�b�h���s�ɐ���
+ }
+ }
+ }
return aliasLists;
}
-
-// 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) {
-// // �t�B�[���h�A�N�Z�X�̏ꍇ (���������Y�G�C���A�X�Ȃ�, ���ݒT������tracePoint���t�B�[���h�̍ŏI�X�V����tracePoint�ɕς���)
-// 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_ARRAY));
-// 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)) {
-// // �߂�l�ɃG�C���A�X�̃I�u�W�F�N�gID����v�����ꍇ
-// aliases.add(new Alias(aliasObjId, tracePoint, Alias.OCCURRENCE_EXP_RETURN));
-// tracePoint.stepBackNoReturn();
-// continue;
-// }
-// int argOrder = 0;
-// List args = prevChildMethodExecution.getArguments();
-// for (ObjectReference objrf : args) {
-// if (aliasObjId.equalsIgnoreCase(objrf.getId())) {
-// // ���\�b�h�Ăяo���̎������ɃG�C���A�X�̃I�u�W�F�N�gID����v�����ꍇ
-// aliases.add(new Alias(aliasObjId, tracePoint, (Alias.OCCURRENCE_EXP_FIRST_ARG + argOrder)));
-// break;
-// }
-// argOrder++;
-// }
-// if (argOrder == args.size()) {
-// // ���\�b�h�Ăяo���̂ǂ̎������ɂ��G�C���A�X�̃I�u�W�F�N�gID����v���Ȃ������ꍇ
-// if (aliasObjId.equals(prevChildMethodExecution.getThisObjId())) {
-// // ���\�b�h�Ăяo���̃R���e�i�ɃG�C���A�X�̃I�u�W�F�N�gID����v�����ꍇ
-// aliases.add(new Alias(aliasObjId, tracePoint, (Alias.OCCURRENCE_EXP_RECEIVER)));
-// // tracePoint���R���e�i�̍ŏI�X�V���ɔ������
-//
-// }
-// }
-// }
-// }
-//
-// // ���̉��Ɉ������G�C���A�X�ƂȂ��Ă��邩�ɂ��Ă̊֘A����������
-//
-// return aliases;
-// }
}