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