match(mg, h, beforeSuperOrThisCall ? null : enclosingShadow, shadowAccumulator);
	private boolean match(LazyMethodGen mg) {		BcelShadow enclosingShadow;		List shadowAccumulator = new ArrayList();		// we want to match ajsynthetic constructors...		if (mg.getName().equals("<init>")) {			// XXX the enclosing join point is wrong for things before ignoreMe.			InstructionHandle superOrThisCall = findSuperOrThisCall(mg);			// we don't walk bodies of things where it's a wrong constructor thingie			if (superOrThisCall == null) return false;			enclosingShadow = BcelShadow.makeConstructorExecution(world, mg, superOrThisCall);						// walk the body			boolean beforeSuperOrThisCall = true;			if (shouldWeaveBody(mg)) { //!mg.isAjSynthetic()) {				for (InstructionHandle h = mg.getBody().getStart();					h != null;					h = h.getNext()) {					if (h == superOrThisCall) {						beforeSuperOrThisCall = false;						continue;					}					match(mg, h, beforeSuperOrThisCall ? null : enclosingShadow, shadowAccumulator);				}				match(enclosingShadow, shadowAccumulator);			}						// XXX we don't do pre-inits of interfaces						// now add interface inits and cexecs			if (superOrThisCall != null && ! isThisCall(superOrThisCall)) {				InstructionHandle curr = enclosingShadow.getRange().getStart();				for (Iterator i = addedSuperInitializersAsList.iterator(); i.hasNext(); ) {					IfaceInitList l = (IfaceInitList) i.next();					// generate the cexec jp					Member ifaceInitSig = AjcMemberMaker.interfaceConstructor(l.onType);					BcelShadow cexecShadow =						BcelShadow.makeIfaceConstructorExecution(							world,							mg,							curr,							ifaceInitSig);					if (match(cexecShadow, shadowAccumulator)) {						cexecShadow.getRange().getBody().append(							cexecShadow.getRange().getStart(),							InstructionConstants.NOP);					}					// generate the init jp around it					BcelShadow initShadow =						BcelShadow.makeIfaceInitialization(							world,							mg,							cexecShadow,							ifaceInitSig);					match(initShadow, shadowAccumulator);					// insert code in place					InstructionList inits = genInitInstructions(l.list, false);					initShadow.getRange().insert(inits, Range.InsideAfter);				}								// now we add our initialization code				InstructionList inits = genInitInstructions(addedThisInitializers, false);				enclosingShadow.getRange().insert(inits, Range.OutsideBefore);							}			// actually, you only need to inline the self constructors that are 			// in a particular group (partition the constructors into groups where members			// call or are called only by those in the group).  Then only inline 			// constructors			// in groups where at least one initialization jp matched.  Future work.			boolean addedInitialization = 				match(					BcelShadow.makeUnfinishedInitialization(world, mg), 					initializationShadows);			addedInitialization |=				match(					BcelShadow.makeUnfinishedPreinitialization(world, mg),					initializationShadows);			mg.matchedShadows = shadowAccumulator;			return addedInitialization || !shadowAccumulator.isEmpty();		} else if (!shouldWeaveBody(mg)) { //.isAjSynthetic()) {			return false;					} else {			if (mg.getName().equals("<clinit>")) {				clinitShadow = enclosingShadow = BcelShadow.makeStaticInitialization(world, mg);				//System.err.println(enclosingShadow);			} else if (mg.isAdviceMethod()) {				enclosingShadow = BcelShadow.makeAdviceExecution(world, mg);			} else {				AjAttribute.EffectiveSignatureAttribute effective = mg.getEffectiveSignature();				if (effective == null) {					enclosingShadow = BcelShadow.makeMethodExecution(world, mg, !canMatchBodyShadows);				} else if (effective.isWeaveBody()) {					enclosingShadow =						BcelShadow.makeShadowForMethod(							world,							mg,							effective.getShadowKind(),							effective.getEffectiveSignature());				} else {					return false;				}			}			if (canMatchBodyShadows) {				for (InstructionHandle h = mg.getBody().getStart();					h != null;					h = h.getNext()) {					match(mg, h, enclosingShadow, shadowAccumulator);				}			}			if (match(enclosingShadow, shadowAccumulator)) {				enclosingShadow.init();			}			mg.matchedShadows = shadowAccumulator;			return !shadowAccumulator.isEmpty();		}	}