diff options
author | aclement <aclement> | 2005-11-26 16:36:23 +0000 |
---|---|---|
committer | aclement <aclement> | 2005-11-26 16:36:23 +0000 |
commit | 3ce492be631f9f598bbf9d1e045e4d9637885bf1 (patch) | |
tree | 50ee0c552d617078497916ba9f5db8fd8682ed2d /weaver/src | |
parent | 249d797a9eb4cbcd7bfdc658e128770eaeacc400 (diff) | |
download | aspectj-3ce492be631f9f598bbf9d1e045e4d9637885bf1.tar.gz aspectj-3ce492be631f9f598bbf9d1e045e4d9637885bf1.zip |
Matthews changes - enabling us to see bytecode before and after LTW (bug 117854)
Diffstat (limited to 'weaver/src')
-rw-r--r-- | weaver/src/org/aspectj/weaver/tools/WeavingAdaptor.java | 45 |
1 files changed, 44 insertions, 1 deletions
diff --git a/weaver/src/org/aspectj/weaver/tools/WeavingAdaptor.java b/weaver/src/org/aspectj/weaver/tools/WeavingAdaptor.java index f70215328..398a0b4f3 100644 --- a/weaver/src/org/aspectj/weaver/tools/WeavingAdaptor.java +++ b/weaver/src/org/aspectj/weaver/tools/WeavingAdaptor.java @@ -14,6 +14,7 @@ package org.aspectj.weaver.tools; import java.io.File; +import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintWriter; import java.net.URL; @@ -187,6 +188,7 @@ public class WeavingAdaptor { */ public byte[] weaveClass (String name, byte[] bytes) throws IOException { if (enabled) { + if (shouldWeave(name, bytes)) { info("weaving '" + name + "'"); bytes = getWovenBytes(name, bytes); @@ -220,7 +222,7 @@ public class WeavingAdaptor { return true; } - public boolean shouldDump(String name) { + protected boolean shouldDump(String name, boolean before) { return false; } @@ -338,6 +340,37 @@ public class WeavingAdaptor { } /** + * Dump the given bytcode in _dump/... (dev mode) + * + * @param name + * @param b + * @param before whether we are dumping before weaving + * @throws Throwable + */ + protected void dump(String name, byte[] b, boolean before) { + String dirName = "_ajdump"; + if (before) dirName = dirName + File.separator + "_before"; + + String className = name.replace('.', '/'); + final File dir; + if (className.indexOf('/') > 0) { + dir = new File(dirName + File.separator + className.substring(0, className.lastIndexOf('/'))); + } else { + dir = new File(dirName); + } + dir.mkdirs(); + String fileName = dirName + File.separator + className + ".class"; + try { + FileOutputStream os = new FileOutputStream(fileName); + os.write(b); + os.close(); + } + catch (IOException ex) { + warn("unable to dump class " + name + " in directory " + dirName,ex); + } + } + + /** * Processes messages arising from weaver operations. * Tell weaver to abort on any message more severe than warning. */ @@ -396,6 +429,11 @@ public class WeavingAdaptor { public WeavingClassFileProvider (String name, byte[] bytes) { this.unwovenClass = new UnwovenClassFile(name,bytes); this.unwovenClasses.add(unwovenClass); + + if (shouldDump(name.replace('/', '.'),true)) { + dump(name, bytes, true); + } + bcelWorld.addSourceObjectType(unwovenClass.getJavaClass()); } @@ -422,6 +460,11 @@ public class WeavingAdaptor { public void acceptResult(UnwovenClassFile result) { if (wovenClass == null) { wovenClass = result; + + String name = result.getClassName(); + if (shouldDump(name.replace('/', '.'), false)) { + dump(name, result.getBytes(), false); + } } /* Classes generated by weaver e.g. around closure advice */ |