diff --git a/META-INF/MANIFEST.MF b/META-INF/MANIFEST.MF index 4ef7b30..b2a2927 100644 --- a/META-INF/MANIFEST.MF +++ b/META-INF/MANIFEST.MF @@ -1,7 +1,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: TraceDebugger -Bundle-SymbolicName: org.ntlab.traceDebugger3;singleton:=true +Bundle-SymbolicName: org.ntlab.traceDebugger;singleton:=true Bundle-Version: 1.0.0.qualifier Automatic-Module-Name: org.ntlab.objectFlowAnalyzer2 Require-Bundle: org.eclipse.ui;bundle-version="3.109.100", @@ -13,4 +13,5 @@ org.ntlab.traceAnalysisPlatform;bundle-version="1.0.0", org.eclipse.ui.editors;bundle-version="3.11.100", org.eclipse.jface.text;bundle-version="3.13.0", - org.eclipse.ui.ide;bundle-version="3.14.0" + org.eclipse.ui.ide;bundle-version="3.14.0", + org.eclipse.text diff --git a/bin/.gitignore b/bin/.gitignore new file mode 100644 index 0000000..cf1db2e --- /dev/null +++ b/bin/.gitignore @@ -0,0 +1 @@ +/org/ diff --git a/bin/org/ntlab/traceDebugger/DebuggingController.class b/bin/org/ntlab/traceDebugger/DebuggingController.class index 47c1e53..de9e45f 100644 --- a/bin/org/ntlab/traceDebugger/DebuggingController.class +++ b/bin/org/ntlab/traceDebugger/DebuggingController.class Binary files differ diff --git a/bin/org/ntlab/traceDebugger/JavaEditorOperator.class b/bin/org/ntlab/traceDebugger/JavaEditorOperator.class index e3a0a70..a650bcc 100644 --- a/bin/org/ntlab/traceDebugger/JavaEditorOperator.class +++ b/bin/org/ntlab/traceDebugger/JavaEditorOperator.class Binary files differ diff --git a/bin/org/ntlab/traceDebugger/TraceDebuggerPlugin.class b/bin/org/ntlab/traceDebugger/TraceDebuggerPlugin.class index 394c546..5e005bf 100644 --- a/bin/org/ntlab/traceDebugger/TraceDebuggerPlugin.class +++ b/bin/org/ntlab/traceDebugger/TraceDebuggerPlugin.class Binary files differ diff --git a/bin/org/ntlab/traceDebugger/analyzerProvider/Alias.class b/bin/org/ntlab/traceDebugger/analyzerProvider/Alias.class index 17ae051..6895cd8 100644 --- a/bin/org/ntlab/traceDebugger/analyzerProvider/Alias.class +++ b/bin/org/ntlab/traceDebugger/analyzerProvider/Alias.class Binary files differ diff --git a/bin/org/ntlab/traceDebugger/analyzerProvider/DeltaExtractionAnalyzer.class b/bin/org/ntlab/traceDebugger/analyzerProvider/DeltaExtractionAnalyzer.class index c7fa7f9..136e19f 100644 --- a/bin/org/ntlab/traceDebugger/analyzerProvider/DeltaExtractionAnalyzer.class +++ b/bin/org/ntlab/traceDebugger/analyzerProvider/DeltaExtractionAnalyzer.class Binary files differ diff --git a/bin/org/ntlab/traceDebugger/analyzerProvider/DeltaExtractor.class b/bin/org/ntlab/traceDebugger/analyzerProvider/DeltaExtractor.class index bc13fb4..6fde5b1 100644 --- a/bin/org/ntlab/traceDebugger/analyzerProvider/DeltaExtractor.class +++ b/bin/org/ntlab/traceDebugger/analyzerProvider/DeltaExtractor.class Binary files differ diff --git a/bin/org/ntlab/traceDebugger/analyzerProvider/DeltaExtractorJSON.class b/bin/org/ntlab/traceDebugger/analyzerProvider/DeltaExtractorJSON.class index e6da5b6..5d55faa 100644 --- a/bin/org/ntlab/traceDebugger/analyzerProvider/DeltaExtractorJSON.class +++ b/bin/org/ntlab/traceDebugger/analyzerProvider/DeltaExtractorJSON.class Binary files differ diff --git a/bin/org/ntlab/traceDebugger/analyzerProvider/ExtractedStructure.class b/bin/org/ntlab/traceDebugger/analyzerProvider/ExtractedStructure.class index f01bc15..3bda7b5 100644 --- a/bin/org/ntlab/traceDebugger/analyzerProvider/ExtractedStructure.class +++ b/bin/org/ntlab/traceDebugger/analyzerProvider/ExtractedStructure.class Binary files differ diff --git a/bin/org/ntlab/traceDebugger/analyzerProvider/ObjectFlowAnalyzer.class b/bin/org/ntlab/traceDebugger/analyzerProvider/ObjectFlowAnalyzer.class deleted file mode 100644 index d425f31..0000000 --- a/bin/org/ntlab/traceDebugger/analyzerProvider/ObjectFlowAnalyzer.class +++ /dev/null Binary files differ diff --git a/bin/org/ntlab/traceDebugger/analyzerProvider/ObjectFlowAnalyzerLaunchConfiguration.class b/bin/org/ntlab/traceDebugger/analyzerProvider/ObjectFlowAnalyzerLaunchConfiguration.class index dfe2ec5..4789c96 100644 --- a/bin/org/ntlab/traceDebugger/analyzerProvider/ObjectFlowAnalyzerLaunchConfiguration.class +++ b/bin/org/ntlab/traceDebugger/analyzerProvider/ObjectFlowAnalyzerLaunchConfiguration.class Binary files differ diff --git a/plugin.xml b/plugin.xml index f3e94ef..8839c9f 100644 --- a/plugin.xml +++ b/plugin.xml @@ -55,36 +55,81 @@ + + + + + + + + + + + textStylePreferenceValue="BOX" + verticalRulerPreferenceKey="clvertical" + verticalRulerPreferenceValue="true"> + + diff --git a/src/org/ntlab/traceDebugger/DebuggingController.java b/src/org/ntlab/traceDebugger/DebuggingController.java index 5c0ce48..e0637b1 100644 --- a/src/org/ntlab/traceDebugger/DebuggingController.java +++ b/src/org/ntlab/traceDebugger/DebuggingController.java @@ -50,7 +50,8 @@ } // InputDialog inputDialog = new InputDialog(null, "method signature dialog", "Input method signature", "void Company.pay(Money,Person)", null); // InputDialog inputDialog = new InputDialog(null, "method signature dialog", "Input method signature", "void worstCase.P.setM(worstCase.M)", null); - InputDialog inputDialog = new InputDialog(null, "method signature dialog", "Input method signature", "public void org.jhotdraw.draw.DefaultDrawingView.addToSelection(org.jhotdraw.draw.Figure)", null); +// InputDialog inputDialog = new InputDialog(null, "method signature dialog", "Input method signature", "public void org.jhotdraw.draw.DefaultDrawingView.addToSelection(org.jhotdraw.draw.Figure)", null); + InputDialog inputDialog = new InputDialog(null, "method signature dialog", "Input method signature", "void E.setC(C)", null); if (inputDialog.open() != InputDialog.OK) return false; String methodSignature = inputDialog.getValue(); inputDialog = new InputDialog(null, "line No dialog", "Input line no", "", null); @@ -236,26 +237,38 @@ refresh(false); return true; } - + /** * ���݂̃f�o�b�O�ʒu�𒊏o�����f���^�̒�ӂ̃g���[�X�|�C���g�ɍ��킹�� (�Ƃ肠�����m�F���邾���p) * @return */ public boolean tmp() { DeltaExtractionAnalyzer analyzer = (DeltaExtractionAnalyzer)TraceDebuggerPlugin.getAnalyzer(); - ReferencePoint rp = analyzer.getBottomPoint(); - long previousTime = debuggingTp.getStatement().getTimeStamp(); - long rpTime = rp.getTime(); - debuggingTp = rp.getTracePoint(); -// if (rpTime < previousTime) { -// traceBreakPoints.reverseAll(rpTime); -// } else { -// traceBreakPoints.forwardAll(rpTime); -// } + TracePoint tp = analyzer.getBottomPoint(); + debuggingTp = tp.duplicate(); refresh(false); return true; } +// /** +// * ���݂̃f�o�b�O�ʒu�𒊏o�����f���^�̒�ӂ̃g���[�X�|�C���g�ɍ��킹�� (�Ƃ肠�����m�F���邾���p) +// * @return +// */ +// public boolean tmp() { +// DeltaExtractionAnalyzer analyzer = (DeltaExtractionAnalyzer)TraceDebuggerPlugin.getAnalyzer(); +// ReferencePoint rp = analyzer.getBottomPoint(); +// long previousTime = debuggingTp.getStatement().getTimeStamp(); +// long rpTime = rp.getTime(); +// debuggingTp = rp.getTracePoint(); +//// if (rpTime < previousTime) { +//// traceBreakPoints.reverseAll(rpTime); +//// } else { +//// traceBreakPoints.forwardAll(rpTime); +//// } +// refresh(false); +// return true; +// } + private void refresh(boolean isReturned) { MethodExecution me = debuggingTp.getMethodExecution(); int lineNo = debuggingTp.getStatement().getLineNo(); diff --git a/src/org/ntlab/traceDebugger/JavaEditorOperator.java b/src/org/ntlab/traceDebugger/JavaEditorOperator.java index 0e5ade2..0f1dcf7 100644 --- a/src/org/ntlab/traceDebugger/JavaEditorOperator.java +++ b/src/org/ntlab/traceDebugger/JavaEditorOperator.java @@ -1,24 +1,14 @@ package org.ntlab.traceDebugger; import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; import java.util.List; -import java.util.Map; - import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IProject; -import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.ResourcesPlugin; -import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; -import org.eclipse.debug.core.DebugPlugin; -import org.eclipse.debug.core.IBreakpointManager; -import org.eclipse.debug.core.model.IBreakpoint; -import org.eclipse.debug.core.model.ILineBreakpoint; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.IMethod; @@ -29,31 +19,21 @@ import org.eclipse.jdt.ui.JavaUI; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.IDocument; -import org.eclipse.jface.text.IRegion; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; -import org.eclipse.ui.editors.text.FileDocumentProvider; import org.eclipse.ui.ide.IDE; -import org.eclipse.ui.part.FileEditorInput; import org.eclipse.ui.texteditor.IDocumentProvider; import org.eclipse.ui.texteditor.ITextEditor; import org.ntlab.traceAnalysisPlatform.tracer.trace.ClassInfo; import org.ntlab.traceAnalysisPlatform.tracer.trace.MethodExecution; import org.ntlab.traceAnalysisPlatform.tracer.trace.TraceJSON; -import org.ntlab.traceDebugger.analyzerProvider.Alias; public class JavaEditorOperator { - private static List markers = new ArrayList<>(); - - public static void openSrcFileOfAlias(Alias alias) { - MethodExecution methodExecution = alias.getMethodExecution(); - int lineNo = alias.getLineNo(); - openSrcFileOfMethodExecution(methodExecution, lineNo); - } +// private static List markers = new ArrayList<>(); /** * �����œn����meCaller���ɂ���methodExecution����`����Ă���N���X�̃\�[�X�R�[�h��Ώ�Eclipse�̃G�f�B�^�ŊJ������ @@ -101,31 +81,69 @@ } } - public static void markAndOpenJavaFile(MethodExecution methodExecution, int lineNo, String message, String markerId) { - IFile file = findIFile(methodExecution); + public static void markAndOpenJavaFile(IMarker marker) { + IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); try { - FileEditorInput input = new FileEditorInput(file); - FileDocumentProvider provider = new FileDocumentProvider(); - provider.connect(input); - IDocument document = provider.getDocument(input); - IMarker marker = file.createMarker(markerId); - Map attributes = new HashMap<>(); - attributes.put(IMarker.MESSAGE, message); - attributes.put(IMarker.TRANSIENT, true); - if (lineNo > 1) { - IRegion r = document.getLineInformation(lineNo - 1); - attributes.put(IMarker.LINE_NUMBER, lineNo); - attributes.put(IMarker.CHAR_START, r.getOffset()); - attributes.put(IMarker.CHAR_END, r.getOffset() + r.getLength()); - } - marker.setAttributes(attributes); - markers.add(marker); - IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); IDE.openEditor(page, marker); - } catch (CoreException | BadLocationException e) { + } catch (PartInitException e) { e.printStackTrace(); } - } + } + +// public static void markAndOpenJavaFile(Alias alias, int lineNo, String markerId) { +// try { +// IFile file = findIFile(alias.getMethodExecution()); +// DeltaMarkerManager mgr = DeltaMarkerManager.getInstance(); +// IMarker marker = mgr.addMarker(alias, file, lineNo, markerId); +// IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); +// IDE.openEditor(page, marker); +// } catch (PartInitException e) { +// e.printStackTrace(); +// } +// } + +// public static void markAndOpenJavaFile(MethodExecution methodExecution, int lineNo, String findString, String message, String markerId) { +// IFile file = findIFile(methodExecution); +// try { +// FileEditorInput input = new FileEditorInput(file); +// FileDocumentProvider provider = new FileDocumentProvider(); +// provider.connect(input); +// IDocument document = provider.getDocument(input); +// FindReplaceDocumentAdapter findAdapter = new FindReplaceDocumentAdapter(document); +// IMarker marker = file.createMarker(markerId); +// Map attributes = new HashMap<>(); +// attributes.put(IMarker.MESSAGE, message); +// attributes.put(IMarker.TRANSIENT, true); +// if (lineNo > 1) { +// // ����s���̎w�肵�������񕔕����n�C���C�g (���݂��Ȃ��ꍇ�͓���s�S�̂��n�C���C�g) +// IRegion lineRegion = document.getLineInformation(lineNo - 1); +// IRegion findStringRegion = findAdapter.find(lineRegion.getOffset(), findString, true, true, true, false); +// if (findStringRegion != null) { +// attributes.put(IMarker.CHAR_START, findStringRegion.getOffset()); +// attributes.put(IMarker.CHAR_END, findStringRegion.getOffset() + findStringRegion.getLength()); +// } else { +// attributes.put(IMarker.CHAR_START, lineRegion.getOffset()); +// attributes.put(IMarker.CHAR_END, lineRegion.getOffset() + lineRegion.getLength()); +// } +// attributes.put(IMarker.LINE_NUMBER, lineNo); +// } else { +// // ���\�b�h�V�O�l�`�����n�C���C�g +// IType type = findIType(methodExecution); +// IMethod method = findIMethod(methodExecution, type); +// int start = method.getSourceRange().getOffset(); +// int end = start + method.getSource().indexOf(")") + 1; +// attributes.put(IMarker.CHAR_START, start); +// attributes.put(IMarker.CHAR_END, end); +// } +// +// marker.setAttributes(attributes); +// markers.add(marker); +// IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); +// IDE.openEditor(page, marker); +// } catch (CoreException | BadLocationException e) { +// e.printStackTrace(); +// } +// } // private static void tmp() { // IBreakpointManager mgr = DebugPlugin.getDefault().getBreakpointManager(); @@ -170,20 +188,20 @@ return ResourcesPlugin.getWorkspace().getRoot().getFile(path); } - public static void deleteMarkers(String markerId) { - Iterator it = markers.iterator(); - while (it.hasNext()) { - IMarker marker = it.next(); - try { - if (marker.getType().equals(markerId)) { - marker.delete(); - it.remove(); - } - } catch (CoreException e) { - e.printStackTrace(); - } - } - } +// public static void deleteMarkers(String markerId) { +// Iterator it = markers.iterator(); +// while (it.hasNext()) { +// IMarker marker = it.next(); +// try { +// if (marker.getType().equals(markerId)) { +// marker.delete(); +// it.remove(); +// } +// } catch (CoreException e) { +// e.printStackTrace(); +// } +// } +// } public static IType findIType(MethodExecution methodExecution) { String declaringClassName = methodExecution.getDeclaringClassName(); @@ -263,7 +281,7 @@ } } - private static IMethod findIMethod(MethodExecution methodExecution, IType type) { + public static IMethod findIMethod(MethodExecution methodExecution, IType type) { IMethod method = null; if (type != null) { String methodSignature = methodExecution.getSignature(); diff --git a/src/org/ntlab/traceDebugger/TraceDebuggerPlugin.java b/src/org/ntlab/traceDebugger/TraceDebuggerPlugin.java index dd5ad9a..0e6ee82 100644 --- a/src/org/ntlab/traceDebugger/TraceDebuggerPlugin.java +++ b/src/org/ntlab/traceDebugger/TraceDebuggerPlugin.java @@ -2,7 +2,6 @@ import org.eclipse.ui.plugin.AbstractUIPlugin; import org.ntlab.traceDebugger.analyzerProvider.AbstractAnalyzer; -import org.ntlab.traceDebugger.analyzerProvider.ObjectFlowAnalyzer; import org.osgi.framework.BundleContext; /** diff --git a/src/org/ntlab/traceDebugger/analyzerProvider/Alias.java b/src/org/ntlab/traceDebugger/analyzerProvider/Alias.java index 370f2e7..f07924f 100644 --- a/src/org/ntlab/traceDebugger/analyzerProvider/Alias.java +++ b/src/org/ntlab/traceDebugger/analyzerProvider/Alias.java @@ -1,91 +1,62 @@ package org.ntlab.traceDebugger.analyzerProvider; -import java.util.ArrayList; - -import org.ntlab.traceAnalysisPlatform.tracer.trace.ArrayAccess; -import org.ntlab.traceAnalysisPlatform.tracer.trace.ArrayCreate; -import org.ntlab.traceAnalysisPlatform.tracer.trace.ArrayUpdate; -import org.ntlab.traceAnalysisPlatform.tracer.trace.FieldAccess; -import org.ntlab.traceAnalysisPlatform.tracer.trace.FieldUpdate; import org.ntlab.traceAnalysisPlatform.tracer.trace.MethodExecution; -import org.ntlab.traceAnalysisPlatform.tracer.trace.MethodInvocation; -import org.ntlab.traceAnalysisPlatform.tracer.trace.ObjectReference; import org.ntlab.traceAnalysisPlatform.tracer.trace.Statement; -import org.ntlab.traceAnalysisPlatform.tracer.trace.Trace; import org.ntlab.traceAnalysisPlatform.tracer.trace.TracePoint; -/** - * �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_ARRAY = 1; - public static final int OCCURRENCE_EXP_FIRST_ARG = 1; - public static final int OCCURRENCE_EXP_RETURN = -1; + private AliasType aliasType; + private int index; - private static final String FIELD_ACCESS = "Field Access"; - private static final String FIELD_UPDATE = "Field Update"; - private static final String ARRAY_ACCESS = "Array Access"; - private static final String ARRAY_UPDATE = "Array Update"; - private static final String ARRAY_CREATE = "Array Create"; - private static final String METHOD_INVOCATION = "Method Invocation"; - private static final String CREATION = "Creation"; - - public Alias(String objectId, TracePoint occurrencePoint, int occurrenceExp) { + public enum AliasType { + // ���\�b�h�ւ̓��� + FORMAL_PARAMETER, + THIS, + METHOD_INVOCATION, + CONSTRACTOR_INVOCATION, + + // �ǐՃI�u�W�F�N�g�̐؂�ւ� + FIELD, + CONTAINER, + ARRAY_ELEMENT, + ARRAY, + ARRAY_CREATE, + + // ���\�b�h����̏o�� + ACTUAL_ARGUMENT, + RECEIVER, + RETURN_VALUE + } + + public Alias(AliasType aliasType, int index, String objectId, TracePoint occurrencePoint) { + this.aliasType = aliasType; + this.index = index; this.objectId = objectId; this.occurrencePoint = occurrencePoint; - this.occurrenceExp = occurrenceExp; + } + + public AliasType getAliasType() { + return aliasType; + } + + public int getIndex() { + return index; } public String getObjectId() { return objectId; } - + public TracePoint getOccurrencePoint() { return occurrencePoint; } - - public int getOccurrenceExp() { - return occurrenceExp; - } public MethodExecution getMethodExecution() { return occurrencePoint.getMethodExecution(); } - public String getMethodExecutionClassName() { - MethodExecution methodExecution = occurrencePoint.getMethodExecution(); - return Trace.getDeclaringType(methodExecution.getSignature(), methodExecution.isConstructor()); - } - - public String getSourceFileName() { - String methodExecutionClassName = getMethodExecutionClassName(); - methodExecutionClassName = methodExecutionClassName.replace(".", ""); - return methodExecutionClassName + ".java"; - } - public String getMethodSignature() { return occurrencePoint.getMethodExecution().getCallerSideSignature(); } @@ -94,147 +65,8 @@ Statement statement = occurrencePoint.getStatement(); return statement.getLineNo(); } - - public String getStatementType() { - Statement statement = occurrencePoint.getStatement(); - String statementType = ""; - if (statement instanceof FieldAccess) { - statementType = FIELD_ACCESS; - } else if (statement instanceof FieldUpdate) { - statementType = FIELD_UPDATE; - } else if (statement instanceof ArrayAccess) { - statementType = ARRAY_ACCESS; - } else if (statement instanceof ArrayUpdate) { - statementType = ARRAY_UPDATE; - } else if (statement instanceof ArrayCreate) { - statementType = ARRAY_CREATE; - } else if (statement instanceof MethodInvocation) { - MethodInvocation mi = (MethodInvocation)statement; - if (mi.getCalledMethodExecution().isConstructor()) { - statementType = CREATION; - } else { - statementType = METHOD_INVOCATION; - } - } - 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) { - className = ((ArrayUpdate) statement).getValueClassName(); - } else if (statement instanceof ArrayCreate) { - className = ((ArrayCreate) statement).getArrayClassName(); - } else if (statement instanceof MethodInvocation) { - MethodExecution me = ((MethodInvocation)statement).getCalledMethodExecution(); - if (occurrenceExp == OCCURRENCE_EXP_RETURN) { - className = me.getReturnValue().getActualType(); - } else if (occurrenceExp == OCCURRENCE_EXP_RECEIVER) { - className = me.getThisClassName(); - } else { - int index = occurrenceExp - OCCURRENCE_EXP_FIRST_ARG; - ArrayList args = me.getArguments(); - if (index >= 0 && index < args.size()) { - className = me.getArguments().get(index).getActualType(); - } - } - } - return className; - } - - public String getOccurrenceText() { - String statementType = getStatementType(); - switch (statementType) { - case FIELD_ACCESS: - case FIELD_UPDATE: - return (occurrenceExp == OCCURRENCE_EXP_CONTAINER) ? "Container" : "Field"; - case ARRAY_ACCESS: - case ARRAY_UPDATE: - return (occurrenceExp == OCCURRENCE_EXP_CONTAINER) ? "Array Object" : "Array Value"; - case ARRAY_CREATE: - return "New Array"; - case METHOD_INVOCATION: - if (occurrenceExp <= 0) { - return (occurrenceExp == OCCURRENCE_EXP_RECEIVER) ? "Receiver" : "Return Value"; - } - final String[] ORDER_TEXT = {"th", "st", "nd", "rd", "th", "th", "th", "th", "th", "th", "th", "th", "th", "th"}; // 0-13�ɑΉ� - if (occurrenceExp % 100 >= ORDER_TEXT.length) { - return occurrenceExp + ORDER_TEXT[occurrenceExp % 10] + " arg"; // ��2����14�ȏ�Ȃ�, ��1���̐����ɑΉ������� - } else if (occurrenceExp % 100 >= 0) { - return occurrenceExp + ORDER_TEXT[occurrenceExp % 100] + " arg"; // ��2����0�ȏ�13�ȉ��Ȃ�, ��2���̐����ɑΉ������� - } - case CREATION: - return "New Object"; - } - return String.valueOf(occurrenceExp); - } - - 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; - } - - @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: " + methodSignature + "\n"); - str.append(indent + "lineNo: " + statement.getLineNo() + "\n"); - str.append(indent + "statementType: " + statementType + " -> " + statementSigunarure + "\n"); - str.append("occurrenceExp: " + occurrenceExp + "\n"); - return str.toString(); + public void setIndex(int index) { + this.index = index; } } \ No newline at end of file diff --git a/src/org/ntlab/traceDebugger/analyzerProvider/DeltaExtractionAnalyzer.java b/src/org/ntlab/traceDebugger/analyzerProvider/DeltaExtractionAnalyzer.java index 0621515..231f5b5 100644 --- a/src/org/ntlab/traceDebugger/analyzerProvider/DeltaExtractionAnalyzer.java +++ b/src/org/ntlab/traceDebugger/analyzerProvider/DeltaExtractionAnalyzer.java @@ -1,10 +1,21 @@ package org.ntlab.traceDebugger.analyzerProvider; import java.util.ArrayList; -import java.util.Collections; import java.util.List; +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IMarker; +import org.eclipse.jface.text.FindReplaceDocumentAdapter; +import org.eclipse.jface.text.IRegion; +import org.eclipse.ui.PartInitException; +import org.ntlab.traceAnalysisPlatform.tracer.trace.ArrayAccess; +import org.ntlab.traceAnalysisPlatform.tracer.trace.ArrayUpdate; +import org.ntlab.traceAnalysisPlatform.tracer.trace.BlockEnter; +import org.ntlab.traceAnalysisPlatform.tracer.trace.FieldAccess; +import org.ntlab.traceAnalysisPlatform.tracer.trace.FieldUpdate; import org.ntlab.traceAnalysisPlatform.tracer.trace.MethodExecution; +import org.ntlab.traceAnalysisPlatform.tracer.trace.MethodInvocation; +import org.ntlab.traceAnalysisPlatform.tracer.trace.ObjectReference; import org.ntlab.traceAnalysisPlatform.tracer.trace.Reference; import org.ntlab.traceAnalysisPlatform.tracer.trace.Statement; import org.ntlab.traceAnalysisPlatform.tracer.trace.Trace; @@ -16,18 +27,22 @@ public class DeltaExtractionAnalyzer extends AbstractAnalyzer { private static DeltaExtractionAnalyzer getInstance = null; private DeltaExtractorJSON deltaExtractor; - private MethodExecution coordinator; - private ReferencePoint coordinatorPoint; - private List srcSidePoints = new ArrayList<>(); - private List dstSidePoints = new ArrayList<>(); - private ReferencePoint bottomPoint; - private Delta delta; - private static final String DELTA_MARKER_ID = "org.ntlab.traceDebugger.deltaMarker"; + private ExtractedStructure extractedStructure; +// private MethodExecution coordinator; +// private ReferencePoint coordinatorPoint; +// private List srcSideRelatedPoints = new ArrayList<>(); +// private List dstSideRelatedPoints = new ArrayList<>(); + + private TracePoint bottomPoint; + public static final String DELTA_MARKER_ID = "org.ntlab.traceDebugger.deltaMarker"; + public static final String DELTA_MARKER_ID_2 = "org.ntlab.traceDebugger.deltaMarker2"; // ���� public DeltaExtractionAnalyzer(Trace trace) { super(trace); deltaExtractor = new DeltaExtractorJSON((TraceJSON)trace); - JavaEditorOperator.deleteMarkers(DELTA_MARKER_ID); + DeltaMarkerManager mgr = DeltaMarkerManager.getInstance(); + mgr.deleteMarkers(DELTA_MARKER_ID); + mgr.deleteMarkers(DELTA_MARKER_ID_2); } private static DeltaExtractionAnalyzer getInstance() { @@ -37,20 +52,24 @@ return getInstance; } - public ReferencePoint getBottomPoint() { + public TracePoint getBottomPoint() { return bottomPoint; } - public ReferencePoint getCoordinatorPoint() { - return coordinatorPoint; - } +// public ReferencePoint getCoordinatorPoint() { +// return coordinatorPoint; +// } +// +// public List getSrcSideRelatedPoints() { +// return srcSideRelatedPoints; +// } +// +// public List getDstSideRelatedPoints() { +// return dstSideRelatedPoints; +// } - public List getSrcSidePoints() { - return srcSidePoints; - } - - public List getDstSidePoints() { - return dstSidePoints; + public ExtractedStructure geExtractedStructure() { + return extractedStructure; } public void extractDelta(Variable variable) { @@ -62,102 +81,126 @@ Reference reference = new Reference(srcId, dstId, srcClassName, dstClassName); reset(); - bottomPoint = createReferencePoint(reference, before, true); - coordinatorPoint = createCoordinatorReferencePoint(coordinator, bottomPoint.getMethodExecution()); - if (delta != null) { - for (Reference srcSideReference : delta.getSrcSide()) { - ReferencePoint rp = createReferencePoint(srcSideReference, before, false); - if (rp != null) srcSidePoints.add(rp); - } - for (Reference dstSideReference : delta.getDstSide()) { - ReferencePoint rp = createReferencePoint(dstSideReference, before, false); - if (rp != null) dstSidePoints.add(rp); - } - Collections.reverse(srcSidePoints); - Collections.reverse(dstSidePoints); - } - confirm(); - - String message; - int cnt = 1; - for (ReferencePoint rp : srcSidePoints) { - message = String.format("%s%03d: %s", "SrcSide", cnt, rp.getReferenceMessage()); - markAndOpenJavaFile(rp, message); - cnt++; - } - cnt = 1; - for (ReferencePoint rp : dstSidePoints) { - message = String.format("%s%03d: %s", "DstSide", cnt, rp.getReferenceMessage()); - markAndOpenJavaFile(rp, message); - cnt++; - } - message = String.format("%s: %s", "Coordinator", coordinatorPoint.getReferenceMessage()); - markAndOpenJavaFile(coordinatorPoint, message); - message = String.format("%s: %s", "Bottom", bottomPoint.getReferenceMessage()); - markAndOpenJavaFile(bottomPoint, message); - } - - private ReferencePoint createReferencePoint(Reference reference, TracePoint before, boolean isBottom) { - ExtractedStructure extractedStructure = deltaExtractor.extract(reference, before.duplicate()); - if (extractedStructure == null) return null; + DeltaRelatedAliasCollector aliasCollector = new DeltaRelatedAliasCollector(srcId, dstId); + extractedStructure = deltaExtractor.extract(reference, before.duplicate(), aliasCollector); MethodExecution creationCallTree = extractedStructure.getCreationCallTree(); - long beforeTime = before.getStatement().getTimeStamp(); - if (isBottom) { - coordinator = extractedStructure.getCoordinator(); - delta = extractedStructure.getDelta(); + List srcSideRelatedAliases = aliasCollector.getSrcSideRelatedAliases(); + List dstSideRelatedAliases = aliasCollector.getDstSideRelatedAliases(); + MethodExecution coordinator = extractedStructure.getCoordinator(); + + bottomPoint = findTracePoint(reference, creationCallTree, before.getStatement().getTimeStamp()); +// String message = String.format("Bottom %s", createMessage(bottomPoint.getStatement())); + String message = String.format("Bottom %s", ""); + markAndOpenJavaFile(bottomPoint.getMethodExecution(), bottomPoint.getStatement().getLineNo(), message, DELTA_MARKER_ID); + for (Alias alias: srcSideRelatedAliases) { + markAndOpenJavaFile(alias, DELTA_MARKER_ID); } - return new ReferencePoint(reference, creationCallTree, beforeTime); + for (Alias alias : dstSideRelatedAliases) { + markAndOpenJavaFile(alias, DELTA_MARKER_ID_2); + } + markAndOpenJavaFile(coordinator, -1 , "Coordinator", DELTA_MARKER_ID); } - private ReferencePoint createCoordinatorReferencePoint(MethodExecution coordinator, MethodExecution bottom) { - MethodExecution me = bottom; - MethodExecution childMe = null; - while (me != null) { - if (coordinator.equals(me)) break; - childMe = me; - me = me.getParent(); + private TracePoint findTracePoint(Reference reference, MethodExecution methodExecution, long beforeTime) { + List statements = methodExecution.getStatements(); + for (int i = statements.size() - 1; i >= 0; i--) { + Statement statement = statements.get(i); + if (!(statement instanceof FieldUpdate)) continue; + if (statement.getTimeStamp() > beforeTime) continue; + FieldUpdate fu = (FieldUpdate)statement; + if (fu.getContainerObjId().equals(reference.getSrcObjectId()) + && fu.getValueObjId().equals(reference.getDstObjectId())) { + return new TracePoint(methodExecution, i); + } } - Statement statement = null; - if (me != null && childMe != null) { - statement = me.getStatements().get(childMe.getCallerStatementExecution()); - } - return new ReferencePoint(null, me, statement); + return null; } + +// private String createMessage(Alias alias) { +// switch (alias.getAliasType()) { +// // ���\�b�h�ւ̓��� +// case FORMAL_PARAMETOR: +// case THIS: +// case METHOD_INVOCATION: +// case CONSTRACTOR_INVOCATION: +// +// // �ǐՃI�u�W�F�N�g�̐؂�ւ� +// case FIELD: +// case CONTAINER: +// case ARRAY_ELEMENT: +// case ARRAY: +// +// // ���\�b�h����̏o�� +// case ACTUAL_ARGUMENT: +// case RECEIVER: +// case RETURN_VALUE: +// +// } +// return ""; +// } + +// private String createFindString(Statement statement) { +// if (statement instanceof FieldAccess) { +// FieldAccess fa = (FieldAccess)statement; +// String fieldName = fa.getFieldName(); +// return fieldName.substring(fieldName.lastIndexOf(".") + 1); +// } else if (statement instanceof ArrayAccess) { +// ArrayAccess aa = (ArrayAccess)statement; +// return ""; +// } else if (statement instanceof MethodInvocation) { +// MethodInvocation mi = (MethodInvocation)statement; +// MethodExecution me = mi.getCalledMethodExecution(); +// String signature = me.getSignature(); +// signature = signature.substring(signature.lastIndexOf(".") + 1, signature.lastIndexOf("(")); +// return signature; +// } +// return ""; +// } +// +// private String createMessage(Statement statement) { +// if (statement instanceof FieldAccess) { +// FieldAccess fa = (FieldAccess)statement; +// String fieldName = fa.getFieldName(); +// String containerObjId = fa.getContainerObjId(); +// String valueObjId = fa.getValueObjId(); +// return "FA: " + fieldName + " (" + containerObjId + " -> " + valueObjId + ")"; +// } else if (statement instanceof ArrayAccess) { +// ArrayAccess aa = (ArrayAccess)statement; +// String arrayObjId = aa.getArrayObjectId(); +// String valueObjId = aa.getValueObjectId(); +// return "AA: " + " (" + arrayObjId + " -> " + valueObjId + ")"; +// } else if (statement instanceof MethodInvocation) { +// MethodInvocation mi = (MethodInvocation)statement; +// MethodExecution me = mi.getCalledMethodExecution(); +// String signature = me.getSignature(); +// return "MI: " + signature; +// } +// return ""; +// } + private void reset() { - coordinator = null; - srcSidePoints.clear(); - dstSidePoints.clear(); bottomPoint = null; - delta = null; - JavaEditorOperator.deleteMarkers(DELTA_MARKER_ID); + DeltaMarkerManager mgr = DeltaMarkerManager.getInstance(); + mgr.deleteMarkers(DELTA_MARKER_ID); + mgr.deleteMarkers(DELTA_MARKER_ID_2); } - private void markAndOpenJavaFile(ReferencePoint rp, String message) { - if (rp == null) return; - MethodExecution methodExecution = rp.getMethodExecution(); - int lineNo = rp.getLineNo(); - JavaEditorOperator.markAndOpenJavaFile(methodExecution, lineNo, message, DELTA_MARKER_ID); + private void markAndOpenJavaFile(Alias alias, String markerId) { +// MethodExecution me = tp.getMethodExecution(); +// int lineNo = tp.getStatement().getLineNo(); +// JavaEditorOperator.markAndOpenJavaFile(me, lineNo, findString, message, markerId, deltaMarkerMgr); + + IFile file = JavaEditorOperator.findIFile(alias.getMethodExecution()); + DeltaMarkerManager mgr = DeltaMarkerManager.getInstance(); + IMarker marker = mgr.addMarker(alias, file, markerId); + JavaEditorOperator.markAndOpenJavaFile(marker); } - private void confirm() { - System.out.println(); - System.out.println(); - System.out.println("Coordinator:"); - System.out.println(" " + coordinator); - System.out.println(); - System.out.println("SrcSide:"); - for (ReferencePoint point : srcSidePoints) { - System.out.println(" " + point); - } - System.out.println(); - System.out.println("DstSide: "); - for (ReferencePoint point : dstSidePoints) { - System.out.println(" " + point); - } - System.out.println(); - System.out.println("Bottom:"); - System.out.println(" " + bottomPoint); - System.out.println(); + private void markAndOpenJavaFile(MethodExecution methodExecution, int lineNo, String message, String markerId) { + IFile file = JavaEditorOperator.findIFile(methodExecution); + DeltaMarkerManager mgr = DeltaMarkerManager.getInstance(); + IMarker marker = mgr.addMarker(methodExecution, lineNo, file, message, markerId); + JavaEditorOperator.markAndOpenJavaFile(marker); } } \ No newline at end of file diff --git a/src/org/ntlab/traceDebugger/analyzerProvider/DeltaExtractor.java b/src/org/ntlab/traceDebugger/analyzerProvider/DeltaExtractor.java index ca2a414..79fed07 100644 --- a/src/org/ntlab/traceDebugger/analyzerProvider/DeltaExtractor.java +++ b/src/org/ntlab/traceDebugger/analyzerProvider/DeltaExtractor.java @@ -36,6 +36,14 @@ protected static final boolean DEBUG1 = true; protected static final boolean DEBUG2 = true; + protected final IAliasCollector defaultAliasCollector = new IAliasCollector() { + @Override + public void changeTrackingObject(String from, String to) { + } + @Override + public void addAlias(Alias alias) { + } + }; public DeltaExtractor(String traceFile) { trace = new Trace(traceFile); @@ -83,6 +91,19 @@ * @throws TraceFileException */ protected MethodExecution callerSearch(Trace trace, TracePoint tracePoint, ArrayList objList, MethodExecution childMethodExecution) { + return callerSearch(trace, tracePoint, objList, childMethodExecution, defaultAliasCollector); + } + + /** + * �f���^���o�A���S���Y���̌Ăяo�����T�������icalleeSearch�Ƒ��ݍċA�ɂȂ��Ă���j + * @param trace�@��͑Ώۃg���[�X + * @param methodExecution �T�����郁�\�b�h���s + * @param objList�@�ǐՒ��̃I�u�W�F�N�g + * @param child�@���O�ɒT�����Ă����Ăяo����̃��\�b�h���s + * @return ���‚������R�[�f�B�l�[�^ + * @throws TraceFileException + */ + protected MethodExecution callerSearch(Trace trace, TracePoint tracePoint, ArrayList objList, MethodExecution childMethodExecution, IAliasCollector aliasCollector) { MethodExecution methodExecution = tracePoint.getMethodExecution(); methodExecution.setAugmentation(new DeltaAugmentationInfo()); eStructure.createParent(methodExecution); @@ -228,7 +249,7 @@ ((DeltaAugmentationInfo)prevChildMethodExecution.getAugmentation()).setTraceObjectId(Integer.parseInt(retObj)); // �ǐՑΏ� TracePoint prevChildTracePoint = tracePoint.duplicate(); prevChildTracePoint.stepBackNoReturn(); - calleeSearch(trace, prevChildTracePoint, objList, prevChildMethodExecution.isStatic(), retIndex); // �Ăяo�����T�� + calleeSearch(trace, prevChildTracePoint, objList, prevChildMethodExecution.isStatic(), retIndex, aliasCollector); // �Ăяo�����T�� if (objList.get(retIndex) != null && objList.get(retIndex).equals(prevChildMethodExecution.getThisObjId()) && thisObjectId.equals(prevChildMethodExecution.getThisObjId())) { // �Ăяo����Ńt�B�[���h�Ɉˑ����Ă����ꍇ�̏��� @@ -418,7 +439,7 @@ // } if (tracePoint.isValid()) { finalCount = 0; - return callerSearch(trace, tracePoint, objList, methodExecution); // �Ăяo����������ɒT�� + return callerSearch(trace, tracePoint, objList, methodExecution, aliasCollector); // �Ăяo����������ɒT�� } } @@ -434,7 +455,7 @@ if (finalCount <= LOST_DECISION_EXTENSION) { // final�ϐ����Q�Ƃ��Ă���ꍇ�R���������ł��Ȃ��”\��������̂ŁA�ǐՂ������I�������P�\���Ԃ�݂��� if (tracePoint.isValid()) { - MethodExecution c = callerSearch(trace, tracePoint, objList, methodExecution); // �Ăяo����������ɒT�� + MethodExecution c = callerSearch(trace, tracePoint, objList, methodExecution, aliasCollector); // �Ăяo����������ɒT�� if (((DeltaAugmentationInfo)c.getAugmentation()).isCoodinator()) { methodExecution = c; // �ǐՂ𑱂������ʃR�[�f�B�l�[�^�����‚����� } @@ -489,7 +510,7 @@ * @param index�@objList���̂ǂ̃I�u�W�F�N�g��ǐՂ��Ă��̃��\�b�h���s�ɓ����Ă����̂� * @throws TraceFileException */ - protected void calleeSearch(Trace trace, TracePoint tracePoint, ArrayList objList, Boolean isStatic, int index) { + protected void calleeSearch(Trace trace, TracePoint tracePoint, ArrayList objList, Boolean isStatic, int index, IAliasCollector aliasCollector) { MethodExecution methodExecution = tracePoint.getMethodExecution(); Boolean isResolved = false; String objectId = objList.get(index); // calleeSearch() �ł͒ǐՑΏۂ̃I�u�W�F�N�g�͈�‚����A��objList��index�Ԗڂ̗v�f�ȊO�ύX���Ă͂����Ȃ� @@ -589,7 +610,7 @@ ((DeltaAugmentationInfo)childMethodExecution.getAugmentation()).setTraceObjectId(Integer.parseInt(objectId)); TracePoint childTracePoint = tracePoint.duplicate(); childTracePoint.stepBackNoReturn(); - calleeSearch(trace, childTracePoint, objList, childMethodExecution.isStatic(), index); // �Ăяo���������ɒT�� + calleeSearch(trace, childTracePoint, objList, childMethodExecution.isStatic(), index, aliasCollector); // �Ăяo���������ɒT�� if (childMethodExecution.isConstructor()) { // �R���X�g���N�^�Ăяo���������ꍇ if (objectId.equals(srcObject.getId())) { @@ -770,6 +791,17 @@ * @return ���o���� */ public ExtractedStructure extract(Reference targetRef, TracePoint before) { + return extract(targetRef, before, defaultAliasCollector); + } + + /** + * �݌v�ύX��̃A���S���Y���̋N�����\�b�h(������) + * @param targetRef �ΏۂƂȂ�Q�� + * @param before �T���J�n�g���[�X�|�C���g(������ȑO��T��) + * @param aliasCollector �f���^���o���ɒǐՂ����I�u�W�F�N�g�̑S�G�C���A�X�����W���郊�X�i + * @return ���o���� + */ + public ExtractedStructure extract(Reference targetRef, TracePoint before, IAliasCollector aliasCollector) { TracePoint creationTracePoint; if (targetRef.isArray()) { // srcId �̔z��� dstId ���������Ă���”\�������郁�\�b�h���s���擾�i�z���p�̏����j @@ -788,7 +820,7 @@ if (creationTracePoint == null) { return null; } - return extractSub(creationTracePoint, targetRef); + return extractSub(creationTracePoint, targetRef, aliasCollector); } /** @@ -801,13 +833,30 @@ Statement statement = creationTracePoint.getStatement(); if (statement instanceof FieldUpdate) { Reference targetRef = ((FieldUpdate)statement).getReference(); - return extractSub(creationTracePoint, targetRef); + return extractSub(creationTracePoint, targetRef, defaultAliasCollector); + } else { + return null; + } + } + + /** + * �݌v�ύX��̃A���S���Y���̋N�����\�b�h(������) + * @param creationTracePoint �I�u�W�F�N�g�ԎQ�Ɛ����g���[�X�|�C���g(�t�B�[���h�ւ̑��) + * @param aliasCollector �f���^���o���ɒǐՂ����I�u�W�F�N�g�̑S�G�C���A�X�����W���郊�X�i + * @return ���o���� + */ + public ExtractedStructure extract(TracePoint creationTracePoint, IAliasCollector aliasCollector) { + creationTracePoint = creationTracePoint.duplicate(); + Statement statement = creationTracePoint.getStatement(); + if (statement instanceof FieldUpdate) { + Reference targetRef = ((FieldUpdate)statement).getReference(); + return extractSub(creationTracePoint, targetRef, aliasCollector); } else { return null; } } - private ExtractedStructure extractSub(TracePoint creationTracePoint, Reference targetRef) { + private ExtractedStructure extractSub(TracePoint creationTracePoint, Reference targetRef, IAliasCollector aliasCollector) { eStructure = new ExtractedStructure(); ArrayList objList = new ArrayList(); srcObject = targetRef.getSrcObject(); @@ -825,10 +874,14 @@ } else { objList.add(null); } - return extractSub2(creationTracePoint, objList); + return extractSub2(creationTracePoint, objList, aliasCollector); + } + + public ExtractedStructure extract(TracePoint tracePoint, ObjectReference argObj) { + return extract(tracePoint, argObj, defaultAliasCollector); } - public ExtractedStructure extract(TracePoint tracePoint, ObjectReference argObj) { + public ExtractedStructure extract(TracePoint tracePoint, ObjectReference argObj, IAliasCollector aliasCollector) { MethodExecution methodExecution = tracePoint.getMethodExecution(); eStructure = new ExtractedStructure(); ArrayList objList = new ArrayList(); @@ -841,12 +894,12 @@ if (DEBUG1) { System.out.println("extract delta of:" + methodExecution.getSignature() + " -> " + argObj.getActualType() + "(" + argObj.getId() + ")"); } - return extractSub2(tracePoint, objList); + return extractSub2(tracePoint, objList, aliasCollector); } - private ExtractedStructure extractSub2(TracePoint creationTracePoint, ArrayList objList) { + private ExtractedStructure extractSub2(TracePoint creationTracePoint, ArrayList objList, IAliasCollector aliasCollector) { eStructure.setCreationMethodExecution(creationTracePoint.getMethodExecution()); - MethodExecution coordinator = callerSearch(trace, creationTracePoint, objList, null); + MethodExecution coordinator = callerSearch(trace, creationTracePoint, objList, null, aliasCollector); eStructure.setCoordinator(coordinator); if (DEBUG2) { if (((DeltaAugmentationInfo)coordinator.getAugmentation()).isCoodinator()) { @@ -880,32 +933,53 @@ } /** - * �Q�ƌ��ƎQ�Ɛ�̃I�u�W�F�N�g���w�肵�ăf���^�𒊏o����(�I�����C����͗p) - * @param srcObj �Q�ƌ��I�u�W�F�N�g - * @param dstObj �Q�Ɛ�I�u�W�F�N�g + * ���ۂ̎Q�ƌ��ƎQ�Ɛ�̃I�u�W�F�N�g���w�肵�ăf���^�𒊏o����(�I�����C����͗p) + * @param srcObj ��������ɂ���Q�ƌ��I�u�W�F�N�g + * @param dstObj ��������ɂ���Q�Ɛ�I�u�W�F�N�g * @param before �T���J�n�g���[�X�|�C���g(������ȑO��T��) * @return�@���o���� */ public ExtractedStructure extract(Object srcObj, Object dstObj, TracePoint before) { - Reference targetRef = new Reference(Integer.toString(System.identityHashCode(srcObj)), Integer.toString(System.identityHashCode(dstObj)), null, null); - return extract(targetRef, before); + return extract(srcObj, dstObj, before, defaultAliasCollector); } - /** - * ���\�b�h���s���̃g���[�X�|�C���g�ƎQ�Ɛ�I�u�W�F�N�g���w�肵�ăf���^�𒊏o����(�I�����C����͗p) + * ���ۂ̎Q�ƌ��ƎQ�Ɛ�̃I�u�W�F�N�g���w�肵�ăf���^�𒊏o����(�I�����C����͗p) + * @param srcObj ��������ɂ���Q�ƌ��I�u�W�F�N�g + * @param dstObj ��������ɂ���Q�Ɛ�I�u�W�F�N�g + * @param before �T���J�n�g���[�X�|�C���g(������ȑO��T��) + * @param aliasCollector �f���^���o���ɒǐՂ����I�u�W�F�N�g�̑S�G�C���A�X�����W���郊�X�i + * @return�@���o���� + */ + public ExtractedStructure extract(Object srcObj, Object dstObj, TracePoint before, IAliasCollector aliasCollector) { + Reference targetRef = new Reference(Integer.toString(System.identityHashCode(srcObj)), Integer.toString(System.identityHashCode(dstObj)), null, null); + return extract(targetRef, before, aliasCollector); + } + + /** + * ���\�b�h���s���̃g���[�X�|�C���g�Ǝ��ۂ̎Q�Ɛ�I�u�W�F�N�g���w�肵�ăf���^�𒊏o����(�I�����C����͗p) * @param tracePoint ���\�b�h���s���̃g���[�X�|�C���g - * @param arg �Q�Ɛ�I�u�W�F�N�g(���[�J���ϐ�������ɂ��Q�Ɛ�) + * @param arg ��������ɂ���Q�Ɛ�I�u�W�F�N�g(���[�J���ϐ�������ɂ��Q�Ɛ�) * @return ���o���� */ public ExtractedStructure extract(TracePoint tracePoint, Object arg) { - ObjectReference argObj = new ObjectReference(Integer.toString(System.identityHashCode(arg))); - return extract(tracePoint, argObj); + return extract(tracePoint, arg, defaultAliasCollector); } /** - * �w�肵���X���b�h��Ō��ݎ��s���̃��\�b�h���s���擾����(�I�����C����͗p) - * @param thread �ΏۃX���b�h + * ���\�b�h���s���̃g���[�X�|�C���g�Ǝ��ۂ̎Q�Ɛ�I�u�W�F�N�g���w�肵�ăf���^�𒊏o����(�I�����C����͗p) + * @param tracePoint ���\�b�h���s���̃g���[�X�|�C���g + * @param arg ��������ɂ���Q�Ɛ�I�u�W�F�N�g(���[�J���ϐ�������ɂ��Q�Ɛ�) + * @return ���o���� + */ + public ExtractedStructure extract(TracePoint tracePoint, Object arg, IAliasCollector aliasCollector) { + ObjectReference argObj = new ObjectReference(Integer.toString(System.identityHashCode(arg))); + return extract(tracePoint, argObj, aliasCollector); + } + + /** + * �w�肵�����ۂ̃X���b�h��Ō��ݎ��s���̃��\�b�h���s���擾����(�I�����C����͗p) + * @param thread ���ݎ��s���̑ΏۃX���b�h * @return thread ��Ō��ݎ��s���̃��\�b�h���s */ public MethodExecution getCurrentMethodExecution(Thread thread) { @@ -1038,4 +1112,4 @@ //} // return eStructure; // } -} +} \ No newline at end of file diff --git a/src/org/ntlab/traceDebugger/analyzerProvider/DeltaExtractorJSON.java b/src/org/ntlab/traceDebugger/analyzerProvider/DeltaExtractorJSON.java index 29b2b9f..53020a1 100644 --- a/src/org/ntlab/traceDebugger/analyzerProvider/DeltaExtractorJSON.java +++ b/src/org/ntlab/traceDebugger/analyzerProvider/DeltaExtractorJSON.java @@ -1,6 +1,9 @@ package org.ntlab.traceDebugger.analyzerProvider; import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import org.ntlab.traceAnalysisPlatform.tracer.trace.ArrayAccess; import org.ntlab.traceAnalysisPlatform.tracer.trace.ArrayCreate; @@ -29,7 +32,7 @@ public DeltaExtractorJSON(TraceJSON trace) { super(trace); } - + /** * �f���^���o�A���S���Y���̌Ăяo�����T�������icalleeSearch�Ƒ��ݍċA�ɂȂ��Ă���j * @param trace�@��͑Ώۃg���[�X @@ -39,7 +42,7 @@ * @return ���‚������R�[�f�B�l�[�^ * @throws TraceFileException */ - protected MethodExecution callerSearch(Trace trace, TracePoint tracePoint, ArrayList objList, MethodExecution childMethodExecution) { + protected MethodExecution callerSearch(Trace trace, TracePoint tracePoint, ArrayList objList, MethodExecution childMethodExecution, IAliasCollector aliasCollector) { MethodExecution methodExecution = tracePoint.getMethodExecution(); methodExecution.setAugmentation(new DeltaAugmentationInfo()); eStructure.createParent(methodExecution); @@ -52,6 +55,8 @@ ObjectReference thisObj = new ObjectReference(thisObjectId, methodExecution.getThisClassName(), Trace.getDeclaringType(methodExecution.getSignature(), methodExecution.isConstructor()), Trace.getDeclaringType(methodExecution.getCallerSideSignature(), methodExecution.isConstructor())); + HashMap aliasList = new HashMap<>(); + if (childMethodExecution == null) { // �T���J�n���͈�U�폜���A�Ăяo�����̒T���𑱂���ۂɕ��������� removeList.add(thisObjectId); // ��ň�U�AthisObject ����菜�� @@ -65,6 +70,16 @@ removeList.add(thisObjectId); // ��ň�U�AthisObject ����菜�� isTrackingThis = true; // �Ăяo�����T���O�ɕ��� } + + aliasCollector.addAlias(new Alias(Alias.AliasType.RECEIVER, 0, childMethodExecution.getThisObjId(), tracePoint.duplicate())); + } + + if (childMethodExecution != null) { + for (String objId : objList) { + if (!objId.equals(childMethodExecution.getThisObjId())) { + aliasCollector.addAlias(new Alias(Alias.AliasType.ACTUAL_ARGUMENT, -1, objId, tracePoint.duplicate())); // argIndex�͕s�� + } + } } if (childMethodExecution != null && childMethodExecution.isConstructor()) { @@ -100,11 +115,13 @@ int index = objList.indexOf(refObjectId); if (index != -1) { String ownerObjectId = fs.getContainerObjId(); + if (ownerObjectId.equals(thisObjectId)) { // �t�B�[���h�Q�Ƃ̏ꍇ removeList.add(refObjectId); existsInFields++; // set�������get�����o���Ă���”\�������� - removeList.add(thisObjectId); // ��ň�U�AthisObject ����菜�� + removeList.add(thisObjectId); // ��ň�U�AthisObject ����菜�� + aliasList.put(refObjectId, new Alias(Alias.AliasType.FIELD, 0, refObjectId, tracePoint.duplicate())); } else { // ���ڎQ�Ƃ̏ꍇ if (refObjectId.equals(srcObject.getId())) { @@ -117,6 +134,9 @@ dstObject = new ObjectReference(ownerObjectId, fs.getContainerClassName()); } objList.set(index, ownerObjectId); + aliasCollector.addAlias(new Alias(Alias.AliasType.FIELD, 0, refObjectId, tracePoint.duplicate())); + aliasCollector.changeTrackingObject(refObjectId, ownerObjectId); //�ǐՑΏۃI�u�W�F�N�g�̐؂�ւ� + aliasCollector.addAlias(new Alias(Alias.AliasType.CONTAINER, 0, ownerObjectId, tracePoint.duplicate())); } } } else if (statement instanceof ArrayAccess) { @@ -136,6 +156,9 @@ dstObject = new ObjectReference(arrayObjectId, aa.getArrayClassName()); } objList.set(index, arrayObjectId); + aliasCollector.addAlias(new Alias(Alias.AliasType.ARRAY_ELEMENT, aa.getIndex(), elementObjectId, tracePoint.duplicate())); + aliasCollector.changeTrackingObject(elementObjectId, arrayObjectId); //�ǐՑΏۃI�u�W�F�N�g�̐؂�ւ� + aliasCollector.addAlias(new Alias(Alias.AliasType.ARRAY, 0, arrayObjectId, tracePoint.duplicate())); } } else if (statement instanceof ArrayCreate) { ArrayCreate ac = (ArrayCreate)statement; @@ -147,6 +170,7 @@ removeList.add(arrayObjectId); existsInFields++; removeList.add(thisObjectId); // ��ň�U�AthisObject ����菜�� + aliasList.put(arrayObjectId, new Alias(Alias.AliasType.ARRAY_CREATE, 0, arrayObjectId, tracePoint.duplicate())); } } else if (statement instanceof MethodInvocation) { MethodExecution prevChildMethodExecution = ((MethodInvocation)statement).getCalledMethodExecution(); @@ -159,6 +183,7 @@ if (retIndex != -1) { // �߂�l���R�������� prevChildMethodExecution.setAugmentation(new DeltaAugmentationInfo()); + if (prevChildMethodExecution.isConstructor()) { // �ǐՑΏۂ�constractor���Ă�ł�����(�I�u�W�F�N�g�̐�����������)field�Ɠ��l�ɏ��� String newObjId = ret.getId(); @@ -168,9 +193,11 @@ removeList.add(thisObjectId); // ��ň�U�AthisObject ����菜�� ((DeltaAugmentationInfo)prevChildMethodExecution.getAugmentation()).setTraceObjectId(Integer.parseInt(newObjId)); // �ǐՑΏ� ((DeltaAugmentationInfo)prevChildMethodExecution.getAugmentation()).setSetterSide(false); // getter�Ăяo���Ɠ��l + aliasList.put(newObjId, new Alias(Alias.AliasType.CONSTRACTOR_INVOCATION, 0, newObjId, tracePoint.duplicate())); continue; } String retObj = objList.get(retIndex); + aliasCollector.addAlias(new Alias(Alias.AliasType.METHOD_INVOCATION, 0, retObj, tracePoint.duplicate())); if (removeList.contains(retObj)) { // ��xget�Ō��o���ăt�B�[���h�Ɉˑ����Ă���Ɣ��f�������{���̗R�����߂�l���������Ƃ����������̂ŁA�t�B�[���h�ւ̈ˑ����L�����Z������ removeList.remove(retObj); @@ -182,12 +209,14 @@ ((DeltaAugmentationInfo)prevChildMethodExecution.getAugmentation()).setTraceObjectId(Integer.parseInt(retObj)); // �ǐՑΏ� TracePoint prevChildTracePoint = tracePoint.duplicate(); prevChildTracePoint.stepBackNoReturn(); - calleeSearch(trace, prevChildTracePoint, objList, prevChildMethodExecution.isStatic(), retIndex); // �Ăяo�����T�� - if (objList.get(retIndex) != null && objList.get(retIndex).equals(prevChildMethodExecution.getThisObjId()) - && thisObjectId.equals(prevChildMethodExecution.getThisObjId())) { - // �Ăяo����Ńt�B�[���h�Ɉˑ����Ă����ꍇ�̏��� - removeList.add(thisObjectId); // ��ň�U�AthisObject ����菜�� - isTrackingThis = true; // �Ăяo�����T���O�ɕ��� + calleeSearch(trace, prevChildTracePoint, objList, prevChildMethodExecution.isStatic(), retIndex, aliasCollector); // �Ăяo�����T�� + if (objList.get(retIndex) != null && objList.get(retIndex).equals(prevChildMethodExecution.getThisObjId())) { + if ( thisObjectId.equals(prevChildMethodExecution.getThisObjId())) { + // �Ăяo����Ńt�B�[���h�Ɉˑ����Ă����ꍇ�̏��� + removeList.add(thisObjectId); // ��ň�U�AthisObject ����菜�� + isTrackingThis = true; // �Ăяo�����T���O�ɕ��� + } + aliasCollector.addAlias(new Alias(Alias.AliasType.RECEIVER, 0, objList.get(retIndex), tracePoint.duplicate())); } if (isLost) { checkList.add(objList.get(retIndex)); @@ -206,14 +235,14 @@ } // �����̎擾 - ArrayList argments = methodExecution.getArguments(); + ArrayList arguments = methodExecution.getArguments(); // �����ƃt�B�[���h�ɓ���ID�̃I�u�W�F�N�g������ꍇ��z�� Reference r; for (int i = 0; i < removeList.size(); i++) { String removeId = removeList.get(i); - if (argments.contains(new ObjectReference(removeId))) { - removeList.remove(removeId); // �t�B�[���h�ƈ����̗����ɒǐՑΏۂ����݂����ꍇ�A������D�� + if (arguments.contains(new ObjectReference(removeId))) { + removeList.remove(removeId); // �t�B�[���h�ƈ����̗����ɒǐՑΏۂ����݂����ꍇ�A������D��(���A�P�[�X) } else if(objList.contains(removeId)) { // �t�B�[���h�ɂ����Ȃ������ꍇ(�������A�I�u�W�F�N�g�̐������t�B�[���h�Ɠ��l�Ɉ���) objList.remove(removeId); // �ǐՑΏۂ���O�� @@ -231,7 +260,10 @@ eStructure.addDstSide(r); dstObject = thisObj; isSrcSide = false; - } + } + aliasCollector.addAlias(aliasList.get(removeId)); + aliasCollector.changeTrackingObject(removeId, thisObjectId); + aliasCollector.addAlias(new Alias(Alias.AliasType.THIS, 0, thisObjectId, aliasList.get(removeId).getOccurrencePoint())); } } } @@ -243,10 +275,11 @@ String objectId = objList.get(i); if (objectId != null) { ObjectReference trackingObj = new ObjectReference(objectId); - if (argments.contains(trackingObj)) { + if (arguments.contains(trackingObj)) { // �������R�������� existsInAnArgument = true; ((DeltaAugmentationInfo)methodExecution.getAugmentation()).setTraceObjectId(Integer.parseInt(objectId)); + aliasCollector.addAlias(new Alias(Alias.AliasType.FORMAL_PARAMETER, arguments.indexOf(trackingObj), trackingObj.getId(), methodExecution.getEntryPoint())); } else { // �R�����ǂ��ɂ����‚���Ȃ����� boolean isSrcSide2 = true; @@ -266,14 +299,14 @@ if (existsInFields > 0 || isTrackingThis) { // this�I�u�W�F�N�g��ǐՒ��̏ꍇ if (!Trace.isNull(thisObjectId)) { - objList.add(thisObjectId); // ����ɒT������ꍇ�A��U��菜���� thisObject �𕜊� + objList.add(thisObjectId); // ����ɒT������ꍇ�A��U��菜���� thisObject �𕜊� } else { objList.add(null); // ������static�Ăяo���������ꍇ�A����ȏ�ǐՂ��Ȃ� } } if (tracePoint.isValid()) { finalCount = 0; - return callerSearch(trace, tracePoint, objList, methodExecution); // �Ăяo����������ɒT�� + return callerSearch(trace, tracePoint, objList, methodExecution, aliasCollector); // �Ăяo����������ɒT�� } } @@ -289,7 +322,7 @@ if (finalCount <= LOST_DECISION_EXTENSION) { // final�ϐ����Q�Ƃ��Ă���ꍇ�R���������ł��Ȃ��”\��������̂ŁA�ǐՂ������I�������P�\���Ԃ�݂��� if (tracePoint.isValid()) { - MethodExecution c = callerSearch(trace, tracePoint, objList, methodExecution); // �Ăяo����������ɒT�� + MethodExecution c = callerSearch(trace, tracePoint, objList, methodExecution, aliasCollector); // �Ăяo����������ɒT�� if (((DeltaAugmentationInfo)c.getAugmentation()).isCoodinator()) { methodExecution = c; // �ǐՂ𑱂������ʃR�[�f�B�l�[�^�����‚����� } @@ -344,7 +377,7 @@ * @param index�@objList���̂ǂ̃I�u�W�F�N�g��ǐՂ��Ă��̃��\�b�h���s�ɓ����Ă����̂� * @throws TraceFileException */ - protected void calleeSearch(Trace trace, TracePoint tracePoint, ArrayList objList, Boolean isStatic, int index) { + protected void calleeSearch(Trace trace, TracePoint tracePoint, ArrayList objList, Boolean isStatic, int index, IAliasCollector aliasCollector) { MethodExecution methodExecution = tracePoint.getMethodExecution(); Boolean isResolved = false; String objectId = objList.get(index); // calleeSearch() �ł͒ǐՑΏۂ̃I�u�W�F�N�g�͈�‚����A��objList��index�Ԗڂ̗v�f�ȊO�ύX���Ă͂����Ȃ� @@ -354,8 +387,10 @@ Trace.getDeclaringType(methodExecution.getCallerSideSignature(), methodExecution.isConstructor())); ((DeltaAugmentationInfo)methodExecution.getAugmentation()).setSetterSide(false); // ��{�I��getter�Ăяo���̂͂������A���� - ArrayList argments = methodExecution.getArguments(); + ArrayList arguments = methodExecution.getArguments(); ObjectReference trackingObj = null; + + aliasCollector.addAlias(new Alias(Alias.AliasType.RETURN_VALUE, 0, objectId, tracePoint.duplicate())); //static���o�R�����null�������Ă��鎞������ if (objectId != null) { String returnType = Trace.getReturnType(methodExecution.getSignature()); @@ -377,7 +412,7 @@ // ���ڎQ�Ƃ���уt�B�[���h�Q�Ƃ̒T�� if (statement instanceof FieldAccess) { FieldAccess fs = (FieldAccess)statement; - if (objectId != null && objectId.equals(fs.getValueObjId())) { + if (objectId != null && objectId.equals(fs.getValueObjId())) { String ownerObjectId = fs.getContainerObjId(); if (ownerObjectId.equals(thisObjectId)) { // �t�B�[���h�Q�Ƃ̏ꍇ @@ -390,6 +425,9 @@ dstObject = thisObj; trackingObj = dstObject; } + aliasCollector.addAlias(new Alias(Alias.AliasType.FIELD, 0, objectId, tracePoint.duplicate())); + aliasCollector.changeTrackingObject(objectId, ownerObjectId); + aliasCollector.addAlias(new Alias(Alias.AliasType.THIS, 0, ownerObjectId, tracePoint.duplicate())); if (Trace.isNull(thisObjectId)) objectId = null; // static�ϐ��̏ꍇ else objectId = thisObjectId; objList.set(index, objectId); @@ -406,6 +444,9 @@ dstObject = new ObjectReference(ownerObjectId, fs.getContainerClassName()); trackingObj = dstObject; } + aliasCollector.addAlias(new Alias(Alias.AliasType.FIELD, 0, objectId, tracePoint.duplicate())); + aliasCollector.changeTrackingObject(objectId, ownerObjectId); + aliasCollector.addAlias(new Alias(Alias.AliasType.CONTAINER, 0, ownerObjectId, tracePoint.duplicate())); if (Trace.isNull(ownerObjectId)) objectId = null; // static�ϐ��̏ꍇ else objectId = ownerObjectId; objList.set(index, objectId); @@ -428,6 +469,9 @@ dstObject = new ObjectReference(arrayObjectId, aa.getArrayClassName()); trackingObj = dstObject; } + aliasCollector.addAlias(new Alias(Alias.AliasType.ARRAY_ELEMENT, aa.getIndex(), objectId, tracePoint.duplicate())); + aliasCollector.changeTrackingObject(objectId, arrayObjectId); + aliasCollector.addAlias(new Alias(Alias.AliasType.ARRAY, 0, arrayObjectId, tracePoint.duplicate())); objectId = arrayObjectId; objList.set(index, objectId); isResolved = true; @@ -458,7 +502,8 @@ ((DeltaAugmentationInfo)childMethodExecution.getAugmentation()).setTraceObjectId(Integer.parseInt(objectId)); TracePoint childTracePoint = tracePoint.duplicate(); childTracePoint.stepBackNoReturn(); - calleeSearch(trace, childTracePoint, objList, childMethodExecution.isStatic(), index); // �Ăяo���������ɒT�� + aliasCollector.addAlias(new Alias(Alias.AliasType.METHOD_INVOCATION, 0, ret.getId(), tracePoint.duplicate())); + calleeSearch(trace, childTracePoint, objList, childMethodExecution.isStatic(), index, aliasCollector); // �Ăяo���������ɒT�� if (childMethodExecution.isConstructor()) { // �R���X�g���N�^�Ăяo���������ꍇ if (objectId.equals(srcObject.getId())) { @@ -495,14 +540,20 @@ checkList.add(objList.get(index)); isLost = false; } + if (objectId != null) { + if (childMethodExecution.getThisObjId().equals(objectId)) { + aliasCollector.addAlias(new Alias(Alias.AliasType.RECEIVER, 0, objectId, tracePoint.duplicate())); + } + } } } } while (tracePoint.stepBackOver()); //�����T�� - if (argments.contains(new ObjectReference(objectId))) { + if (arguments.contains(new ObjectReference(objectId))) { ((DeltaAugmentationInfo)methodExecution.getAugmentation()).setSetterSide(true); // �������K�v? isResolved = true; + aliasCollector.addAlias(new Alias(Alias.AliasType.FORMAL_PARAMETER, arguments.indexOf(new ObjectReference(objectId)), objectId, methodExecution.getEntryPoint())); } } @@ -543,4 +594,4 @@ isLost = true; // final�ϐ�������N���X�ŎQ�Ƃ��Ă���”\�������邪�AcalleeSearch()�͕K���Ăяo�����ɕ��A���Ă����̂ŁA�����ł͉������Ȃ� } } -} +} \ No newline at end of file diff --git a/src/org/ntlab/traceDebugger/analyzerProvider/DeltaMarkerManager.java b/src/org/ntlab/traceDebugger/analyzerProvider/DeltaMarkerManager.java new file mode 100644 index 0000000..86414d9 --- /dev/null +++ b/src/org/ntlab/traceDebugger/analyzerProvider/DeltaMarkerManager.java @@ -0,0 +1,550 @@ +package org.ntlab.traceDebugger.analyzerProvider; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IMarker; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.NullProgressMonitor; +import org.eclipse.jdt.core.ICompilationUnit; +import org.eclipse.jdt.core.IMethod; +import org.eclipse.jdt.core.ISourceRange; +import org.eclipse.jdt.core.IType; +import org.eclipse.jdt.core.JavaModelException; +import org.eclipse.jdt.core.dom.AST; +import org.eclipse.jdt.core.dom.ASTNode; +import org.eclipse.jdt.core.dom.ASTParser; +import org.eclipse.jdt.core.dom.ASTVisitor; +import org.eclipse.jdt.core.dom.CompilationUnit; +import org.eclipse.jdt.core.dom.Expression; +import org.eclipse.jdt.core.dom.MemberRef; +import org.eclipse.jdt.core.dom.MethodDeclaration; +import org.eclipse.jdt.core.dom.QualifiedName; +import org.eclipse.jdt.core.dom.SingleVariableDeclaration; +import org.eclipse.jface.text.BadLocationException; +import org.eclipse.jface.text.FindReplaceDocumentAdapter; +import org.eclipse.jface.text.IDocument; +import org.eclipse.jface.text.IRegion; +import org.eclipse.ui.editors.text.FileDocumentProvider; +import org.eclipse.ui.part.FileEditorInput; +import org.ntlab.traceAnalysisPlatform.tracer.trace.ArrayAccess; +import org.ntlab.traceAnalysisPlatform.tracer.trace.BlockEnter; +import org.ntlab.traceAnalysisPlatform.tracer.trace.FieldAccess; +import org.ntlab.traceAnalysisPlatform.tracer.trace.MethodExecution; +import org.ntlab.traceAnalysisPlatform.tracer.trace.MethodInvocation; +import org.ntlab.traceAnalysisPlatform.tracer.trace.Statement; +import org.ntlab.traceDebugger.JavaEditorOperator; + +public class DeltaMarkerManager { + private static final DeltaMarkerManager theInstance = new DeltaMarkerManager(); + private Map> markers = new HashMap<>(); + + private DeltaMarkerManager() { + + } + + public static DeltaMarkerManager getInstance() { + return theInstance; + } + + public IMarker addMarker(Alias alias, IFile file, String markerId) { + try { + IMarker marker = file.createMarker(markerId); + Map attributes = new HashMap<>(); + setAttributesForAlias(attributes, alias, file, markerId); + attributes.put(IMarker.TRANSIENT, true); + marker.setAttributes(attributes); + addMarker(markerId, marker); + return marker; + } catch (CoreException e) { + e.printStackTrace(); + } + return null; + } + + public IMarker addMarker(MethodExecution me, int lineNo, IFile file, String message, String markerId) { + try { + IMarker marker = file.createMarker(markerId); + Map attributes = new HashMap<>(); + setAttributesForMethodExecution(attributes, me, file, lineNo, markerId); + attributes.put(IMarker.MESSAGE, message); + attributes.put(IMarker.TRANSIENT, true); + marker.setAttributes(attributes); + addMarker(markerId, marker); + return marker; + } catch (CoreException e) { + e.printStackTrace(); + } + return null; + } + + private void addMarker(String markerId, IMarker marker) { + List markerList = markers.get(markerId); + if (markerList == null) { + markerList = new ArrayList(); + markers.put(markerId, markerList); + } + markerList.add(marker); + } + + public Map> getMarkers() { + return markers; + } + + private void setAttributesForAlias(final Map attributes, Alias alias, IFile file, String markerId) { + try { + FileEditorInput input = new FileEditorInput(file); + FileDocumentProvider provider = new FileDocumentProvider(); + provider.connect(input); + IDocument document = provider.getDocument(input); +// FindReplaceDocumentAdapter findAdapter = new FindReplaceDocumentAdapter(document); + Statement statement = alias.getOccurrencePoint().getStatement(); + + String aliasType = alias.getAliasType().toString(); + String statements = alias.getOccurrencePoint().getStatement().toString(); + System.out.println(aliasType + ": " + statements); + StringBuilder message = new StringBuilder(); + if (markerId.equals(DeltaExtractionAnalyzer.DELTA_MARKER_ID)) { + message.append("SrcSide: "); + } else if (markerId.equals(DeltaExtractionAnalyzer.DELTA_MARKER_ID_2)) { + message.append("DstSide: "); + } + message.append(alias.getAliasType().toString()); + message.append(" (id = " + alias.getObjectId() + ")"); + + ASTParser parser = ASTParser.newParser(AST.JLS10); + MethodExecution methodExecution = alias.getMethodExecution(); + IType type = JavaEditorOperator.findIType(methodExecution); + IMethod method = JavaEditorOperator.findIMethod(methodExecution, type); + ICompilationUnit unit = method.getCompilationUnit(); + parser.setSource(unit); + ASTNode node = parser.createAST(new NullProgressMonitor()); + ASTVisitor visitor = createVisitor(alias, method, document, parser, attributes); + + if (visitor != null) node.accept(visitor); + attributes.put(IMarker.MESSAGE, message.toString()); + attributes.put(IMarker.LINE_NUMBER, alias.getLineNo()); + } catch (CoreException e) { + e.printStackTrace(); + } + } + + private ASTVisitor createVisitor(Alias alias, IMethod method, IDocument document, ASTParser parser, final Map attributes) { + ASTVisitor visitor = new ASTVisitor() { + }; + try { + Statement statement = alias.getOccurrencePoint().getStatement(); + final ICompilationUnit unit = method.getCompilationUnit(); + final String source = unit.getSource(); + switch (alias.getAliasType()) { + // ���\�b�h�ւ̓��� + case FORMAL_PARAMETER: { + ISourceRange range = method.getSourceRange(); + parser.setSourceRange(range.getOffset(), range.getLength()); + final int index = alias.getIndex(); + visitor = new ASTVisitor() { + @Override + public boolean visit(MethodDeclaration node) { + Object obj = node.parameters().get(index); + if (obj instanceof SingleVariableDeclaration) { + SingleVariableDeclaration parameter = (SingleVariableDeclaration)obj; + int start = parameter.getStartPosition(); + int end = start + parameter.getLength(); + attributes.put(IMarker.CHAR_START, start); + attributes.put(IMarker.CHAR_END, end); + } + return false; + } + }; + return visitor; + } + case THIS: { + if (statement instanceof FieldAccess) { + final FieldAccess fa = (FieldAccess)statement; + IRegion lineRegion = document.getLineInformation(fa.getLineNo() - 1); + parser.setSourceRange(lineRegion.getOffset(), lineRegion.getLength()); + visitor = new ASTVisitor() { + @Override + public boolean visit(org.eclipse.jdt.core.dom.FieldAccess node) { + String name1 = node.getName().toString(); + String name2 = fa.getFieldName(); + name2 = name2.substring(name2.lastIndexOf(".") + 1); + if (!(name1.equals(name2))) return false; + int start = node.getStartPosition(); + if (source.startsWith("this.", start)) { + attributes.put(IMarker.CHAR_START, start); + attributes.put(IMarker.CHAR_END, start + "this".length()); + } + return false; + } + }; + } + return visitor; + } + case METHOD_INVOCATION: { + if (statement instanceof MethodInvocation) { + final MethodInvocation mi = (MethodInvocation)statement; + final MethodExecution calledMe = mi.getCalledMethodExecution(); + IRegion lineRegion = document.getLineInformation(mi.getLineNo() - 1); + parser.setSourceRange(lineRegion.getOffset(), lineRegion.getLength()); + visitor = new ASTVisitor() { + @Override + public boolean visit(org.eclipse.jdt.core.dom.MethodInvocation node) { + String name1 = node.getName().toString(); + String name2 = calledMe.getCallerSideSignature(); + name2 = name2.substring(name2.lastIndexOf(".") + 1, name2.indexOf("(")); + if (!(name1.equals(name2))) return false; + String receiverName = node.getExpression().toString(); + int start = node.getStartPosition() + (receiverName + ".").length(); + // int end = start + name1.length(); + int end = node.getStartPosition() + node.getLength(); + attributes.put(IMarker.CHAR_START, start); + attributes.put(IMarker.CHAR_END, end); + return false; + } + }; + } + return visitor; + } + case CONSTRACTOR_INVOCATION: { + if (statement instanceof MethodInvocation) { + final MethodInvocation mi = (MethodInvocation)statement; + final MethodExecution calledMe = mi.getCalledMethodExecution(); + IRegion lineRegion = document.getLineInformation(mi.getLineNo() - 1); + parser.setSourceRange(lineRegion.getOffset(), lineRegion.getLength()); + visitor = new ASTVisitor() { + @Override + public boolean visit(org.eclipse.jdt.core.dom.ConstructorInvocation node) { +// String name1 = node.getClass().getName(); +// String name2 = calledMe.getCallerSideSignature(); +// name2 = name2.substring(0, name2.indexOf("(")); +// if (!(name1.equals(name2))) return false; +// int start = node.getStartPosition(); +// int end = start + name1.length(); +// attributes.put(IMarker.CHAR_START, start); +// attributes.put(IMarker.CHAR_END, end); + return false; + } + }; + } + return visitor; + } + // �ǐՃI�u�W�F�N�g�̐؂�ւ� + case FIELD: { + if (statement instanceof FieldAccess) { + final FieldAccess fa = (FieldAccess)statement; + IRegion lineRegion = document.getLineInformation(fa.getLineNo() - 1); + parser.setSourceRange(lineRegion.getOffset(), lineRegion.getLength()); + visitor = new ASTVisitor() { + @Override + public boolean visit(org.eclipse.jdt.core.dom.FieldAccess node) { + String name1 = node.getName().toString(); + String name2 = fa.getFieldName(); + name2 = name2.substring(name2.lastIndexOf(".") + 1); + if (!(name1.equals(name2))) return false; + int start = node.getStartPosition(); + int end = start + node.getLength(); + if (source.startsWith("this.", start)) { + attributes.put(IMarker.CHAR_START, start + "this.".length()); + } else { + attributes.put(IMarker.CHAR_START, start); + } + attributes.put(IMarker.CHAR_END, end); + return false; + } + }; + } + return visitor; + } + case CONTAINER: { + if (statement instanceof FieldAccess) { + final FieldAccess fa = (FieldAccess)statement; + IRegion lineRegion = document.getLineInformation(fa.getLineNo() - 1); + parser.setSourceRange(lineRegion.getOffset(), lineRegion.getLength()); + visitor = new ASTVisitor() { + @Override + public boolean visit(QualifiedName node) { + String name1 = node.getName().toString(); + String name2 = fa.getFieldName(); + name2 = name2.substring(name2.lastIndexOf(".") + 1); + if (!(name1.equals(name2))) return false; + int start = node.getStartPosition(); + int end = start + node.getLength(); + // end = start + source.substring(start, end).lastIndexOf("."); + attributes.put(IMarker.CHAR_START, start); + attributes.put(IMarker.CHAR_END, end); + return false; + } + }; + } + return visitor; + } + case ARRAY_ELEMENT: + break; + case ARRAY: + break; + // ���\�b�h����̏o�� + case ACTUAL_ARGUMENT: { + if (statement instanceof MethodInvocation) { + final MethodInvocation mi = (MethodInvocation)statement; + final MethodExecution calledMe = mi.getCalledMethodExecution(); + final int index = alias.getIndex(); + calledMe.getArguments().get(alias.getIndex()); + IRegion lineRegion = document.getLineInformation(mi.getLineNo() - 1); + parser.setSourceRange(lineRegion.getOffset(), lineRegion.getLength()); + visitor = new ASTVisitor() { + @Override + public boolean visit(org.eclipse.jdt.core.dom.MethodInvocation node) { + String name1 = node.getName().toString(); + String name2 = calledMe.getCallerSideSignature(); + name2 = name2.substring(name2.lastIndexOf(".") + 1, name2.indexOf("(")); + if (!(name1.equals(name2))) return false; + Object obj = node.arguments().get(index); + if (obj instanceof Expression) { + Expression argument = (Expression)obj; + int start = argument.getStartPosition(); + int end = start + argument.getLength(); + attributes.put(IMarker.CHAR_START, start); + attributes.put(IMarker.CHAR_END, end); + } + return false; + } + }; + } + return visitor; + } + case RECEIVER: { + if (statement instanceof MethodInvocation) { + final MethodInvocation mi = (MethodInvocation)statement; + final MethodExecution calledMe = mi.getCalledMethodExecution(); + IRegion lineRegion = document.getLineInformation(mi.getLineNo() - 1); + parser.setSourceRange(lineRegion.getOffset(), lineRegion.getLength()); + visitor = new ASTVisitor() { + @Override + public boolean visit(org.eclipse.jdt.core.dom.MethodInvocation node) { + String name1 = node.getName().toString(); + String name2 = calledMe.getCallerSideSignature(); + name2 = name2.substring(name2.lastIndexOf(".") + 1, name2.indexOf("(")); + if (!(name1.equals(name2))) return false; + String receiverName = node.getExpression().toString(); + int start = node.getStartPosition(); + int end = start + (receiverName).length(); + attributes.put(IMarker.CHAR_START, start); + attributes.put(IMarker.CHAR_END, end); + return false; + } + }; + } + return visitor; + } + case RETURN_VALUE: + // note: �ǂ��Ń��^�[���������̏��(�s�ԍ���)���g���[�X�ɂ͋L�^����Ă��Ȃ� + ISourceRange range = method.getSourceRange(); + parser.setSourceRange(range.getOffset(), range.getLength()); + visitor = new ASTVisitor(){ + public boolean visit(org.eclipse.jdt.core.dom.ReturnStatement node) { + int start = node.getStartPosition(); + int end = start + node.getLength(); + attributes.put(IMarker.CHAR_START, start); + attributes.put(IMarker.CHAR_END, end); + return false; + } + }; + return visitor; + } + } catch (JavaModelException | BadLocationException e) { + e.printStackTrace(); + } + return visitor; + } + +// private void setAttributesForAlias(Map attributes, Alias alias, IFile file, String markerId) { +// try { +// FileEditorInput input = new FileEditorInput(file); +// FileDocumentProvider provider = new FileDocumentProvider(); +// provider.connect(input); +// IDocument document = provider.getDocument(input); +// FindReplaceDocumentAdapter findAdapter = new FindReplaceDocumentAdapter(document); +// IRegion lineRegion = document.getLineInformation(alias.getLineNo() - 1); +// Statement statement = alias.getOccurrencePoint().getStatement(); +// +// String type = alias.getAliasType().toString(); +// String statements = alias.getOccurrencePoint().getStatement().toString(); +// System.out.println(type + ": " + statements); +// StringBuilder message = new StringBuilder(); +// if (markerId.equals(DeltaExtractionAnalyzer.DELTA_MARKER_ID)) { +// message.append("SrcSide: "); +// } else if (markerId.equals(DeltaExtractionAnalyzer.DELTA_MARKER_ID_2)) { +// message.append("DstSide: "); +// } +// message.append(alias.getAliasType().toString()); +// message.append(" (id = " + alias.getObjectId() + ")"); +// +// switch (alias.getAliasType()) { +// // ���\�b�h�ւ̓��� +// case FORMAL_PARAMETER: +// if (statement instanceof BlockEnter) { +// BlockEnter be = (BlockEnter)statement; +// IRegion region = document.getLineInformation(alias.getLineNo() - 2); +// if (region == null) break; +// attributes.put(IMarker.CHAR_START, region.getOffset()); +// attributes.put(IMarker.CHAR_END, region.getOffset() + region.getLength()); +// } +// break; +// case THIS: +// if (statement instanceof FieldAccess) { +// FieldAccess fa = (FieldAccess)statement; +// IRegion region = findAdapter.find(lineRegion.getOffset(), "this", true, true, true, false); +// if (region == null) break; +// attributes.put(IMarker.CHAR_START, region.getOffset()); +// attributes.put(IMarker.CHAR_END, region.getOffset() + region.getLength()); +// } +// break; +// case METHOD_INVOCATION: +// case CONSTRACTOR_INVOCATION: +// if (statement instanceof MethodInvocation) { +// MethodInvocation mi = (MethodInvocation)statement; +// MethodExecution me = mi.getCalledMethodExecution(); +// String signature = me.getSignature(); +// signature = signature.substring(signature.lastIndexOf(".") + 1, signature.lastIndexOf("(")); +// IRegion region = findAdapter.find(lineRegion.getOffset(), signature, true, true, true, false); +// if (region == null) break; +// attributes.put(IMarker.CHAR_START, region.getOffset()); +// attributes.put(IMarker.CHAR_END, region.getOffset() + region.getLength()); +// } +// break; +// // �ǐՃI�u�W�F�N�g�̐؂�ւ� +// case FIELD: +// if (statement instanceof FieldAccess) { +// FieldAccess fa = (FieldAccess)statement; +// String fieldName = fa.getFieldName(); +// fieldName = fieldName.substring(fieldName.lastIndexOf(".") + 1); +// IRegion region = null; +// int start = lineRegion.getOffset(); +// while (true) { +// region = findAdapter.find(start, fieldName, true, true, true, false); +// if (region == null) break; +// if (findAdapter.charAt(region.getOffset() - 1) == '.') break; +// start = region.getOffset() + 1; +// } +// if (region == null) break; +// attributes.put(IMarker.CHAR_START, region.getOffset()); +// attributes.put(IMarker.CHAR_END, region.getOffset() + region.getLength()); +// } +// break; +// case CONTAINER: +// if (statement instanceof FieldAccess) { +// FieldAccess fa = (FieldAccess)statement; +// String fieldName = fa.getFieldName(); +// IRegion region = findAdapter.find(lineRegion.getOffset(), fieldName, true, true, true, false); +// if (region == null) break; +// attributes.put(IMarker.CHAR_START, region.getOffset()); +// attributes.put(IMarker.CHAR_END, region.getOffset() + region.getLength()); +// } +// break; +// case ARRAY_ELEMENT: +// if (statement instanceof ArrayAccess) { +// ArrayAccess aa = (ArrayAccess)statement; +// String arrayIndex = "[" + aa.getIndex() + "]"; +// IRegion region = findAdapter.find(lineRegion.getOffset(), arrayIndex, true, true, true, false); +// if (region == null) break; +// attributes.put(IMarker.CHAR_START, region.getOffset()); +// attributes.put(IMarker.CHAR_END, region.getOffset() + region.getLength()); +// } +// break; +// case ARRAY: +// if (statement instanceof ArrayAccess) { +// ArrayAccess aa = (ArrayAccess)statement; +// String arrayIndex = "[" + aa.getIndex() + "]"; +// IRegion region = findAdapter.find(lineRegion.getOffset(), arrayIndex, true, true, true, false); +// if (region == null) break; +// attributes.put(IMarker.CHAR_START, region.getOffset()); +// attributes.put(IMarker.CHAR_END, region.getOffset() + region.getLength()); +// } +// break; +// // ���\�b�h����̏o�� +// case ACTUAL_ARGUMENT: +// if (statement instanceof MethodInvocation) { +// MethodInvocation mi = (MethodInvocation)statement; +// MethodExecution me = mi.getCalledMethodExecution(); +// String signature = me.getSignature(); +// signature = signature.substring(signature.lastIndexOf(".") + 1, signature.lastIndexOf("(")); +// IRegion region = findAdapter.find(lineRegion.getOffset(), signature, true, true, true, false); +// if (region == null) break; +// attributes.put(IMarker.CHAR_START, region.getOffset()); +// attributes.put(IMarker.CHAR_END, region.getOffset() + region.getLength()); +// } +// break; +// case RECEIVER: +// if (statement instanceof MethodInvocation) { +// MethodInvocation mi = (MethodInvocation)statement; +// MethodExecution me = mi.getCalledMethodExecution(); +// String signature = me.getSignature(); +// signature = signature.substring(signature.lastIndexOf(".") + 1, signature.lastIndexOf("(")); +// IRegion region = findAdapter.find(lineRegion.getOffset(), signature, true, true, true, false); +// if (region == null) break; +// attributes.put(IMarker.CHAR_START, region.getOffset()); +// attributes.put(IMarker.CHAR_END, region.getOffset() + region.getLength()); +// } +// break; +// case RETURN_VALUE: +// if (statement instanceof FieldAccess) { +// FieldAccess fa = (FieldAccess)statement; +// String fieldName = fa.getFieldName(); +// IRegion region = findAdapter.find(lineRegion.getOffset(), fieldName, true, true, true, false); +// if (region == null) break; +// attributes.put(IMarker.CHAR_START, region.getOffset()); +// attributes.put(IMarker.CHAR_END, region.getOffset() + region.getLength()); +// } +// break; +// } +// attributes.put(IMarker.MESSAGE, message.toString()); +// attributes.put(IMarker.LINE_NUMBER, alias.getLineNo()); +// } catch (CoreException | BadLocationException e) { +// e.printStackTrace(); +// } +// } + + private void setAttributesForMethodExecution(Map attributes, MethodExecution methodExecution, IFile file, int lineNo, String markerId) { + try { + FileEditorInput input = new FileEditorInput(file); + FileDocumentProvider provider = new FileDocumentProvider(); + provider.connect(input); + IDocument document = provider.getDocument(input); + if (lineNo > 1) { + IRegion lineRegion = document.getLineInformation(lineNo - 1); + attributes.put(IMarker.CHAR_START, lineRegion.getOffset()); + attributes.put(IMarker.CHAR_END, lineRegion.getOffset() + lineRegion.getLength()); + attributes.put(IMarker.LINE_NUMBER, lineNo); + } else { + // note: ���\�b�h�V�O�l�`�����n�C���C�g + IType type = JavaEditorOperator.findIType(methodExecution); + IMethod method = JavaEditorOperator.findIMethod(methodExecution, type); + int start = method.getSourceRange().getOffset(); + int end = start + method.getSource().indexOf(")") + 1; + attributes.put(IMarker.CHAR_START, start); + attributes.put(IMarker.CHAR_END, end); + } + } catch (CoreException | BadLocationException e) { + e.printStackTrace(); + } + } + + public void deleteMarkers(String markerId) { + List markerList = markers.get(markerId); + if (markerList == null) return; + for (IMarker marker : markerList) { + try { + marker.delete(); + } catch (CoreException e) { + e.printStackTrace(); + } + } + markerList.clear(); + markers.remove(markerId); + } +} diff --git a/src/org/ntlab/traceDebugger/analyzerProvider/DeltaRelatedAliasCollector.java b/src/org/ntlab/traceDebugger/analyzerProvider/DeltaRelatedAliasCollector.java new file mode 100644 index 0000000..6a46d22 --- /dev/null +++ b/src/org/ntlab/traceDebugger/analyzerProvider/DeltaRelatedAliasCollector.java @@ -0,0 +1,61 @@ +package org.ntlab.traceDebugger.analyzerProvider; + +import java.util.ArrayList; +import java.util.List; + +public class DeltaRelatedAliasCollector implements IAliasCollector { + private List srcSideRelatedAliases = new ArrayList<>(); + private List dstSideRelatedAliases = new ArrayList<>(); + private List srcSideIdList = new ArrayList<>(); + private List dstSideIdList = new ArrayList<>(); + + public DeltaRelatedAliasCollector(String srcId, String dstId) { + srcSideIdList.add(srcId); + dstSideIdList.add(dstId); + } + + @Override + public void addAlias(Alias alias) { + String objId = alias.getObjectId(); + if (srcSideIdList.contains(objId)) { + if (alias.getAliasType().equals(Alias.AliasType.ACTUAL_ARGUMENT)) { + Alias formalParameterAlias = srcSideRelatedAliases.get(srcSideRelatedAliases.size() - 1); + alias.setIndex(formalParameterAlias.getIndex()); + } + srcSideRelatedAliases.add(alias); + System.out.println("Src " + alias.getAliasType() + ": " + alias.getMethodSignature() + " line" + alias.getLineNo() + " index" + alias.getIndex()); + } else if (dstSideIdList.contains(objId)) { + if (alias.getAliasType().equals(Alias.AliasType.ACTUAL_ARGUMENT)) { + Alias formalParameterAlias = dstSideRelatedAliases.get(dstSideRelatedAliases.size() - 1); + alias.setIndex(formalParameterAlias.getIndex()); + } + dstSideRelatedAliases.add(alias); + System.out.println("Dst " + alias.getAliasType() + ": " + alias.getMethodSignature() + " line" + alias.getLineNo() + " index" + alias.getIndex()); + } + } + + @Override + public void changeTrackingObject(String from, String to) { + if (srcSideIdList.contains(from)) { + srcSideIdList.add(to); + } else if (dstSideIdList.contains(from)) { + dstSideIdList.add(to); + } + } + + public List getSrcSideRelatedAliases() { + return srcSideRelatedAliases; + } + + public List getDstSideRelatedAliases() { + return dstSideRelatedAliases; + } + + public void addSrcSideRelatedAlias(Alias alias) { + srcSideRelatedAliases.add(alias); + } + + public void addDstSideRelatedAlias(Alias alias) { + dstSideRelatedAliases.add(alias); + } +} diff --git a/src/org/ntlab/traceDebugger/analyzerProvider/ExtractedStructure.java b/src/org/ntlab/traceDebugger/analyzerProvider/ExtractedStructure.java index 9f0a275..8bea6d8 100644 --- a/src/org/ntlab/traceDebugger/analyzerProvider/ExtractedStructure.java +++ b/src/org/ntlab/traceDebugger/analyzerProvider/ExtractedStructure.java @@ -1,7 +1,11 @@ package org.ntlab.traceDebugger.analyzerProvider; +import java.util.ArrayList; +import java.util.List; + import org.ntlab.traceAnalysisPlatform.tracer.trace.MethodExecution; import org.ntlab.traceAnalysisPlatform.tracer.trace.Reference; +import org.ntlab.traceAnalysisPlatform.tracer.trace.TracePoint; public class ExtractedStructure { @@ -10,7 +14,11 @@ private MethodExecution coordinator = null; private MethodExecution parent = null; private MethodExecution creationCallTree; - +// private List srcSideRelatedTracePoints = new ArrayList<>(); +// private List dstSideRelatedTracePoints = new ArrayList<>(); +// private List srcSideRelatedAliases = new ArrayList<>(); +// private List dstSideRelatedAliases = new ArrayList<>(); + public Delta getDelta() { return delta; } @@ -64,5 +72,36 @@ public MethodExecution getCreationCallTree() { return creationCallTree; } + +// public List getSrcSideRelatedTracePoints() { +// return srcSideRelatedTracePoints; +// } +// +// public List getDstSideRelatedTracePoints() { +// return dstSideRelatedTracePoints; +// } +// +// public void addSrcSideRelatedTracePoint(TracePoint tp) { +// srcSideRelatedTracePoints.add(tp); +// } +// +// public void addDstSideRelatedTracePoint(TracePoint tp) { +// dstSideRelatedTracePoints.add(tp); +// } +// public List getSrcSideRelatedAliases() { +// return srcSideRelatedAliases; +// } +// +// public List getDstSideRelatedAliases() { +// return dstSideRelatedAliases; +// } +// +// public void addSrcSideRelatedAlias(Alias alias) { +// srcSideRelatedAliases.add(alias); +// } +// +// public void addDstSideRelatedAlias(Alias alias) { +// dstSideRelatedAliases.add(alias); +// } } diff --git a/src/org/ntlab/traceDebugger/analyzerProvider/IAliasCollector.java b/src/org/ntlab/traceDebugger/analyzerProvider/IAliasCollector.java new file mode 100644 index 0000000..ca1b1ad --- /dev/null +++ b/src/org/ntlab/traceDebugger/analyzerProvider/IAliasCollector.java @@ -0,0 +1,9 @@ +package org.ntlab.traceDebugger.analyzerProvider; + +public interface IAliasCollector { + + void addAlias(Alias alias); + + void changeTrackingObject(String from, String to); + +} diff --git a/src/org/ntlab/traceDebugger/analyzerProvider/ObjectFlowAnalyzer.java b/src/org/ntlab/traceDebugger/analyzerProvider/ObjectFlowAnalyzer.java deleted file mode 100644 index 468a23c..0000000 --- a/src/org/ntlab/traceDebugger/analyzerProvider/ObjectFlowAnalyzer.java +++ /dev/null @@ -1,237 +0,0 @@ -package org.ntlab.traceDebugger.analyzerProvider; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import org.ntlab.traceAnalysisPlatform.tracer.trace.ArrayAccess; -import org.ntlab.traceAnalysisPlatform.tracer.trace.ArrayCreate; -import org.ntlab.traceAnalysisPlatform.tracer.trace.ArrayUpdate; -import org.ntlab.traceAnalysisPlatform.tracer.trace.FieldAccess; -import org.ntlab.traceAnalysisPlatform.tracer.trace.FieldUpdate; -import org.ntlab.traceAnalysisPlatform.tracer.trace.MethodExecution; -import org.ntlab.traceAnalysisPlatform.tracer.trace.MethodInvocation; -import org.ntlab.traceAnalysisPlatform.tracer.trace.ObjectReference; -import org.ntlab.traceAnalysisPlatform.tracer.trace.Reference; -import org.ntlab.traceAnalysisPlatform.tracer.trace.Statement; -import org.ntlab.traceAnalysisPlatform.tracer.trace.Trace; -import org.ntlab.traceAnalysisPlatform.tracer.trace.TraceJSON; -import org.ntlab.traceAnalysisPlatform.tracer.trace.TracePoint; - -public class ObjectFlowAnalyzer extends AbstractAnalyzer { - private static ObjectFlowAnalyzer getInstance = null; - - public ObjectFlowAnalyzer(Trace trace) { - super(trace); - } - - private static ObjectFlowAnalyzer getInstance() { - if (getInstance == null) { - getInstance = new ObjectFlowAnalyzer(TraceJSON.getInstance()); - } - return getInstance; - } - - public static ArrayList findAllSeedAliasesStatic(MethodExecution me) { - return getInstance().findAllSeedAliases(me); - } - - public ArrayList findAllSeedAliases(MethodExecution me) { - ArrayList seedAliasList = new ArrayList<>(); - List statements = me.getStatements(); - String[] primitives = {"byte", "short", "int", "long", "float", "double", "char", "boolean"}; - List primitiveList = Arrays.asList(primitives); - 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; - String objId = fa.getContainerObjId(); - if (objId != null && !(objId.equals("0")) && !(primitiveList.contains(fa.getContainerClassName()))) { - seedAliasList.add(new Alias(objId, tp, Alias.OCCURRENCE_EXP_CONTAINER)); - } - objId = fa.getValueObjId(); - if (objId != null && !(objId.equals("0")) && !(primitiveList.contains(fa.getValueClassName()))) { - seedAliasList.add(new Alias(objId, tp, Alias.OCCURRENCE_EXP_FIELD)); - } - } else if (statement instanceof FieldUpdate) { - FieldUpdate fu = (FieldUpdate)statement; - String objId = fu.getContainerObjId(); - if (objId != null && !(objId.equals("0")) && !(primitiveList.contains(fu.getContainerClassName()))) { - seedAliasList.add(new Alias(objId, tp, Alias.OCCURRENCE_EXP_CONTAINER)); - } - objId = fu.getValueObjId(); - if (objId != null && !(objId.equals("0")) && !(primitiveList.contains(fu.getValueClassName()))) { - seedAliasList.add(new Alias(objId, tp, Alias.OCCURRENCE_EXP_FIELD)); - } - } else if (statement instanceof ArrayAccess) { - ArrayAccess aa = (ArrayAccess)statement; - String valueObjId = aa.getValueObjectId(); - if (valueObjId != null && !(valueObjId.equals("0")) && !(primitiveList.contains(aa.getValueClassName()))) { - seedAliasList.add(new Alias(valueObjId, tp, Alias.OCCURRENCE_EXP_ARRAY)); - } - } else if (statement instanceof ArrayUpdate) { - ArrayUpdate au = (ArrayUpdate)statement; - String valueObjId = au.getValueObjectId(); - if (valueObjId != null && !(valueObjId.equals("0")) && !(primitiveList.contains(au.getValueClassName()))) { - seedAliasList.add(new Alias(valueObjId, tp, Alias.OCCURRENCE_EXP_ARRAY)); - } - } else if (statement instanceof ArrayCreate) { - ArrayCreate ac = (ArrayCreate)statement; - String arrayObjId = ac.getArrayObjectId(); - if (arrayObjId != null && !(arrayObjId.equals("0")) && !(primitiveList.contains(ac.getArrayClassName()))) { - seedAliasList.add(new Alias(arrayObjId, tp, Alias.OCCURRENCE_EXP_RETURN)); - } - } else if (statement instanceof MethodInvocation) { - MethodExecution calledMe = ((MethodInvocation)statement).getCalledMethodExecution(); - String thisObjId = calledMe.getThisObjId(); - if (thisObjId != null && !(thisObjId.equals("0"))) { - seedAliasList.add(new Alias(thisObjId, tp, Alias.OCCURRENCE_EXP_RECEIVER)); - } - List args = calledMe.getArguments(); - for (int j = 0; j < args.size(); j++) { - ObjectReference arg = args.get(j); - String argValueId = arg.getId(); - if (argValueId != null && !(argValueId.equals("0")) && !(primitiveList.contains(arg.getActualType()))) { - seedAliasList.add(new Alias(argValueId, tp, (j + Alias.OCCURRENCE_EXP_FIRST_ARG))); - } - } - ObjectReference returnValue = calledMe.getReturnValue(); - if (returnValue != null) { - String returnValueId = returnValue.getId(); - if (returnValueId != null && !(returnValueId.equals("0") && !(primitiveList.contains(returnValue.getActualType())))) { - seedAliasList.add(new Alias(returnValueId, tp, Alias.OCCURRENCE_EXP_RETURN)); - } - } - } - } - return seedAliasList; - } - - private TracePoint getRecentlyFieldUpdate(TracePoint tp) { - Statement statement = tp.getStatement(); - if (statement instanceof FieldAccess) { - FieldAccess fa = (FieldAccess)statement; - return trace.getFieldUpdateTracePoint(fa.getReference(), tp); - } - return null; - } - - private TracePoint getRecentlyArrayUpdate(TracePoint tp) { - Statement statement = tp.getStatement(); - if (statement instanceof ArrayAccess) { - ArrayAccess aa = (ArrayAccess)statement; - // aa.getReference()���Ȃ��̂ʼn��ɂ�����ۂ�Reference������ēn�� - return trace.getArraySetTracePoint(new Reference(aa.getArrayObjectId(), aa.getValueObjectId(), aa.getArrayClassName(), aa.getValueClassName()), tp); - } - return null; - } - - public static ArrayList> getObjectFlowStatic(Alias startAlias) { - return getInstance().getObjectFlow(startAlias); - } - - public ArrayList> getObjectFlow(Alias startAlias) { - ArrayList> aliasLists = new ArrayList<>(); - ArrayList aliasList = new ArrayList<>(); - aliasLists.add(aliasList); -// aliasList.add(alias); - String objId = startAlias.getObjectId(); - TracePoint tp = startAlias.getOccurrencePoint().duplicate(); - ArrayList> resultLists = getObjectFlow(aliasLists, objId, tp, 0); - return resultLists; - } - - private 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�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 FieldUpdate) { - // �t�B�[���h�X�V�̏ꍇ - FieldUpdate fu = (FieldUpdate)statement; - if (fu.getValueObjId().equals(objId)) { - aliasList.add(new Alias(objId, tp.duplicate(), Alias.OCCURRENCE_EXP_FIELD)); - } - } else if (statement instanceof ArrayUpdate) { - // �z��v�f�X�V�̏ꍇ - ArrayUpdate au = (ArrayUpdate)statement; - if (au.getValueObjectId().equals(objId)) { - aliasList.add(new Alias(objId, tp.duplicate(), Alias.OCCURRENCE_EXP_ARRAY)); - } - } 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 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�����ꍇ - 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()) { - 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).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; - } - } - } - } while (tp.stepBackOver()); // �Ăяo�����ɖ߂邩����ȏ�H��Ȃ��Ȃ�܂Ń��[�v - 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) { - aliasLists.remove(aliasLists.size() - 1); // �����ɃG�C���A�X���Ȃ������ꍇ�͂��̉�̒ǐՃG�C���A�X���X�g���폜���� - } - return aliasLists; - } -} diff --git a/src/org/ntlab/traceDebugger/analyzerProvider/ObjectFlowAnalyzerLaunchConfiguration.java b/src/org/ntlab/traceDebugger/analyzerProvider/ObjectFlowAnalyzerLaunchConfiguration.java index d48312e..cc034f2 100644 --- a/src/org/ntlab/traceDebugger/analyzerProvider/ObjectFlowAnalyzerLaunchConfiguration.java +++ b/src/org/ntlab/traceDebugger/analyzerProvider/ObjectFlowAnalyzerLaunchConfiguration.java @@ -8,9 +8,11 @@ import org.ntlab.traceAnalysisPlatform.IAdditionalLaunchConfiguration; public class ObjectFlowAnalyzerLaunchConfiguration implements IAdditionalLaunchConfiguration { - public static final String ANALYZER_PATH = "org/ntlab/traceDebugger/analyzerProvider/ObjectFlowAnalyzer.class"; +// public static final String ANALYZER_PATH = "org/ntlab/traceDebugger/analyzerProvider/ObjectFlowAnalyzer.class"; + public static final String ANALYZER_PATH = "org/ntlab/traceDebugger/analyzerProvider/DeltaExtractionAnalyzer.class"; public static final String ANALYZER_PACKAGE = "org.ntlab.traceDebugger.analyzerProvider"; - public static final String ANALYZER_CLASS = "ObjectFlowAnalyzer"; +// public static final String ANALYZER_CLASS = "ObjectFlowAnalyzer"; + public static final String ANALYZER_CLASS = "DeltaExtractionAnalyzer"; @Override public String[] getAdditionalClasspaths() {