diff --git a/src/org/ntlab/deltaExtractor/DeltaExtractor.java b/src/org/ntlab/deltaExtractor/DeltaExtractor.java index 2a3b809..fbba8de 100644 --- a/src/org/ntlab/deltaExtractor/DeltaExtractor.java +++ b/src/org/ntlab/deltaExtractor/DeltaExtractor.java @@ -1079,9 +1079,7 @@ eStructure = new ExtractedStructure(); eStructure.setRelatedTracePoint(thisTracePoint.duplicate()); MethodExecution methodExecution = thisTracePoint.getMethodExecution(); - if (!thisTracePoint.isMethodEntry()) { - thisTracePoint.stepNext(); - } + thisTracePoint.stepNext(); ArrayList objList = new ArrayList(); String thisObjectId = methodExecution.getThisObjId(); objList.add(thisObjectId); diff --git a/src/org/ntlab/deltaViewer/CollaborationViewer.java b/src/org/ntlab/deltaViewer/CollaborationViewer.java index 19f68a0..81d3173 100644 --- a/src/org/ntlab/deltaViewer/CollaborationViewer.java +++ b/src/org/ntlab/deltaViewer/CollaborationViewer.java @@ -137,8 +137,13 @@ if(statement instanceof FieldUpdate) { // Format fieldName. FieldUpdate fieldUpdateStatement = (FieldUpdate) statement; - String fieldNames[] = formatFieldName(fieldUpdateStatement.getFieldName()); - String fieldName = fieldNames[fieldNames.length-1]; + String fieldName; + if (fieldUpdateStatement.getFieldName() != null) { + String fieldNames[] = formatFieldName(fieldUpdateStatement.getFieldName()); + fieldName = fieldNames[fieldNames.length-1]; + } else { + fieldName = ""; + } String sourceObjectId = fieldUpdateStatement.getContainerObjId(); createObjectRefrence(fieldUpdateStatement, fieldName); @@ -460,9 +465,14 @@ } else { Statement statement = nextAlias.getOccurrencePoint().getStatement(); if(statement instanceof FieldAccess && curAliasObjId.equals(((FieldAccess)statement).getContainerObjId())) { - String fieldNames[] = formatFieldName(((FieldAccess)statement).getFieldName()); - srcClassName = fieldNames[0]; - fieldName = fieldNames[1]; + if (((FieldAccess)statement).getFieldName() != null) { + String fieldNames[] = formatFieldName(((FieldAccess)statement).getFieldName()); + srcClassName = fieldNames[0]; + fieldName = fieldNames[1]; + } else { + srcClassName = ((FieldAccess)statement).getContainerClassName(); + fieldName = ""; + } } } System.out.println("THIS " + srcClassName + "(" + curAliasObjId + ") -> " + "(" + nextAliasObjId + "), "+ fieldName); diff --git a/src/org/ntlab/deltaViewer/DeltaViewer.java b/src/org/ntlab/deltaViewer/DeltaViewer.java index 9e218f1..657be8c 100644 --- a/src/org/ntlab/deltaViewer/DeltaViewer.java +++ b/src/org/ntlab/deltaViewer/DeltaViewer.java @@ -130,8 +130,13 @@ if(statement instanceof FieldUpdate) { // Format fieldName. FieldUpdate fieldUpdateStatement = (FieldUpdate) statement; - String fieldNames[] = formatFieldName(fieldUpdateStatement.getFieldName()); - String fieldName = fieldNames[fieldNames.length-1]; + String fieldName; + if (fieldUpdateStatement.getFieldName() != null) { + String fieldNames[] = formatFieldName(fieldUpdateStatement.getFieldName()); + fieldName = fieldNames[fieldNames.length-1]; + } else { + fieldName = ""; + } String sourceObjectId = fieldUpdateStatement.getContainerObjId(); createObjectRefrence(fieldUpdateStatement, fieldName); @@ -542,9 +547,14 @@ } else { Statement statement = nextAlias.getOccurrencePoint().getStatement(); if(statement instanceof FieldAccess && curAlias.getObjectId().equals(((FieldAccess)statement).getContainerObjId())) { - String fieldNames[] = formatFieldName(((FieldAccess)statement).getFieldName()); - srcClassName = fieldNames[0]; - fieldName = fieldNames[1]; + if (((FieldAccess)statement).getFieldName() != null) { + String fieldNames[] = formatFieldName(((FieldAccess)statement).getFieldName()); + srcClassName = fieldNames[0]; + fieldName = fieldNames[1]; + } else { + srcClassName = ((FieldAccess)statement).getContainerClassName(); + fieldName = ""; + } } } System.out.println("THIS " + srcClassName + "(" + curAlias.getObjectId() + ") -> " + "(" + nextAlias.getObjectId() + "), "+ fieldName); diff --git a/src/org/ntlab/deltaViewer/MagnetRONFrame.java b/src/org/ntlab/deltaViewer/MagnetRONFrame.java index e9cf877..25b5126 100644 --- a/src/org/ntlab/deltaViewer/MagnetRONFrame.java +++ b/src/org/ntlab/deltaViewer/MagnetRONFrame.java @@ -263,29 +263,37 @@ } private Entry extract(Extract extract) { + int index = extract.getOrder(); if (extract.getType().equals(Extract.CONTAINER_COMPONENT) || extract.getType().equals(Extract.CONTAINER_COMPONENT_COLLECTION)) { HashMap threads = trace.getAllThreads(); - List eList = new ArrayList<>(); - List dacList = new ArrayList<>(); if (threads.values().size() == 1) { ThreadInstance thread = threads.values().iterator().next(); // �Ō�̃X���b�h�����Ă��邾���c TracePoint tp = thread.getRoot().get(thread.getRoot().size() - 1).getExitPoint(); Reference reference = new Reference(extract.getSrcId(), extract.getDstId(), extract.getSrcClass(), extract.getDstClass()); - IAliasTracker dac = new DeltaAliasCollector(); - ExtractedStructure e = s.extract(reference, tp, dac); - eList.add(e); - dacList.add(dac); + if (extract.getType().equals(Extract.CONTAINER_COMPONENT_COLLECTION)) { + reference.setCollection(true); + } + ExtractedStructure e = null; + for (int i = 0; ; i++) { + IAliasTracker dac = new DeltaAliasCollector(); + e = s.extract(reference, tp, dac); + if (e == null) break; + if (i == index) { + return new AbstractMap.SimpleEntry(e, dac); + } + tp = e.getRelatedTracePoint().duplicate(); + tp.stepBackOver(); + } + return null; } else { + int i = 0; for (ThreadInstance thread: threads.values()) { TracePoint tp = thread.getRoot().get(thread.getRoot().size() - 1).getExitPoint(); Reference reference = new Reference(extract.getSrcId(), extract.getDstId(), extract.getSrcClass(), extract.getDstClass()); if (extract.getType().equals(Extract.CONTAINER_COMPONENT_COLLECTION)) { reference.setCollection(true); } -// reference.setArray(true); -// reference.setFinalLocal(true); -// reference.setCreation(true); ExtractedStructure e = null; do { if (e == null) { @@ -293,8 +301,10 @@ e = s.extract(reference, tp, dac); System.out.println(e); if (e != null) { - eList.add(e); - dacList.add(dac); + if (i == index) { + return new AbstractMap.SimpleEntry(e, dac); + } + i++; } } else { tp = e.getRelatedTracePoint().duplicate(); @@ -303,23 +313,47 @@ e = s.extract(reference, tp, dac); System.out.println(e); if (e != null) { - eList.add(e); - dacList.add(dac); - System.out.println("add" + eList.size() + ", " + dacList.size()); + if (i == index) { + return new AbstractMap.SimpleEntry(e, dac); + } + i++; } } } while (e != null); System.out.println("---------------------------"); } } - return new AbstractMap.SimpleEntry(eList.get(extract.getOrder()), dacList.get(extract.getOrder())); + return null; } else { IAliasTracker dac = new DeltaAliasCollector(); - MethodExecution me = trace.getLastMethodExecution(extract.getSrcClass()); - Map refs = me.getObjectReferences(extract.getDstClass()); - ObjectReference ref = refs.keySet().iterator().next(); - ExtractedStructure e = s.extract(refs.get(ref), ref, dac); - return new AbstractMap.SimpleEntry(e, dac); + int i = 0; + List mes = trace.getMethodExecutions(extract.getSrcClass()); + while (mes.size() > 0) { + MethodExecution lastExec = null; + long lastExecTime = 0L; + for (MethodExecution me: mes) { + if (lastExec == null || me.getEntryTime() > lastExecTime) { + lastExec = me; + lastExecTime = me.getEntryTime(); + } + } + mes.remove(lastExec); + Map refs = lastExec.getObjectReferences(extract.getDstClass()); + if (refs.size() > 0) { + for (ObjectReference ref: refs.keySet()) { + if (extract.getDstId() == null || extract.getDstId().equals(ref.getId())) { + ExtractedStructure e = s.extract(refs.get(ref), ref, dac); + if (e != null) { + if (i == index) { + return new AbstractMap.SimpleEntry(e, dac); + } + i++; + } + } + } + } + } + return null; } } diff --git a/src/org/ntlab/deltaViewer/MagnetRONViewer.java b/src/org/ntlab/deltaViewer/MagnetRONViewer.java index 287aefa..b445d8f 100644 --- a/src/org/ntlab/deltaViewer/MagnetRONViewer.java +++ b/src/org/ntlab/deltaViewer/MagnetRONViewer.java @@ -1288,10 +1288,15 @@ FieldUpdate rpFieldUpdateStatement = (FieldUpdate) rpStatement; rpSrcObjId = rpFieldUpdateStatement.getContainerObjId(); rpDstObjId = rpFieldUpdateStatement.getValueObjId(); - String rpFieldNames[] = formatFieldName(rpFieldUpdateStatement.getFieldName()); - rpSrcClassName = rpFieldNames[0]; + if (rpFieldUpdateStatement.getFieldName() != null) { + String rpFieldNames[] = formatFieldName(rpFieldUpdateStatement.getFieldName()); + rpSrcClassName = rpFieldNames[0]; + rpFieldName = rpFieldNames[rpFieldNames.length-1]; + } else { + rpSrcClassName = rpFieldUpdateStatement.getContainerClassName(); + rpFieldName = ""; + } rpDstClassName = rpFieldUpdateStatement.getValueClassName(); - rpFieldName = rpFieldNames[rpFieldNames.length-1]; } else if (rpStatement instanceof ArrayUpdate) { // container to component ArrayUpdate rpArrayUpdateStatement = (ArrayUpdate) rpStatement; diff --git a/src/org/ntlab/trace/MethodExecution.java b/src/org/ntlab/trace/MethodExecution.java index d1797de..9553e15 100644 --- a/src/org/ntlab/trace/MethodExecution.java +++ b/src/org/ntlab/trace/MethodExecution.java @@ -204,7 +204,7 @@ } else if (s instanceof MethodInvocation) { MethodInvocation m = (MethodInvocation) s; ObjectReference ret = m.getCalledMethodExecution().getReturnValue(); - if (ret.getActualType().equals(actualTypeName)) { + if (ret != null && ret.getActualType().equals(actualTypeName)) { objectRefMap.put(ret, tp.duplicate()); } }