aboutsummaryrefslogtreecommitdiffstats
path: root/weaver/src
diff options
context:
space:
mode:
authoraclement <aclement>2005-11-26 16:36:23 +0000
committeraclement <aclement>2005-11-26 16:36:23 +0000
commit3ce492be631f9f598bbf9d1e045e4d9637885bf1 (patch)
tree50ee0c552d617078497916ba9f5db8fd8682ed2d /weaver/src
parent249d797a9eb4cbcd7bfdc658e128770eaeacc400 (diff)
downloadaspectj-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.java45
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 */