aboutsummaryrefslogtreecommitdiffstats
path: root/weaver
diff options
context:
space:
mode:
authoraclement <aclement>2006-08-07 13:04:28 +0000
committeraclement <aclement>2006-08-07 13:04:28 +0000
commitc779c96eff482f8b99fe5d7f85505f1792780281 (patch)
tree05dcb30d67255d81ef51a0e87996cbfff162f5f2 /weaver
parent73368931c7c7b346b062321c83a55c86ecd41ffd (diff)
downloadaspectj-c779c96eff482f8b99fe5d7f85505f1792780281.tar.gz
aspectj-c779c96eff482f8b99fe5d7f85505f1792780281.zip
fix for 152871: parsing bytecode too often
Diffstat (limited to 'weaver')
-rw-r--r--weaver/src/org/aspectj/weaver/bcel/UnwovenClassFile.java7
-rw-r--r--weaver/src/org/aspectj/weaver/bcel/Utility.java4
-rw-r--r--weaver/src/org/aspectj/weaver/tools/WeavingAdaptor.java56
3 files changed, 45 insertions, 22 deletions
diff --git a/weaver/src/org/aspectj/weaver/bcel/UnwovenClassFile.java b/weaver/src/org/aspectj/weaver/bcel/UnwovenClassFile.java
index 52f3aa7e4..09e5f48c3 100644
--- a/weaver/src/org/aspectj/weaver/bcel/UnwovenClassFile.java
+++ b/weaver/src/org/aspectj/weaver/bcel/UnwovenClassFile.java
@@ -37,6 +37,13 @@ public class UnwovenClassFile {
this.filename = filename;
this.bytes = bytes;
}
+
+ /** Use if the classname is known, saves a bytecode parse */
+ public UnwovenClassFile(String filename, String classname,byte[] bytes) {
+ this.filename = filename;
+ this.className = classname;
+ this.bytes = bytes;
+ }
public String getFilename() {
return filename;
diff --git a/weaver/src/org/aspectj/weaver/bcel/Utility.java b/weaver/src/org/aspectj/weaver/bcel/Utility.java
index 1f99c526f..c6e735cf8 100644
--- a/weaver/src/org/aspectj/weaver/bcel/Utility.java
+++ b/weaver/src/org/aspectj/weaver/bcel/Utility.java
@@ -521,9 +521,13 @@ public class Utility {
}
return inst;
}
+
+ /** For testing purposes: bit clunky but does work */
+ public static int testingParseCounter=0;
public static JavaClass makeJavaClass(String filename, byte[] bytes) {
try {
+ testingParseCounter++;
ClassParser parser = new ClassParser(new ByteArrayInputStream(bytes), filename);
return parser.parse();
} catch (IOException e) {
diff --git a/weaver/src/org/aspectj/weaver/tools/WeavingAdaptor.java b/weaver/src/org/aspectj/weaver/tools/WeavingAdaptor.java
index f62c7305e..b6d386e02 100644
--- a/weaver/src/org/aspectj/weaver/tools/WeavingAdaptor.java
+++ b/weaver/src/org/aspectj/weaver/tools/WeavingAdaptor.java
@@ -46,6 +46,7 @@ import org.aspectj.weaver.bcel.BcelObjectType;
import org.aspectj.weaver.bcel.BcelWeaver;
import org.aspectj.weaver.bcel.BcelWorld;
import org.aspectj.weaver.bcel.UnwovenClassFile;
+import org.aspectj.weaver.bcel.Utility;
/**
* This adaptor allows the AspectJ compiler to be embedded in an existing
@@ -77,6 +78,7 @@ public class WeavingAdaptor {
private WeavingAdaptorMessageHandler messageHolder;
protected GeneratedClassHandler generatedClassHandler;
protected Map generatedClasses = new HashMap(); /* String -> UnwovenClassFile */
+ protected BcelObjectType delegateForCurrentClass; // lazily initialized, should be used to prevent parsing bytecode multiple times
private static Trace trace = TraceFactory.getTraceFactory().getTrace(WeavingAdaptor.class);
@@ -207,21 +209,25 @@ public class WeavingAdaptor {
*/
public byte[] weaveClass (String name, byte[] bytes) throws IOException {
if (enabled) {
- if (trace.isTraceEnabled()) trace.enter("weaveClass",this,new Object[] {name,bytes});
-
- if (shouldWeave(name, bytes)) {
- info("weaving '" + name + "'");
- bytes = getWovenBytes(name, bytes);
- } else if (shouldWeaveAnnotationStyleAspect(name, bytes)) {
- // an @AspectJ aspect needs to be at least munged by the aspectOf munger
- info("weaving '" + name + "'");
- bytes = getAtAspectJAspectBytes(name, bytes);
- }
- else {
- info("not weaving '" + name + "'");
+ try {
+ delegateForCurrentClass=null; // TODO will need stack if going recursive...
+ if (trace.isTraceEnabled()) trace.enter("weaveClass",this,new Object[] {name,bytes});
+ if (shouldWeave(name, bytes)) {
+ info("weaving '" + name + "'");
+ bytes = getWovenBytes(name, bytes);
+ } else if (shouldWeaveAnnotationStyleAspect(name, bytes)) {
+ // an @AspectJ aspect needs to be at least munged by the aspectOf munger
+ info("weaving '" + name + "'");
+ bytes = getAtAspectJAspectBytes(name, bytes);
+ }
+ else {
+ info("not weaving '" + name + "'");
+ }
+
+ if (trace.isTraceEnabled()) trace.exit("weaveClass",bytes);
+ } finally {
+ delegateForCurrentClass=null;
}
-
- if (trace.isTraceEnabled()) trace.exit("weaveClass",bytes);
}
return bytes;
@@ -253,8 +259,7 @@ public class WeavingAdaptor {
private boolean shouldWeaveName (String name) {
boolean should =
- !((/*(name.startsWith("org.apache.bcel.")//FIXME AV why ? bcel is wrapped in org.aspectj.
- ||*/ name.startsWith("org.aspectj.")
+ !((name.startsWith("org.aspectj.")
|| name.startsWith("java.")
|| name.startsWith("javax."))
//|| name.startsWith("$Proxy")//JDK proxies//FIXME AV is that 1.3 proxy ? fe. ataspect.$Proxy0 is a java5 proxy...
@@ -273,7 +278,13 @@ public class WeavingAdaptor {
private boolean shouldWeaveAnnotationStyleAspect(String name, byte[] bytes) {
// AV: instead of doing resolve that would lookup stuff on disk thru BCEL ClassLoaderRepository
// we reuse bytes[] here to do a fast lookup for @Aspect annotation
- return bcelWorld.isAnnotationStyleAspect(name, bytes);
+ ensureDelegateInitialized(name,bytes);
+ return (delegateForCurrentClass.isAnnotationStyleAspect());
+ }
+
+ protected void ensureDelegateInitialized(String name,byte[] bytes) {
+ if (delegateForCurrentClass==null)
+ delegateForCurrentClass = ((BcelWorld)weaver.getWorld()).addSourceObjectType(Utility.makeJavaClass(name, bytes));
}
/**
@@ -478,17 +489,16 @@ public class WeavingAdaptor {
private List unwovenClasses = new ArrayList(); /* List<UnovenClassFile> */
private UnwovenClassFile wovenClass;
private boolean isApplyAtAspectJMungersOnly = false;
- private BcelObjectType delegate;
public WeavingClassFileProvider (String name, byte[] bytes) {
- this.unwovenClass = new UnwovenClassFile(name,bytes);
+ ensureDelegateInitialized(name, bytes);
+ this.unwovenClass = new UnwovenClassFile(name,delegateForCurrentClass.getResolvedTypeX().getName(),bytes);
this.unwovenClasses.add(unwovenClass);
if (shouldDump(name.replace('/', '.'),true)) {
dump(name, bytes, true);
}
-
- delegate = bcelWorld.addSourceObjectType(unwovenClass.getJavaClass());
+
}
public void setApplyAtAspectJMungersOnly() {
@@ -539,8 +549,10 @@ public class WeavingAdaptor {
public void weavingClasses() {}
public void weaveCompleted() {
- if (delegate!=null) delegate.weavingCompleted();
ResolvedType.resetPrimitives();
+ if (delegateForCurrentClass!=null) delegateForCurrentClass.weavingCompleted();
+ ResolvedType.resetPrimitives();
+ //bcelWorld.discardType(typeBeingProcessed.getResolvedTypeX()); // work in progress
}
};
}