Package org.aspectj.weaver.bcel
Class BcelShadow
java.lang.Object
org.aspectj.weaver.Shadow
org.aspectj.weaver.bcel.BcelShadow
-
Nested Class Summary
Nested classes/interfaces inherited from class org.aspectj.weaver.Shadow
Shadow.Kind
-
Field Summary
Fields inherited from class org.aspectj.weaver.Shadow
ADVICE_EXECUTION, AdviceExecution, AdviceExecutionBit, ALL_SHADOW_KINDS_BITS, CONSTRUCTOR_CALL, CONSTRUCTOR_EXECUTION, ConstructorCall, ConstructorCallBit, ConstructorExecution, ConstructorExecutionBit, enclosingShadow, EXCEPTION_HANDLER, ExceptionHandler, ExceptionHandlerBit, FIELD_GET, FIELD_SET, FieldGet, FieldGetBit, FieldSet, FieldSetBit, Initialization, INITIALIZATION, InitializationBit, MAX_SHADOW_KIND, METHOD_CALL, METHOD_EXECUTION, MethodCall, MethodCallBit, MethodExecution, MethodExecutionBit, mungers, needAroundClosureStacking, NO_SHADOW_KINDS_BITS, PreInitialization, PREINITIALIZATION, PreInitializationBit, SHADOW_KINDS, shadowId, StaticInitialization, STATICINITIALIZATION, StaticInitializationBit, SYNCHRONIZATION_LOCK, SYNCHRONIZATION_UNLOCK, SynchronizationLock, SynchronizationLockBit, SynchronizationUnlock, SynchronizationUnlockBit
-
Constructor Summary
ConstructorDescriptionBcelShadow(BcelWorld world, Shadow.Kind kind, Member signature, LazyMethodGen enclosingMethod, BcelShadow enclosingShadow)
This generates an unassociated shadow, rooted in a particular method but not rooted to any particular point in the code. -
Method Summary
Modifier and TypeMethodDescriptionvoid
addAdvicePreventingLazyTjp(org.aspectj.weaver.bcel.BcelAdvice advice)
boolean
Is arg0 occupied with the value of thiscopyInto(LazyMethodGen recipient, BcelShadow enclosing)
void
ensureInitializedArgVar(int argNumber)
genTempVar(UnresolvedType utype)
genTempVar(UnresolvedType typeX, String localName)
protected ResolvedType[]
getAnnotations(ResolvedMember foundMember, Member relevantMember, ResolvedType relevantType)
getArgAnnotationVar(int i, UnresolvedType forAnnotationType)
getArgVar(int i)
getKindedAnnotationVar(UnresolvedType forAnnotationType)
org.aspectj.weaver.bcel.ShadowRange
getRange()
protected ResolvedMember
getRelevantMember(ResolvedMember foundMember, Member relevantMember, ResolvedType relevantType)
int
getTargetAnnotationVar(UnresolvedType forAnnotationType)
a var referencing the targetgetThisAnnotationVar(UnresolvedType forAnnotationType)
getThisAspectInstanceVar(ResolvedType aspectType)
Get the Var for the enclosingJpStaticPartgetThisJoinPointStaticPartBcelVar(boolean isEnclosingJp)
Get the Var for the xxxxJpStaticPart, xxx = this or enclosinga var referencing thisgetWithinAnnotationVar(UnresolvedType forAnnotationType)
getWithinCodeAnnotationVar(UnresolvedType forAnnotationType)
getWorld()
void
init()
void
Initialize all the available arguments at the shadow.void
void
By determining what "kind" of shadow we are, we can find out the annotations on the appropriate element (method, field, constructor, type).void
void
void
void
void
void
boolean
static BcelShadow
makeAdviceExecution(BcelWorld world, LazyMethodGen enclosingMethod)
static BcelShadow
makeArrayConstructorCall(BcelWorld world, LazyMethodGen enclosingMethod, InstructionHandle arrayInstruction, BcelShadow enclosingShadow)
static BcelShadow
makeConstructorCall(BcelWorld world, LazyMethodGen enclosingMethod, InstructionHandle callHandle, BcelShadow enclosingShadow)
static BcelShadow
makeConstructorExecution(BcelWorld world, LazyMethodGen enclosingMethod, InstructionHandle justBeforeStart)
static BcelShadow
makeExceptionHandler(BcelWorld world, ExceptionRange exceptionRange, LazyMethodGen enclosingMethod, InstructionHandle startOfHandler, BcelShadow enclosingShadow)
Make the shadow for an exception handler.static BcelShadow
makeFieldGet(BcelWorld world, ResolvedMember field, LazyMethodGen enclosingMethod, InstructionHandle getHandle, BcelShadow enclosingShadow)
static BcelShadow
makeFieldSet(BcelWorld world, ResolvedMember field, LazyMethodGen enclosingMethod, InstructionHandle setHandle, BcelShadow enclosingShadow)
static BcelShadow
makeIfaceInitialization(BcelWorld world, LazyMethodGen constructor, Member interfaceConstructorSignature)
create an init join point associated w/ an interface in the body of a constructorstatic BcelShadow
makeMethodCall(BcelWorld world, LazyMethodGen enclosingMethod, InstructionHandle callHandle, BcelShadow enclosingShadow)
static BcelShadow
makeMethodExecution(BcelWorld world, LazyMethodGen enclosingMethod)
static BcelShadow
makeMethodExecution(BcelWorld world, LazyMethodGen enclosingMethod, boolean lazyInit)
static BcelShadow
makeMonitorEnter(BcelWorld world, LazyMethodGen enclosingMethod, InstructionHandle monitorInstruction, BcelShadow enclosingShadow)
static BcelShadow
makeMonitorExit(BcelWorld world, LazyMethodGen enclosingMethod, InstructionHandle monitorInstruction, BcelShadow enclosingShadow)
static BcelShadow
makeShadowForMethod(BcelWorld world, LazyMethodGen enclosingMethod, Shadow.Kind kind, Member sig)
static BcelShadow
makeShadowForMethodCall(BcelWorld world, LazyMethodGen enclosingMethod, InstructionHandle callHandle, BcelShadow enclosingShadow, Shadow.Kind kind, ResolvedMember sig)
static BcelShadow
makeStaticInitialization(BcelWorld world, LazyMethodGen enclosingMethod)
static BcelShadow
makeUnfinishedInitialization(BcelWorld world, LazyMethodGen constructor)
Create an initialization join point associated with a constructor, but not with any body of code yet.static BcelShadow
makeUnfinishedPreinitialization(BcelWorld world, LazyMethodGen constructor)
protected void
Prepare the shadow for implementation.void
requireThisJoinPoint(boolean hasGuardTest, boolean isAround)
static void
void
setActualTargetType(String className)
void
setRange(org.aspectj.weaver.bcel.ShadowRange range)
boolean
If the end of my range has no real instructions following then my context needs a return at the end.void
weaveAfter(org.aspectj.weaver.bcel.BcelAdvice munger)
void
weaveAfterReturning(org.aspectj.weaver.bcel.BcelAdvice munger)
The basic strategy here is to add a set of instructions at the end of the shadow range that dispatch the advice, and then return whatever the shadow was going to return anyway.void
weaveAfterThrowing(org.aspectj.weaver.bcel.BcelAdvice munger, UnresolvedType catchType)
void
weaveAroundClosure(org.aspectj.weaver.bcel.BcelAdvice munger, boolean hasDynamicTest)
void
weaveAroundInline(org.aspectj.weaver.bcel.BcelAdvice munger, boolean hasDynamicTest)
void
weaveCflowEntry(org.aspectj.weaver.bcel.BcelAdvice munger, Member cflowField)
void
weavePerObjectEntry(org.aspectj.weaver.bcel.BcelAdvice munger, BcelVar onVar)
void
weavePerTypeWithinAspectInitialization(org.aspectj.weaver.bcel.BcelAdvice munger, UnresolvedType t)
Causes the aspect instance to be *set* for later retrievable through localAspectof()/aspectOf()void
weaveSoftener(org.aspectj.weaver.bcel.BcelAdvice munger, UnresolvedType catchType)
Methods inherited from class org.aspectj.weaver.Shadow
addMunger, checkCanThrow, checkMunger, getArgCount, getArgType, getArgTypes, getArgumentTypesForArrayConstructionShadow, getGenericArgTypes, getKind, getMatchingSignature, getMungers, getResolvedSignature, getReturnType, getSignature, getTargetType, getThisType, hasTarget, hasThis, howMany, implement, isShadowForArrayConstructionJoinpoint, isShadowForMonitor, setMatchingSignature, toResolvedString, toSet, toString
-
Field Details
-
appliedLazyTjpOptimization
public static boolean appliedLazyTjpOptimization
-
-
Constructor Details
-
BcelShadow
public BcelShadow(BcelWorld world, Shadow.Kind kind, Member signature, LazyMethodGen enclosingMethod, BcelShadow enclosingShadow)This generates an unassociated shadow, rooted in a particular method but not rooted to any particular point in the code. It should be given to a rooted ShadowRange in theShadowRange.associateWithShadow(BcelShadow)
method.
-
-
Method Details
-
copyInto
-
getIWorld
-
addAdvicePreventingLazyTjp
public void addAdvicePreventingLazyTjp(org.aspectj.weaver.bcel.BcelAdvice advice) -
prepareForMungers
protected void prepareForMungers()Description copied from class:Shadow
Prepare the shadow for implementation. After this is done, the shadow should be in such a position that each munger simply needs to be implemented.- Overrides:
prepareForMungers
in classShadow
-
getRange
public org.aspectj.weaver.bcel.ShadowRange getRange() -
setRange
public void setRange(org.aspectj.weaver.bcel.ShadowRange range) -
getSourceLine
public int getSourceLine() -
getEnclosingType
- Specified by:
getEnclosingType
in classShadow
-
getEnclosingClass
-
getWorld
-
makeConstructorExecution
public static BcelShadow makeConstructorExecution(BcelWorld world, LazyMethodGen enclosingMethod, InstructionHandle justBeforeStart) -
makeStaticInitialization
-
makeExceptionHandler
public static BcelShadow makeExceptionHandler(BcelWorld world, ExceptionRange exceptionRange, LazyMethodGen enclosingMethod, InstructionHandle startOfHandler, BcelShadow enclosingShadow)Make the shadow for an exception handler. Currently makes an empty shadow that only allows before advice to be woven into it. -
makeIfaceInitialization
public static BcelShadow makeIfaceInitialization(BcelWorld world, LazyMethodGen constructor, Member interfaceConstructorSignature)create an init join point associated w/ an interface in the body of a constructor -
initIfaceInitializer
-
makeUnfinishedInitialization
Create an initialization join point associated with a constructor, but not with any body of code yet. If this is actually matched, its range will be set when we inline self constructors.- Parameters:
constructor
- The constructor starting this initialization.
-
makeUnfinishedPreinitialization
public static BcelShadow makeUnfinishedPreinitialization(BcelWorld world, LazyMethodGen constructor) -
makeMethodExecution
public static BcelShadow makeMethodExecution(BcelWorld world, LazyMethodGen enclosingMethod, boolean lazyInit) -
init
public void init() -
makeMethodExecution
-
makeShadowForMethod
public static BcelShadow makeShadowForMethod(BcelWorld world, LazyMethodGen enclosingMethod, Shadow.Kind kind, Member sig) -
makeAdviceExecution
-
makeConstructorCall
public static BcelShadow makeConstructorCall(BcelWorld world, LazyMethodGen enclosingMethod, InstructionHandle callHandle, BcelShadow enclosingShadow) -
makeArrayConstructorCall
public static BcelShadow makeArrayConstructorCall(BcelWorld world, LazyMethodGen enclosingMethod, InstructionHandle arrayInstruction, BcelShadow enclosingShadow) -
makeMonitorEnter
public static BcelShadow makeMonitorEnter(BcelWorld world, LazyMethodGen enclosingMethod, InstructionHandle monitorInstruction, BcelShadow enclosingShadow) -
makeMonitorExit
public static BcelShadow makeMonitorExit(BcelWorld world, LazyMethodGen enclosingMethod, InstructionHandle monitorInstruction, BcelShadow enclosingShadow) -
makeMethodCall
public static BcelShadow makeMethodCall(BcelWorld world, LazyMethodGen enclosingMethod, InstructionHandle callHandle, BcelShadow enclosingShadow) -
makeShadowForMethodCall
public static BcelShadow makeShadowForMethodCall(BcelWorld world, LazyMethodGen enclosingMethod, InstructionHandle callHandle, BcelShadow enclosingShadow, Shadow.Kind kind, ResolvedMember sig) -
makeFieldGet
public static BcelShadow makeFieldGet(BcelWorld world, ResolvedMember field, LazyMethodGen enclosingMethod, InstructionHandle getHandle, BcelShadow enclosingShadow) -
makeFieldSet
public static BcelShadow makeFieldSet(BcelWorld world, ResolvedMember field, LazyMethodGen enclosingMethod, InstructionHandle setHandle, BcelShadow enclosingShadow) -
retargetAllBranches
-
terminatesWithReturn
public boolean terminatesWithReturn()If the end of my range has no real instructions following then my context needs a return at the end. -
arg0HoldsThis
public boolean arg0HoldsThis()Is arg0 occupied with the value of this -
getThisVar
Description copied from class:Shadow
a var referencing this- Specified by:
getThisVar
in classShadow
-
getThisAnnotationVar
- Specified by:
getThisAnnotationVar
in classShadow
-
getTargetVar
Description copied from class:Shadow
a var referencing the target- Specified by:
getTargetVar
in classShadow
-
getTargetAnnotationVar
- Specified by:
getTargetAnnotationVar
in classShadow
-
getArgVar
-
getArgAnnotationVar
- Specified by:
getArgAnnotationVar
in classShadow
-
getKindedAnnotationVar
- Specified by:
getKindedAnnotationVar
in classShadow
-
getWithinAnnotationVar
- Specified by:
getWithinAnnotationVar
in classShadow
-
getWithinCodeAnnotationVar
- Specified by:
getWithinCodeAnnotationVar
in classShadow
-
getThisJoinPointStaticPartVar
- Specified by:
getThisJoinPointStaticPartVar
in classShadow
-
getThisEnclosingJoinPointStaticPartVar
- Specified by:
getThisEnclosingJoinPointStaticPartVar
in classShadow
-
requireThisJoinPoint
public void requireThisJoinPoint(boolean hasGuardTest, boolean isAround) -
getThisJoinPointVar
- Specified by:
getThisJoinPointVar
in classShadow
-
getThisJoinPointStaticPartBcelVar
-
getThisAspectInstanceVar
- Specified by:
getThisAspectInstanceVar
in classShadow
-
getThisJoinPointStaticPartBcelVar
Get the Var for the xxxxJpStaticPart, xxx = this or enclosing- Parameters:
isEnclosingJp
- true to have the enclosingJpStaticPart- Returns:
-
getThisEnclosingJoinPointStaticPartBcelVar
Get the Var for the enclosingJpStaticPart- Returns:
-
getEnclosingCodeSignature
- Specified by:
getEnclosingCodeSignature
in classShadow
-
getRealEnclosingCodeSignature
-
initializeTargetVar
public void initializeTargetVar() -
ensureTargetTypeIsCorrect
-
ensureInitializedArgVar
public void ensureInitializedArgVar(int argNumber) -
initializeArgVars
public void initializeArgVars()Initialize all the available arguments at the shadow. This means creating a copy of them that we can then use for advice calls (the copy ensures we are not affected by other advice changing the values). This method initializes all arguments whereas the method ensureInitializedArgVar will only ensure a single argument is setup. -
initializeForAroundClosure
public void initializeForAroundClosure() -
initializeThisAnnotationVars
public void initializeThisAnnotationVars() -
initializeTargetAnnotationVars
public void initializeTargetAnnotationVars() -
getRelevantMember
protected ResolvedMember getRelevantMember(ResolvedMember foundMember, Member relevantMember, ResolvedType relevantType) -
getAnnotations
protected ResolvedType[] getAnnotations(ResolvedMember foundMember, Member relevantMember, ResolvedType relevantType) -
initializeKindedAnnotationVars
public void initializeKindedAnnotationVars()By determining what "kind" of shadow we are, we can find out the annotations on the appropriate element (method, field, constructor, type). Then create one BcelVar entry in the map for each annotation, keyed by annotation type. -
initializeWithinAnnotationVars
public void initializeWithinAnnotationVars() -
initializeWithinCodeAnnotationVars
public void initializeWithinCodeAnnotationVars() -
weaveAfter
public void weaveAfter(org.aspectj.weaver.bcel.BcelAdvice munger) -
weaveAfterReturning
public void weaveAfterReturning(org.aspectj.weaver.bcel.BcelAdvice munger)The basic strategy here is to add a set of instructions at the end of the shadow range that dispatch the advice, and then return whatever the shadow was going to return anyway. To achieve this, we note all the return statements in the advice, and replace them with code that: 1) stores the return value on top of the stack in a temp var 2) jumps to the start of our advice block 3) restores the return value at the end of the advice block before ultimately returning We also need to bind the return value into a returning parameter, if the advice specified one. -
weaveAfterThrowing
public void weaveAfterThrowing(org.aspectj.weaver.bcel.BcelAdvice munger, UnresolvedType catchType) -
weaveSoftener
-
weavePerObjectEntry
-
weavePerTypeWithinAspectInitialization
public void weavePerTypeWithinAspectInitialization(org.aspectj.weaver.bcel.BcelAdvice munger, UnresolvedType t)Causes the aspect instance to be *set* for later retrievable through localAspectof()/aspectOf() -
weaveCflowEntry
-
weaveAroundInline
public void weaveAroundInline(org.aspectj.weaver.bcel.BcelAdvice munger, boolean hasDynamicTest) -
weaveAroundClosure
public void weaveAroundClosure(org.aspectj.weaver.bcel.BcelAdvice munger, boolean hasDynamicTest) -
genTempVar
-
genTempVar
-
getFactory
-
getSourceLocation
- Specified by:
getSourceLocation
in classShadow
-
getEnclosingShadow
-
getEnclosingMethod
-
isFallsThrough
public boolean isFallsThrough() -
setActualTargetType
-
getActualTargetType
-