diff --git a/org.ntlab.reverseDebugger/src/org/ntlab/reverseDebugger/ObjectFlowAliasView.java b/org.ntlab.reverseDebugger/src/org/ntlab/reverseDebugger/ObjectFlowAliasView.java index f8c7a19..abbb9ff 100644 --- a/org.ntlab.reverseDebugger/src/org/ntlab/reverseDebugger/ObjectFlowAliasView.java +++ b/org.ntlab.reverseDebugger/src/org/ntlab/reverseDebugger/ObjectFlowAliasView.java @@ -82,8 +82,12 @@ IStructuredSelection sel = (IStructuredSelection)event.getSelection(); Object element = sel.getFirstElement(); if (element instanceof JDIInstanceMethodCaller) { - selectObjectFlowAlias = (JDIInstanceMethodCaller)element; - javaEditorOperator.openSrcFileOfAlias(selectObjectFlowAlias); + if (((JDIInstanceMethodCaller)element).getReceiver() != null) { + selectObjectFlowAlias = (JDIInstanceMethodCaller)element; + javaEditorOperator.openSrcFileOfAlias(selectObjectFlowAlias); + } else { + selectObjectFlowAlias = null; + } } } }); @@ -152,11 +156,13 @@ } private void findSeedAliases() { - SeedAliasView.createSeedAliasesByAlias(selectObjectFlowAlias); - SeedAliasView.refresh(); - CallStackView.updateByAlias(selectObjectFlowAlias); - CallStackView.refresh(); - javaEditorOperator.openSrcFileOfAlias(selectObjectFlowAlias); + if (selectObjectFlowAlias != null) { + SeedAliasView.createSeedAliasesByAlias(selectObjectFlowAlias); + SeedAliasView.refresh(); + CallStackView.updateByAlias(selectObjectFlowAlias); + CallStackView.refresh(); + javaEditorOperator.openSrcFileOfAlias(selectObjectFlowAlias); + } } public static void refresh() { diff --git a/org.ntlab.reverseDebugger/src/org/ntlab/reverseDebugger/ObjectFlowAliases.java b/org.ntlab.reverseDebugger/src/org/ntlab/reverseDebugger/ObjectFlowAliases.java index 5e1f4a4..9cea0fa 100644 --- a/org.ntlab.reverseDebugger/src/org/ntlab/reverseDebugger/ObjectFlowAliases.java +++ b/org.ntlab.reverseDebugger/src/org/ntlab/reverseDebugger/ObjectFlowAliases.java @@ -36,7 +36,7 @@ for (int j = 0; j < objectFlowAliases.get(i).size(); j++) { list.add(objectFlowAliases.get(i).get(j)); } - if (hasBound) { + if (hasBound && i < objectFlowAliases.size() - 1) { list.add(new JDIInstanceMethodCaller(null, null, null)); // ���E�p�̃_�~�[�C���X�^���X�𐶐����Ēlj� } } diff --git a/org.ntlab.reverseDebugger/src/org/ntlab/reverseDebugger/analyzerProvider/Alias.java b/org.ntlab.reverseDebugger/src/org/ntlab/reverseDebugger/analyzerProvider/Alias.java index a7472cb..4100464 100644 --- a/org.ntlab.reverseDebugger/src/org/ntlab/reverseDebugger/analyzerProvider/Alias.java +++ b/org.ntlab.reverseDebugger/src/org/ntlab/reverseDebugger/analyzerProvider/Alias.java @@ -188,12 +188,14 @@ } return String.valueOf(occurrenceExp); } - - public boolean isStatementCallingConstructor() { + + public boolean isOrigin() { Statement statement = occurrencePoint.getStatement(); if (statement instanceof MethodInvocation) { MethodExecution calledMethodExecution = ((MethodInvocation)statement).getCalledMethodExecution(); return calledMethodExecution.isConstructor(); + } else if (statement instanceof ArrayCreate) { + return true; } return false; } diff --git a/org.ntlab.reverseDebugger/src/org/ntlab/reverseDebugger/analyzerProvider/ReverseDebuggerAnalyzer.java b/org.ntlab.reverseDebugger/src/org/ntlab/reverseDebugger/analyzerProvider/ReverseDebuggerAnalyzer.java index dfd2923..d83f7cd 100644 --- a/org.ntlab.reverseDebugger/src/org/ntlab/reverseDebugger/analyzerProvider/ReverseDebuggerAnalyzer.java +++ b/org.ntlab.reverseDebugger/src/org/ntlab/reverseDebugger/analyzerProvider/ReverseDebuggerAnalyzer.java @@ -127,119 +127,10 @@ // System.out.println(alias); // �m�F�p // System.out.println(); // } -// 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 resultLists; } -// private static ArrayList> getObjectFlow(ArrayList> aliasLists, -// String objId, TracePoint tp, int side) { -// -// -// if (!tp.isValid()) { -// return aliasLists; // ����ȏチ�\�b�h���s��k��Ȃ��ꍇ(main���\�b�h�̂���ɑO�Ȃ�)�͂��̎��_�ŏI�� -// } -// // --- ���̎��_�� tracePoint�� �Ăяo�������w���Ă��� (���O�܂ők���Ă������\�b�h���s�ɂ‚��Ẵ��\�b�h�Ăяo�����w���Ă���) --- -// MethodExecution calledMethodExecution = ((MethodInvocation)tp.getStatement()).getCalledMethodExecution(); -// ArrayList args = calledMethodExecution.getArguments(); -// boolean isExistingInArgs = false; -// for (int i = 0; i < args.size(); i++) { -// if (args.get(i).getId().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))); -// isExistingInArgs = true; -// 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�ɖ߂� -// } -// } -// } -// if (!isExistingInArgs) { -// System.out.println(); -// System.out.println(aliasLists); -// System.out.println(); -// System.out.println("remove: " + aliasLists.get(aliasLists.size() - 1)); -// System.out.println(); -// aliasLists.remove(aliasLists.size() - 1); // �����ɃG�C���A�X���Ȃ������ꍇ�͂��̉�̒ǐՃG�C���A�X���X�g���폜���� -// } -// return aliasLists; -// } -// - -// private static boolean getObjectFlowSub(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�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��v�f�Q�Ƃ̏ꍇ -// ArrayAccess aa = (ArrayAccess)statement; -// 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; -// if (ac.getArrayObjectId().equals(objId)) { -// aliasList.add(new Alias(objId, tp.duplicate(), Alias.OCCURRENCE_EXP_RETURN)); // �z�񐶐��� new �^��[] �̖߂�l -// return true; -//// return aliasLists; // �z�񐶐��ӏ��̓G�C���A�X�̋N���Ȃ̂ł���ȑO�ɂ͂����Ȃ��͂� -// } -// } else if (statement instanceof MethodInvocation) { -// // ���\�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�����ꍇ -// aliasList.add(new Alias(objId, tp.duplicate(), Alias.OCCURRENCE_EXP_RETURN)); -// if (calledMethodExecution.isConstructor()) { -// System.out.println("�R���X�g���N�^���B"); -// return true; -//// 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���擾 -// aliasLists = getObjectFlow(aliasLists, objId, exitTp, side + 1); // �Ăяo����̃��\�b�h���s�ɐ��� -// aliasList = aliasLists.get(aliasLists.size() - 1); -//// System.out.println(aliasList.get(aliasList.size() - 1)); -//// System.out.println(aliasList.get(aliasList.size() - 1).isStatementCallingConstructor()); -// if (aliasList.get(aliasList.size() - 1).isStatementCallingConstructor()) { -// System.out.println("�T���ł��؂�"); -//// return aliasLists; // �Ăяo����̃��\�b�h���s���畜�A�����ۂɃR���X�g���N�^�����‚����Ă���΂���ȏ�͑ł��؂� -// } -// } -// } -// } while (tp.stepBackOver()); // �Ăяo�����ɖ߂邩����ȏ�H��Ȃ��Ȃ�܂Ń��[�v -// } -// - - - - - - - - - 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 @@ -279,22 +170,18 @@ ObjectReference returnValue = calledMethodExecution.getReturnValue(); if (returnValue.getId().equals(objId)) { // �߂�l�ɃG�C���A�X�̃I�u�W�F�N�gID����v�����ꍇ - ArrayList aliasListBeforeMethodBackEntry = new ArrayList<>(aliasList); // �R�[�h�lj���(��) - + ArrayList aliasListBeforeMethodBackEntry = new ArrayList<>(aliasList); // �Ăяo����̃��\�b�h���s�ɐ���O�̃G�C���A�X���X�g���R�s�[���Ă��� aliasList.add(new Alias(objId, tp.duplicate(), Alias.OCCURRENCE_EXP_RETURN)); if (calledMethodExecution.isConstructor()) { - System.out.println("�R���X�g���N�^���B"); - System.out.println(aliasLists); 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���擾 aliasLists = getObjectFlow(aliasLists, objId, exitTp, side + 1); // �Ăяo����̃��\�b�h���s�ɐ��� aliasList = aliasLists.get(aliasLists.size() - 1); - if (aliasList.get(aliasList.size() - 1).isStatementCallingConstructor()) { - System.out.println("���\�b�h���s�ɐ���O�̃��[�g�����X�g�ɒlj�"); + if (aliasList.get(aliasList.size() - 1).isOrigin()) { + // �Ăяo����̃��\�b�h���s�ɐ�������ł��̃I�u�W�F�N�g�̋N��(�R���X�g���N�^or�z�񐶐�)�ɓ��B���Ă����ꍇ, �Ăяo����̃��\�b�h���s�ɐ���O�̃��X�g��p���ĐV�K�ɒǐՂ𑱍s���� aliasLists.add(aliasListBeforeMethodBackEntry); aliasList = aliasListBeforeMethodBackEntry; - System.out.println(aliasLists); } } } @@ -320,11 +207,6 @@ } } if (!isExistingInArgs) { - System.out.println(); - System.out.println(aliasLists); - System.out.println(); - System.out.println("remove: " + aliasLists.get(aliasLists.size() - 1)); - System.out.println(); aliasLists.remove(aliasLists.size() - 1); // �����ɃG�C���A�X���Ȃ������ꍇ�͂��̉�̒ǐՃG�C���A�X���X�g���폜���� } return aliasLists;