]> source.dussan.org Git - aspectj.git/commitdiff
296734: various optimizations for LTW and aop.xml include/exclude processing
authoraclement <aclement>
Thu, 10 Dec 2009 20:03:46 +0000 (20:03 +0000)
committeraclement <aclement>
Thu, 10 Dec 2009 20:03:46 +0000 (20:03 +0000)
weaver/src/org/aspectj/weaver/bcel/BcelAdvice.java
weaver/src/org/aspectj/weaver/bcel/BcelMethod.java
weaver/src/org/aspectj/weaver/bcel/BcelObjectType.java
weaver/src/org/aspectj/weaver/bcel/BcelWeaver.java
weaver/src/org/aspectj/weaver/bcel/BcelWorld.java
weaver/src/org/aspectj/weaver/tools/WeavingAdaptor.java

index d544fb9e591c9ada8894687367c270a2f94c463f..4a64bd5c7a4746ac46516fc03478d7a052290b20 100644 (file)
@@ -104,9 +104,13 @@ class BcelAdvice extends Advice {
 
        @Override
        public ShadowMunger concretize(ResolvedType fromType, World world, PerClause clause) {
-               suppressLintWarnings(world);
+               if (!world.areAllLintIgnored()) {
+                       suppressLintWarnings(world);
+               }
                ShadowMunger ret = super.concretize(fromType, world, clause);
-               clearLintSuppressions(world, this.suppressedLintKinds);
+               if (!world.areAllLintIgnored()) {
+                       clearLintSuppressions(world, this.suppressedLintKinds);
+               }
                IfFinder ifinder = new IfFinder();
                ret.getPointcut().accept(ifinder, null);
                boolean hasGuardTest = ifinder.hasIf && getKind() != AdviceKind.Around;
@@ -138,10 +142,14 @@ class BcelAdvice extends Advice {
 
        @Override
        public boolean match(Shadow shadow, World world) {
-               suppressLintWarnings(world);
-               boolean ret = super.match(shadow, world);
-               clearLintSuppressions(world, this.suppressedLintKinds);
-               return ret;
+               if (world.areAllLintIgnored()) {
+                       return super.match(shadow, world);
+               } else {
+                       suppressLintWarnings(world);
+                       boolean ret = super.match(shadow, world);
+                       clearLintSuppressions(world, this.suppressedLintKinds);
+                       return ret;
+               }
        }
 
        @Override
@@ -167,9 +175,13 @@ class BcelAdvice extends Advice {
                }
 
                World world = shadow.getIWorld();
-               suppressLintWarnings(world);
+               if (!world.areAllLintIgnored()) {
+                       suppressLintWarnings(world);
+               }
                runtimeTest = getPointcut().findResidue(shadow, exposedState);
-               clearLintSuppressions(world, this.suppressedLintKinds);
+               if (!world.areAllLintIgnored()) {
+                       clearLintSuppressions(world, this.suppressedLintKinds);
+               }
 
                // these initializations won't be performed by findResidue, but need to be
                // so that the joinpoint is primed for weaving
index 5f606ce7f713ecf2e8ced31ab175b2142e9caf37..f7c463ddf16cc844b759ec1e0ebe1c41fbcaccfc 100644 (file)
@@ -184,11 +184,12 @@ class BcelMethod extends ResolvedMemberImpl {
 
        private void unpackAjAttributes(World world) {
                associatedShadowMunger = null;
-               List<AjAttribute> as = Utility.readAjAttributes(getDeclaringType().getClassName(), method.getAttributes(),
-                               getSourceContext(world), world, bcelObjectType.getWeaverVersionAttribute());
+               ResolvedType resolvedDeclaringType = getDeclaringType().resolve(world);
+               List<AjAttribute> as = Utility.readAjAttributes(resolvedDeclaringType.getClassName(), method.getAttributes(),
+                               resolvedDeclaringType.getSourceContext(), world, bcelObjectType.getWeaverVersionAttribute());
                processAttributes(world, as);
-               as = AtAjAttributes.readAj5MethodAttributes(method, this, world.resolve(getDeclaringType()), preResolvedPointcut,
-                               getSourceContext(world), world.getMessageHandler());
+               as = AtAjAttributes.readAj5MethodAttributes(method, this, resolvedDeclaringType, preResolvedPointcut, resolvedDeclaringType
+                               .getSourceContext(), world.getMessageHandler());
                processAttributes(world, as);
        }
 
index 60a1a54495ebea17a78c6bf250c68dc76d2e42d8..80811d291cea7b51c9e8d48ad5de21da279f091f 100644 (file)
@@ -68,6 +68,7 @@ import org.aspectj.weaver.patterns.PerClause;
 
 public class BcelObjectType extends AbstractReferenceTypeDelegate {
        public JavaClass javaClass;
+       private boolean artificial; // Was the BcelObject built from an artificial set of bytes? Or from the real ondisk stuff?
        private LazyClassGen lazyClassGen = null; // set lazily if it's an aspect
 
        private int modifiers;
@@ -135,9 +136,10 @@ public class BcelObjectType extends AbstractReferenceTypeDelegate {
         * that's a bigger piece of work. XXX
         */
 
-       BcelObjectType(ReferenceType resolvedTypeX, JavaClass javaClass, boolean exposedToWeaver) {
+       BcelObjectType(ReferenceType resolvedTypeX, JavaClass javaClass, boolean artificial, boolean exposedToWeaver) {
                super(resolvedTypeX, exposedToWeaver);
                this.javaClass = javaClass;
+               this.artificial = artificial;
                initializeFromJavaclass();
 
                // ATAJ: set the delegate right now for @AJ pointcut, else it is done
@@ -163,8 +165,9 @@ public class BcelObjectType extends AbstractReferenceTypeDelegate {
        }
 
        // repeat initialization
-       public void setJavaClass(JavaClass newclass) {
+       public void setJavaClass(JavaClass newclass, boolean artificial) {
                this.javaClass = newclass;
+               this.artificial = artificial;
                resetState();
                initializeFromJavaclass();
        }
@@ -475,6 +478,10 @@ public class BcelObjectType extends AbstractReferenceTypeDelegate {
                return javaClass;
        }
 
+       public boolean isArtificial() {
+               return artificial;
+       }
+
        public void resetState() {
                if (javaClass == null) {
                        // we might store the classname and allow reloading?
@@ -933,6 +940,8 @@ public class BcelObjectType extends AbstractReferenceTypeDelegate {
                                fields[i].evictWeavingState();
                        }
                        javaClass = null;
+
+                       this.artificial = true;
                        // setSourceContext(SourceContextImpl.UNKNOWN_SOURCE_CONTEXT); //
                        // bit naughty
                        // interfaces=null; // force reinit - may get us the right
@@ -959,4 +968,8 @@ public class BcelObjectType extends AbstractReferenceTypeDelegate {
        public boolean copySourceContext() {
                return false;
        }
+
+       public void setExposedToWeaver(boolean b) {
+               exposedToWeaver = b;
+       }
 }
index 993a2afbae4f8cab475809ef891b089d5c8fdc0b..d21a2157f26638692d905e18ac85c80236fa6ed3 100644 (file)
@@ -186,10 +186,10 @@ public class BcelWeaver {
                        if (wsi != null && wsi.isReweavable()) {
                                BcelObjectType classType = getClassType(type.getName());
                                JavaClass wovenJavaClass = classType.getJavaClass();
-                               JavaClass unwovenJavaClass = Utility.makeJavaClass(wovenJavaClass.getFileName(), wsi
-                                               .getUnwovenClassFileData(wovenJavaClass.getBytes()));
+                               byte[] bytes = wsi.getUnwovenClassFileData(wovenJavaClass.getBytes());
+                               JavaClass unwovenJavaClass = Utility.makeJavaClass(wovenJavaClass.getFileName(), bytes);
                                world.storeClass(unwovenJavaClass);
-                               classType.setJavaClass(unwovenJavaClass);
+                               classType.setJavaClass(unwovenJavaClass, true);
                                // classType.setJavaClass(Utility.makeJavaClass(classType.
                                // getJavaClass().getFileName(),
                                // wsi.getUnwovenClassFileData(classType.getJavaClass().getBytes(
@@ -263,11 +263,12 @@ public class BcelWeaver {
                                }
 
                                // FIXME ASC performance? of this alternative soln.
+                               int size = (int) entry.getSize();
                                ClassParser parser = new ClassParser(new ByteArrayInputStream(FileUtil.readAsByteArray(inStream)), entry.getName());
                                JavaClass jc = parser.parse();
                                inStream.closeEntry();
 
-                               ResolvedType type = world.addSourceObjectType(jc).getResolvedTypeX();
+                               ResolvedType type = world.addSourceObjectType(jc, false).getResolvedTypeX();
                                type.setBinaryPath(inFile.getAbsolutePath());
                                if (type.isAspect()) {
                                        addedAspects.add(type);
@@ -301,7 +302,7 @@ public class BcelWeaver {
        private void addIfAspect(byte[] bytes, String name, List<ResolvedType> toList, File dir) throws IOException {
                ClassParser parser = new ClassParser(new ByteArrayInputStream(bytes), name);
                JavaClass jc = parser.parse();
-               ResolvedType type = world.addSourceObjectType(jc).getResolvedTypeX();
+               ResolvedType type = world.addSourceObjectType(jc, false).getResolvedTypeX();
                String typeName = type.getName().replace('.', File.separatorChar);
                int end = name.lastIndexOf(typeName + ".class");
                String binaryPath = null;
@@ -454,7 +455,7 @@ public class BcelWeaver {
                // classFile)) {
                // // throw new RuntimeException(classFile.getClassName());
                // }
-               ReferenceType type = world.addSourceObjectType(classFile.getJavaClass()).getResolvedTypeX();
+               ReferenceType type = world.addSourceObjectType(classFile.getJavaClass(), false).getResolvedTypeX();
                if (fromInpath) {
                        type.setBinaryPath(classFile.getFilename());
                }
@@ -1437,7 +1438,8 @@ public class BcelWeaver {
                ResolvedType superclassType = resolvedTypeToWeave.getSuperclass();
                String superclassTypename = (superclassType == null ? null : superclassType.getName());
 
-               if (superclassType != null && !superclassType.isTypeHierarchyComplete() && superclassType.isExposedToWeaver()) { // typesForWeaving.contains(superclassTypename))                                                                                                                                                                                       // {
+               if (superclassType != null && !superclassType.isTypeHierarchyComplete() && superclassType.isExposedToWeaver()) { // typesForWeaving.contains(superclassTypename))
+                       // // {
                        weaveParentsFor(typesForWeaving, superclassTypename, superclassType);
                }
 
@@ -1514,8 +1516,9 @@ public class BcelWeaver {
                        // ().getFileName(), wsi.getUnwovenClassFileData()));
                        // new: reweavable default with clever diff
                        if (!world.isOverWeaving()) {
-                               classType.setJavaClass(Utility.makeJavaClass(classType.getJavaClass().getFileName(), wsi
-                                               .getUnwovenClassFileData(classType.getJavaClass().getBytes())));
+
+                               byte[] bytes = wsi.getUnwovenClassFileData(classType.getJavaClass().getBytes());
+                               classType.setJavaClass(Utility.makeJavaClass(classType.getJavaClass().getFileName(), bytes), true);
                                // } else {
                                // System.out.println("overweaving " + className);
                        }
@@ -1788,34 +1791,34 @@ public class BcelWeaver {
                                return null;
                        }
                        ReferenceType resolvedClassType = classType.getResolvedTypeX();
-       
+
                        if (world.isXmlConfigured() && world.getXmlConfiguration().excludesType(resolvedClassType)) {
                                if (!world.getMessageHandler().isIgnoring(IMessage.INFO)) {
                                        world.getMessageHandler().handleMessage(
                                                        MessageUtil.info("Type '" + resolvedClassType.getName()
                                                                        + "' not woven due to exclusion via XML weaver exclude section"));
-       
+
                                }
                                if (dump) {
                                        dumpUnchanged(classFile);
                                }
                                return null;
                        }
-       
+
                        List<ShadowMunger> shadowMungers = fastMatch(shadowMungerList, resolvedClassType);
                        List<ConcreteTypeMunger> typeMungers = classType.getResolvedTypeX().getInterTypeMungers();
-       
+
                        resolvedClassType.checkInterTypeMungers();
-       
+
                        // Decide if we need to do actual weaving for this class
                        boolean mightNeedToWeave = shadowMungers.size() > 0 || typeMungers.size() > 0 || classType.isAspect()
                                        || world.getDeclareAnnotationOnMethods().size() > 0 || world.getDeclareAnnotationOnFields().size() > 0;
-       
+
                        // May need bridge methods if on 1.5 and something in our hierarchy is
                        // affected by ITDs
                        boolean mightNeedBridgeMethods = world.isInJava5Mode() && !classType.isInterface()
                                        && resolvedClassType.getInterTypeMungersIncludingSupers().size() > 0;
-       
+
                        LazyClassGen clazz = null;
                        if (mightNeedToWeave || mightNeedBridgeMethods) {
                                clazz = classType.getLazyClassGen();
@@ -1823,16 +1826,16 @@ public class BcelWeaver {
                                // clazz.getWeaverState());
                                try {
                                        boolean isChanged = false;
-       
+
                                        if (mightNeedToWeave) {
                                                isChanged = BcelClassWeaver.weave(world, clazz, shadowMungers, typeMungers, lateTypeMungerList,
                                                                inReweavableMode);
                                        }
-       
+
                                        if (mightNeedBridgeMethods) {
                                                isChanged = BcelClassWeaver.calculateAnyRequiredBridgeMethods(world, clazz) || isChanged;
                                        }
-       
+
                                        if (isChanged) {
                                                if (dump) {
                                                        dump(classFile, clazz);
@@ -1867,15 +1870,15 @@ public class BcelWeaver {
                         * world.getModelAsAsmManager(); if (asm != null) { IHierarchy model = asm.getHierarchy(); if (!classType.isAspect()) {
                         * 
                         * String pkgname = classType.getResolvedTypeX().getPackageName(); String tname =
-                        * classType.getResolvedTypeX().getSimpleBaseName(); IProgramElement typeElement = model.findElementForType(pkgname, tname);
-                        * if (typeElement != null) { Set deleted = new HashSet();
+                        * classType.getResolvedTypeX().getSimpleBaseName(); IProgramElement typeElement = model.findElementForType(pkgname,
+                        * tname); if (typeElement != null) { Set deleted = new HashSet();
                         * deleted.add(asm.getCanonicalFilePath(typeElement.getSourceLocation().getSourceFile()));
                         * 
-                        * model.updateHandleMap(deleted); IProgramElement parent = typeElement.getParent(); // parent may have children: PACKAGE
-                        * DECL, IMPORT-REFEFERENCE, TYPE_DECL if (parent != null) { typeElement.getParent().removeChild(typeElement); //
-                        * System.out.println("Removing " + classType.getResolvedTypeX().getName() + "? " // + ); } } } }
+                        * model.updateHandleMap(deleted); IProgramElement parent = typeElement.getParent(); // parent may have children:
+                        * PACKAGE DECL, IMPORT-REFEFERENCE, TYPE_DECL if (parent != null) { typeElement.getParent().removeChild(typeElement);
+                        * // System.out.println("Removing " + classType.getResolvedTypeX().getName() + "? " // + ); } } } }
                         */
-                       if (dump) { 
+                       if (dump) {
                                dumpUnchanged(classFile);
                                return clazz;
                        } else {
index 175041229638bbec9c266038569954b1571f400c..756f33dcc9ed28cb450181ce52c88c68ae6b8c2d 100644 (file)
@@ -374,12 +374,12 @@ public class BcelWorld extends World implements Repository {
                if (jc == null) {
                        return null;
                } else {
-                       return buildBcelDelegate(ty, jc, false);
+                       return buildBcelDelegate(ty, jc, false, false);
                }
        }
 
-       public BcelObjectType buildBcelDelegate(ReferenceType type, JavaClass jc, boolean exposedToWeaver) {
-               BcelObjectType ret = new BcelObjectType(type, jc, exposedToWeaver);
+       public BcelObjectType buildBcelDelegate(ReferenceType type, JavaClass jc, boolean artificial, boolean exposedToWeaver) {
+               BcelObjectType ret = new BcelObjectType(type, jc, artificial, exposedToWeaver);
                return ret;
        }
 
@@ -420,11 +420,59 @@ public class BcelWorld extends World implements Repository {
                }
        }
 
-       public BcelObjectType addSourceObjectType(JavaClass jc) {
+       // public BcelObjectType addSourceObjectType(JavaClass jc) {
+       // return addSourceObjectType(jc.getClassName(), jc, -1);
+       // }
+
+       public BcelObjectType addSourceObjectType(JavaClass jc, boolean artificial) {
+               return addSourceObjectType(jc.getClassName(), jc, artificial);
+       }
+
+       public BcelObjectType addSourceObjectType(String classname, JavaClass jc, boolean artificial) {
                BcelObjectType ret = null;
+               if (!jc.getClassName().equals(classname)) {
+                       throw new RuntimeException(jc.getClassName() + "!=" + classname);
+               }
                String signature = UnresolvedType.forName(jc.getClassName()).getSignature();
 
-               Object fromTheMap = typeMap.get(signature);
+               ResolvedType fromTheMap = typeMap.get(signature);
+
+               if (fromTheMap != null && !(fromTheMap instanceof ReferenceType)) {
+                       // what on earth is it then? See pr 112243
+                       StringBuffer exceptionText = new StringBuffer();
+                       exceptionText.append("Found invalid (not a ReferenceType) entry in the type map. ");
+                       exceptionText.append("Signature=[" + signature + "] Found=[" + fromTheMap + "] Class=[" + fromTheMap.getClass() + "]");
+                       throw new BCException(exceptionText.toString());
+               }
+
+               ReferenceType nameTypeX = (ReferenceType) fromTheMap;
+
+               if (nameTypeX == null) {
+                       if (jc.isGeneric() && isInJava5Mode()) {
+                               nameTypeX = ReferenceType.fromTypeX(UnresolvedType.forRawTypeName(jc.getClassName()), this);
+                               ret = buildBcelDelegate(nameTypeX, jc, artificial, true);
+                               ReferenceType genericRefType = new ReferenceType(UnresolvedType.forGenericTypeSignature(signature, ret
+                                               .getDeclaredGenericSignature()), this);
+                               nameTypeX.setDelegate(ret);
+                               genericRefType.setDelegate(ret);
+                               nameTypeX.setGenericType(genericRefType);
+                               typeMap.put(signature, nameTypeX);
+                       } else {
+                               nameTypeX = new ReferenceType(signature, this);
+                               ret = buildBcelDelegate(nameTypeX, jc, artificial, true);
+                               typeMap.put(signature, nameTypeX);
+                       }
+               } else {
+                       ret = buildBcelDelegate(nameTypeX, jc, artificial, true);
+               }
+               return ret;
+       }
+
+       public BcelObjectType addSourceObjectType(String classname, byte[] bytes, boolean artificial) {
+               BcelObjectType ret = null;
+               String signature = UnresolvedType.forName(classname).getSignature();
+
+               ResolvedType fromTheMap = typeMap.get(signature);
 
                if (fromTheMap != null && !(fromTheMap instanceof ReferenceType)) {
                        // what on earth is it then? See pr 112243
@@ -437,9 +485,10 @@ public class BcelWorld extends World implements Repository {
                ReferenceType nameTypeX = (ReferenceType) fromTheMap;
 
                if (nameTypeX == null) {
+                       JavaClass jc = Utility.makeJavaClass(classname, bytes);
                        if (jc.isGeneric() && isInJava5Mode()) {
                                nameTypeX = ReferenceType.fromTypeX(UnresolvedType.forRawTypeName(jc.getClassName()), this);
-                               ret = buildBcelDelegate(nameTypeX, jc, true);
+                               ret = buildBcelDelegate(nameTypeX, jc, artificial, true);
                                ReferenceType genericRefType = new ReferenceType(UnresolvedType.forGenericTypeSignature(signature, ret
                                                .getDeclaredGenericSignature()), this);
                                nameTypeX.setDelegate(ret);
@@ -448,11 +497,25 @@ public class BcelWorld extends World implements Repository {
                                typeMap.put(signature, nameTypeX);
                        } else {
                                nameTypeX = new ReferenceType(signature, this);
-                               ret = buildBcelDelegate(nameTypeX, jc, true);
+                               ret = buildBcelDelegate(nameTypeX, jc, artificial, true);
                                typeMap.put(signature, nameTypeX);
                        }
                } else {
-                       ret = buildBcelDelegate(nameTypeX, jc, true);
+                       Object o = nameTypeX.getDelegate();
+                       if (!(o instanceof BcelObjectType)) {
+                               throw new IllegalStateException("For " + classname + " should be BcelObjectType, but is " + o.getClass());
+                       }
+                       ret = (BcelObjectType) o;
+                       // byte[] bs = ret.javaClass.getBytes();
+                       // if (bs.length != bytes.length) {
+                       // throw new RuntimeException("Shit");
+                       // }
+                       if (ret.isArtificial()) {
+                               // System.out.println("Rebuilding " + nameTypeX.getName());
+                               ret = buildBcelDelegate(nameTypeX, Utility.makeJavaClass(classname, bytes), artificial, true);
+                       } else {
+                               ret.setExposedToWeaver(true);
+                       }
                }
                return ret;
        }
@@ -1028,4 +1091,8 @@ public class BcelWorld extends World implements Repository {
                }
        }
 
+       public TypeMap getTypeMap() {
+               return typeMap;
+       }
+
 }
index cb137d8d14361351d9e9bec3e4b6fc76097c6c82..f9060140d1133e293fccd427ab6d7ea1ab292327 100644 (file)
@@ -53,7 +53,6 @@ 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;
 
 // OPTIMIZE add guards for all the debug/info/etc
 /**
@@ -84,7 +83,7 @@ public class WeavingAdaptor implements IMessageContext {
        private boolean abortOnError = false;
        protected GeneratedClassHandler generatedClassHandler;
        protected Map generatedClasses = new HashMap(); /* String -> UnwovenClassFile */
-       protected BcelObjectType delegateForCurrentClass; // lazily initialized, should be used to prevent parsing bytecode multiple
+       public BcelObjectType delegateForCurrentClass; // lazily initialized, should be used to prevent parsing bytecode multiple
        // times
 
        private boolean haveWarnedOnJavax = false;
@@ -293,6 +292,8 @@ public class WeavingAdaptor implements IMessageContext {
                                return bytes;
                        }
 
+                       boolean debugOn = !messageHandler.isIgnoring(Message.DEBUG);
+
                        try {
                                delegateForCurrentClass = null;
                                name = name.replace('/', '.');
@@ -303,21 +304,27 @@ public class WeavingAdaptor implements IMessageContext {
                                                // a valid aspectOf()/hasAspect() generated in them. However - if they are excluded
                                                // (via include/exclude in aop.xml) they really should only get aspectOf()/hasAspect()
                                                // and not be included in the full set of aspects being applied by 'this' weaver
-                                               debug("weaving '" + name + "'");
-                                               bytes = getWovenBytes(name, bytes);
-                                       } else if (shouldWeaveAnnotationStyleAspect(name, bytes)) {
-                                               if (mustWeave) {
-                                                       if (bcelWorld.getLint().mustWeaveXmlDefinedAspects.isEnabled()) {
-                                                               bcelWorld.getLint().mustWeaveXmlDefinedAspects.signal(name, null);
-                                                       }
+                                               if (debugOn) {
+                                                       debug("weaving '" + name + "'");
                                                }
-                                               // an @AspectJ aspect needs to be at least munged by the aspectOf munger
-                                               debug("weaving '" + name + "'");
-                                               bytes = getAtAspectJAspectBytes(name, bytes);
-                                       } else {
+                                               bytes = getWovenBytes(name, bytes);
+                                               // temporarily out - searching for @Aspect annotated types is a slow thing to do - we should
+                                               // expect the user to name them if they want them woven - just like code style
+                                               // } else if (shouldWeaveAnnotationStyleAspect(name, bytes)) {
+                                               // if (mustWeave) {
+                                               // if (bcelWorld.getLint().mustWeaveXmlDefinedAspects.isEnabled()) {
+                                               // bcelWorld.getLint().mustWeaveXmlDefinedAspects.signal(name, null);
+                                               // }
+                                               // }
+                                               // // an @AspectJ aspect needs to be at least munged by the aspectOf munger
+                                               // if (debugOn) {
+                                               // debug("weaving '" + name + "'");
+                                               // }
+                                               // bytes = getAtAspectJAspectBytes(name, bytes);
+                                       } else if (debugOn) {
                                                debug("not weaving '" + name + "'");
                                        }
-                               } else {
+                               } else if (debugOn) {
                                        debug("cannot weave '" + name + "'");
                                }
                        } finally {
@@ -351,44 +358,46 @@ public class WeavingAdaptor implements IMessageContext {
        }
 
        private boolean shouldWeaveName(String name) {
-               if ((weavingSpecialTypes & INITIALIZED) == 0) {
-                       weavingSpecialTypes |= INITIALIZED;
-                       // initialize it
-                       Properties p = weaver.getWorld().getExtraConfiguration();
-                       if (p != null) {
-                               boolean b = p.getProperty(World.xsetWEAVE_JAVA_PACKAGES, "false").equalsIgnoreCase("true");
-                               if (b) {
-                                       weavingSpecialTypes |= WEAVE_JAVA_PACKAGE;
-                               }
-                               b = p.getProperty(World.xsetWEAVE_JAVAX_PACKAGES, "false").equalsIgnoreCase("true");
-                               if (b) {
-                                       weavingSpecialTypes |= WEAVE_JAVAX_PACKAGE;
+               if ("osj".indexOf(name.charAt(0)) != -1) {
+                       if ((weavingSpecialTypes & INITIALIZED) == 0) {
+                               weavingSpecialTypes |= INITIALIZED;
+                               // initialize it
+                               Properties p = weaver.getWorld().getExtraConfiguration();
+                               if (p != null) {
+                                       boolean b = p.getProperty(World.xsetWEAVE_JAVA_PACKAGES, "false").equalsIgnoreCase("true");
+                                       if (b) {
+                                               weavingSpecialTypes |= WEAVE_JAVA_PACKAGE;
+                                       }
+                                       b = p.getProperty(World.xsetWEAVE_JAVAX_PACKAGES, "false").equalsIgnoreCase("true");
+                                       if (b) {
+                                               weavingSpecialTypes |= WEAVE_JAVAX_PACKAGE;
+                                       }
                                }
                        }
-               }
-               if (name.startsWith("org.aspectj.")) {
-                       return false;
-               }
-               if (name.startsWith("sun.reflect.")) {// JDK reflect
-                       return false;
-               }
-               if (name.startsWith("javax.")) {
-                       if ((weavingSpecialTypes & WEAVE_JAVAX_PACKAGE) != 0) {
-                               return true;
-                       } else {
-                               if (!haveWarnedOnJavax) {
-                                       haveWarnedOnJavax = true;
-                                       warn("javax.* types are not being woven because the weaver option '-Xset:weaveJavaxPackages=true' has not been specified");
-                               }
+                       if (name.startsWith("org.aspectj.")) {
                                return false;
                        }
-               }
-               if (name.startsWith("java.")) {
-                       if ((weavingSpecialTypes & WEAVE_JAVA_PACKAGE) != 0) {
-                               return true;
-                       } else {
+                       if (name.startsWith("sun.reflect.")) {// JDK reflect
                                return false;
                        }
+                       if (name.startsWith("javax.")) {
+                               if ((weavingSpecialTypes & WEAVE_JAVAX_PACKAGE) != 0) {
+                                       return true;
+                               } else {
+                                       if (!haveWarnedOnJavax) {
+                                               haveWarnedOnJavax = true;
+                                               warn("javax.* types are not being woven because the weaver option '-Xset:weaveJavaxPackages=true' has not been specified");
+                                       }
+                                       return false;
+                               }
+                       }
+                       if (name.startsWith("java.")) {
+                               if ((weavingSpecialTypes & WEAVE_JAVA_PACKAGE) != 0) {
+                                       return true;
+                               } else {
+                                       return false;
+                               }
+                       }
                }
                // boolean should = !(name.startsWith("org.aspectj.")
                // || (name.startsWith("java.") && (weavingSpecialTypes & WEAVE_JAVA_PACKAGE) == 0)
@@ -432,7 +441,8 @@ public class WeavingAdaptor implements IMessageContext {
 
        protected void ensureDelegateInitialized(String name, byte[] bytes) {
                if (delegateForCurrentClass == null) {
-                       delegateForCurrentClass = ((BcelWorld) weaver.getWorld()).addSourceObjectType(Utility.makeJavaClass(name, bytes));
+                       BcelWorld world = (BcelWorld) weaver.getWorld();
+                       delegateForCurrentClass = world.addSourceObjectType(name, bytes, false);
                }
        }