diff options
author | aclement <aclement> | 2005-02-04 13:42:54 +0000 |
---|---|---|
committer | aclement <aclement> | 2005-02-04 13:42:54 +0000 |
commit | 953fd4340f6eb6c578d591be9a0d601daf35ca6d (patch) | |
tree | 9afc5ec7176acee4f8f43343c53c96a5e2c35e10 /asm | |
parent | 874a0b997ef069c362c255e0c1cfcf0b25136d78 (diff) | |
download | aspectj-953fd4340f6eb6c578d591be9a0d601daf35ca6d.tar.gz aspectj-953fd4340f6eb6c578d591be9a0d601daf35ca6d.zip |
Fix for atrocious incremental compilation performance.
Diffstat (limited to 'asm')
-rw-r--r-- | asm/src/org/aspectj/asm/AsmManager.java | 39 | ||||
-rw-r--r-- | asm/src/org/aspectj/asm/IHierarchy.java | 2 | ||||
-rw-r--r-- | asm/src/org/aspectj/asm/internal/AspectJElementHierarchy.java | 20 |
3 files changed, 44 insertions, 17 deletions
diff --git a/asm/src/org/aspectj/asm/AsmManager.java b/asm/src/org/aspectj/asm/AsmManager.java index f7c81df06..60645f3b0 100644 --- a/asm/src/org/aspectj/asm/AsmManager.java +++ b/asm/src/org/aspectj/asm/AsmManager.java @@ -41,9 +41,7 @@ public class AsmManager { public static boolean attemptIncrementalModelRepairs = false; // for debugging ... -// static { -// setReporting("c:/model.nfo",true,true,true,true); -// } + // For offline debugging, you can now ask for the AsmManager to @@ -54,7 +52,9 @@ public class AsmManager { private static String dumpFilename = ""; private static boolean reporting = false; - +// static { +// setReporting("c:/model.nfo",true,true,true,true); +// } protected AsmManager() { hierarchy = new AspectJElementHierarchy(); @@ -417,6 +417,11 @@ public class AsmManager { //===================== DELTA PROCESSING CODE ============== start ==========// + // XXX shouldn't be aware of the delimiter + private String getFilename(String hid) { + return hid.substring(0,hid.indexOf("|")); + } + // This code is *SLOW* but it isnt worth fixing until we address the // bugs in binary weaving. public void fixupStructureModel(Writer fw,List filesToBeCompiled,Set files_added,Set files_deleted) throws IOException { @@ -433,7 +438,7 @@ public class AsmManager { Set filesToRemoveFromStructureModel = new HashSet(filesToBeCompiled); filesToRemoveFromStructureModel.addAll(files_deleted); - + Set deletedNodes = new HashSet(); for (Iterator iter = filesToRemoveFromStructureModel.iterator(); iter.hasNext();) { File fileForCompilation = (File) iter.next(); String correctedPath = AsmManager.getDefault().getCanonicalFilePath(fileForCompilation); @@ -444,15 +449,15 @@ public class AsmManager { fw.write("Deleting "+progElem+" node for file "+fileForCompilation+"\n"); } removeNode(progElem); - verifyAssumption( - model.removeFromFileMap(correctedPath.toString()), - "Whilst repairing model, couldn't remove entry for file: "+correctedPath.toString()+" from the filemap"); + deletedNodes.add(getFilename(progElem.getHandleIdentifier())); + if (!model.removeFromFileMap(correctedPath.toString())) + throw new RuntimeException("Whilst repairing model, couldn't remove entry for file: "+correctedPath.toString()+" from the filemap"); modelModified = true; } } if (modelModified) { model.flushTypeMap(); - model.flushHandleMap(); + model.updateHandleMap(deletedNodes); } } @@ -641,26 +646,26 @@ public class AsmManager { */ private void removeNode(IProgramElement progElem) { - StringBuffer flightrecorder = new StringBuffer(); +// StringBuffer flightrecorder = new StringBuffer(); try { - flightrecorder.append("In removeNode, about to chuck away: "+progElem+"\n"); +// flightrecorder.append("In removeNode, about to chuck away: "+progElem+"\n"); verifyAssumption(progElem!=null); boolean deleteOK = false; IProgramElement parent = progElem.getParent(); - flightrecorder.append("Parent of it is "+parent+"\n"); +// flightrecorder.append("Parent of it is "+parent+"\n"); List kids = parent.getChildren(); - flightrecorder.append("Which has "+kids.size()+" kids\n"); +// flightrecorder.append("Which has "+kids.size()+" kids\n"); for (int i =0 ;i<kids.size();i++) { - flightrecorder.append("Comparing with "+kids.get(i)+"\n"); +// flightrecorder.append("Comparing with "+kids.get(i)+"\n"); if (kids.get(i).equals(progElem)) { kids.remove(i); - flightrecorder.append("Removing it\n"); +// flightrecorder.append("Removing it\n"); deleteOK=true; break; } } - verifyAssumption(deleteOK,flightrecorder.toString()); +// verifyAssumption(deleteOK,flightrecorder.toString()); // Are there any kids left for this node? if (parent.getChildren().size()==0 && parent.getParent()!=null && (parent.getKind().equals(IProgramElement.Kind.CODE) || @@ -672,7 +677,7 @@ public class AsmManager { } } catch (NullPointerException npe ){ // Occurred when commenting out other 2 ras classes in wsif?? reproducable? - System.err.println(flightrecorder.toString()); +// System.err.println(flightrecorder.toString()); npe.printStackTrace(); } } diff --git a/asm/src/org/aspectj/asm/IHierarchy.java b/asm/src/org/aspectj/asm/IHierarchy.java index 95b00996b..481147cd8 100644 --- a/asm/src/org/aspectj/asm/IHierarchy.java +++ b/asm/src/org/aspectj/asm/IHierarchy.java @@ -99,4 +99,6 @@ public interface IHierarchy extends Serializable { public void flushTypeMap(); public void flushHandleMap(); + + public void updateHandleMap(Set deletedFiles); }
\ No newline at end of file diff --git a/asm/src/org/aspectj/asm/internal/AspectJElementHierarchy.java b/asm/src/org/aspectj/asm/internal/AspectJElementHierarchy.java index 448540802..5d3d7a0a2 100644 --- a/asm/src/org/aspectj/asm/internal/AspectJElementHierarchy.java +++ b/asm/src/org/aspectj/asm/internal/AspectJElementHierarchy.java @@ -367,5 +367,25 @@ public class AspectJElementHierarchy implements IHierarchy { public void flushHandleMap() { handleMap.clear(); } + + public void updateHandleMap(Set deletedFiles) { + // Only delete the entries we need to from the handle map - for performance reasons + List forRemoval = new ArrayList(); + Set k = handleMap.keySet(); + for (Iterator iter = k.iterator(); iter.hasNext();) { + String handle = (String) iter.next(); + if (deletedFiles.contains(getFilename(handle))) forRemoval.add(handle); + } + for (Iterator iter = forRemoval.iterator(); iter.hasNext();) { + String handle = (String) iter.next(); + handleMap.remove(handle); + } + } + + // XXX shouldn't be aware of the delimiter + private String getFilename(String hid) { + return hid.substring(0,hid.indexOf("|")); + } + } |