diff options
Diffstat (limited to 'weaver')
-rw-r--r-- | weaver/src/main/java/org/aspectj/weaver/tools/WeavingAdaptor.java | 25 |
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; |