aboutsummaryrefslogtreecommitdiffstats
path: root/weaver
diff options
context:
space:
mode:
Diffstat (limited to 'weaver')
-rw-r--r--weaver/src/main/java/org/aspectj/weaver/tools/WeavingAdaptor.java25
1 files changed, 24 insertions, 1 deletions
diff --git a/weaver/src/main/java/org/aspectj/weaver/tools/WeavingAdaptor.java b/weaver/src/main/java/org/aspectj/weaver/tools/WeavingAdaptor.java
index 009aa7daa..551ef45e6 100644
--- a/weaver/src/main/java/org/aspectj/weaver/tools/WeavingAdaptor.java
+++ b/weaver/src/main/java/org/aspectj/weaver/tools/WeavingAdaptor.java
@@ -358,9 +358,17 @@ public class WeavingAdaptor implements IMessageContext {
boolean debugOn = !messageHandler.isIgnoring(Message.DEBUG);
+ name = name.replace('/', '.');
+ byte[] wovenBytes = wovenWithGeneratedClass(name);
+ if (wovenBytes != null) {
+ if (debugOn) {
+ debug("returning woven bytes for '" + name + "' that were generated by a previous weaving process");
+ }
+ return wovenBytes;
+ }
+
try {
delegateForCurrentClass = null;
- name = name.replace('/', '.');
if (couldWeave(name, bytes)) {
if (accept(name, bytes)) {
@@ -448,6 +456,21 @@ public class WeavingAdaptor implements IMessageContext {
return !generatedClasses.containsKey(name) && shouldWeaveName(name);
}
+ /**
+ * Return the bytes from a (parallel?) weaving process that generated an inner class, e.g. to support Around closures.
+ * This is done instead of weaving again, as weaving would generate another inner class.
+ * @param name
+ * @return the cached bytes of a previously woven class, or null if not found
+ */
+ private byte[] wovenWithGeneratedClass(String name) {
+ IUnwovenClassFile woven = generatedClasses.get(name);
+ if (woven == null) {
+ return null;
+ }
+
+ return woven.getBytes();
+ }
+
// ATAJ
protected boolean accept(String name, byte[] bytes) {
return true;