Package proguard.evaluation.util
Class DebugPrinter
- java.lang.Object
-
- proguard.evaluation.util.DebugPrinter
-
- All Implemented Interfaces:
PartialEvaluatorStateTracker
public class DebugPrinter extends java.lang.Object implements PartialEvaluatorStateTracker
-
-
Constructor Summary
Constructors Constructor Description DebugPrinter(boolean printDebugInfo, boolean printDebugResults)
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description void
afterInstructionEvaluation(Clazz clazz, Method method, int instructionOffset, Instruction instruction, TracedVariables variablesAfter, TracedStack stackAfter, BasicBranchUnit branchUnit, InstructionOffsetValue branchTarget)
The instruction is evaluated and branching information is obtained.void
definitiveBranch(Clazz clazz, Method method, int instructionOffset, Instruction instruction, TracedVariables variablesAfter, TracedStack stackAfter, InstructionOffsetValue branchTargets)
The instruction causes a definitive branch.void
endSubroutine(Clazz clazz, Method method, TracedVariables variablesAfter, TracedStack stackAfter, int subroutineStart, int subroutineEnd)
The evaluation and generalization of the subroutine is done, the partial evaluator moves on.void
evaluationResults(Clazz clazz, Method method, CodeAttribute codeAttribute, PartialEvaluator evaluator)
Partial evaluator is done evaluating the code attribute.void
generalizeInstructionBlock(Clazz clazz, Method method, int instructionOffset, Instruction instruction, TracedVariables variablesBefore, TracedStack stackBefore, int evaluationCount)
The instruction has been seen a certain number of times and the evaluator deems it time to start generalizing the instruction.void
generalizeSubroutine(Clazz clazz, Method method, TracedVariables startVariables, TracedStack startStack, int subroutineStart, int subroutineEnd)
The partial evaluator will start generalizing the results of the evaluated subroutine.void
instructionBlockDone(Clazz clazz, Method method, CodeAttribute codeAttribute, TracedVariables startVariables, TracedStack startStack, int startOffset)
An instruction block has been evaluated.void
registerAlternativeBranch(Clazz clazz, Method method, int fromInstructionOffset, Instruction fromInstruction, TracedVariables variablesAfter, TracedStack stackAfter, int branchIndex, int branchTargetCount, int offset)
The evaluator detects multiple branches need to be evaluated.void
registerException(Clazz clazz, Method method, CodeAttribute codeAttribute, PartialEvaluator evaluator, java.lang.Throwable cause)
An exception has been thrown while evaluating the current code attribute.void
registerExceptionHandler(Clazz clazz, Method method, int startPC, int endPC, ExceptionInfo info)
Partial evaluator starts evaluating a specific exception handler.void
registerSubroutineReturn(Clazz clazz, Method method, int returnOffset, TracedVariables returnVariables, TracedStack returnStack)
The current instruction was RET and the partial evaluator pushes the return address to the branch stack of the calling partial evaluator.void
registerUnusedExceptionHandler(Clazz clazz, Method method, int startPC, int endPC, ExceptionInfo info)
Partial evaluator detects that the evaluation of the exception handler over a certain range is not needed.void
skipInstructionBlock(Clazz clazz, Method method, int instructionOffset, Instruction instruction, TracedVariables variablesBefore, TracedStack stackBefore, int evaluationCount)
The instruction within this instruction block has been seen with the those variables and this stack, and thus it is not needed to evaluate this block any further.void
startBranchCodeBlockEvaluation(java.util.List<PartialEvaluator.InstructionBlock> branchStack)
Evaluation of the first general block has been done.void
startCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, Variables parameters)
The partial evaluator starts with the evaluation of a code block.void
startExceptionHandlingForBlock(Clazz clazz, Method method, int startOffset, int endOffset)
Partial evaluator starts evaluating the exceptions handlers that catch over a certain instruction range.void
startInstructionBlock(Clazz clazz, Method method, CodeAttribute codeAttribute, TracedVariables startVariables, TracedStack startStack, int startOffset)
Partial evaluator starts evaluating an instruction block, specified by an instruction range within the code attribute and the variables and stack it would start with.void
startInstructionEvaluation(Clazz clazz, Method method, int instructionOffset, Instruction instruction, TracedVariables variablesBefore, TracedStack stackBefore, int evaluationCount)
The partial evaluator will forward the evaluation of the instruction.void
startSubroutine(Clazz clazz, Method method, TracedVariables startVariables, TracedStack startStack, int subroutineStart, int subroutineEnd)
The current instruction was JSR or JSR_W and the partial evaluator starts with the evaluation of the subroutine.
-
-
-
Method Detail
-
startCodeAttribute
public void startCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, Variables parameters)
Description copied from interface:PartialEvaluatorStateTracker
The partial evaluator starts with the evaluation of a code block.- Specified by:
startCodeAttribute
in interfacePartialEvaluatorStateTracker
-
registerException
public void registerException(Clazz clazz, Method method, CodeAttribute codeAttribute, PartialEvaluator evaluator, java.lang.Throwable cause)
Description copied from interface:PartialEvaluatorStateTracker
An exception has been thrown while evaluating the current code attribute.- Specified by:
registerException
in interfacePartialEvaluatorStateTracker
-
startExceptionHandlingForBlock
public void startExceptionHandlingForBlock(Clazz clazz, Method method, int startOffset, int endOffset)
Description copied from interface:PartialEvaluatorStateTracker
Partial evaluator starts evaluating the exceptions handlers that catch over a certain instruction range.- Specified by:
startExceptionHandlingForBlock
in interfacePartialEvaluatorStateTracker
-
registerExceptionHandler
public void registerExceptionHandler(Clazz clazz, Method method, int startPC, int endPC, ExceptionInfo info)
Description copied from interface:PartialEvaluatorStateTracker
Partial evaluator starts evaluating a specific exception handler.- Specified by:
registerExceptionHandler
in interfacePartialEvaluatorStateTracker
-
registerUnusedExceptionHandler
public void registerUnusedExceptionHandler(Clazz clazz, Method method, int startPC, int endPC, ExceptionInfo info)
Description copied from interface:PartialEvaluatorStateTracker
Partial evaluator detects that the evaluation of the exception handler over a certain range is not needed. For example when the exceptionType can not be thrown from with the instruction range.- Specified by:
registerUnusedExceptionHandler
in interfacePartialEvaluatorStateTracker
-
evaluationResults
public void evaluationResults(Clazz clazz, Method method, CodeAttribute codeAttribute, PartialEvaluator evaluator)
Description copied from interface:PartialEvaluatorStateTracker
Partial evaluator is done evaluating the code attribute. You can extract the results straight from the evaluator.- Specified by:
evaluationResults
in interfacePartialEvaluatorStateTracker
-
startInstructionBlock
public void startInstructionBlock(Clazz clazz, Method method, CodeAttribute codeAttribute, TracedVariables startVariables, TracedStack startStack, int startOffset)
Description copied from interface:PartialEvaluatorStateTracker
Partial evaluator starts evaluating an instruction block, specified by an instruction range within the code attribute and the variables and stack it would start with.- Specified by:
startInstructionBlock
in interfacePartialEvaluatorStateTracker
-
startBranchCodeBlockEvaluation
public void startBranchCodeBlockEvaluation(java.util.List<PartialEvaluator.InstructionBlock> branchStack)
Description copied from interface:PartialEvaluatorStateTracker
Evaluation of the first general block has been done. The evaluator now starts evaluating the blocks generated by branch instructions and will do this in a stack like behaviour.- Specified by:
startBranchCodeBlockEvaluation
in interfacePartialEvaluatorStateTracker
-
instructionBlockDone
public void instructionBlockDone(Clazz clazz, Method method, CodeAttribute codeAttribute, TracedVariables startVariables, TracedStack startStack, int startOffset)
Description copied from interface:PartialEvaluatorStateTracker
An instruction block has been evaluated.- Specified by:
instructionBlockDone
in interfacePartialEvaluatorStateTracker
-
skipInstructionBlock
public void skipInstructionBlock(Clazz clazz, Method method, int instructionOffset, Instruction instruction, TracedVariables variablesBefore, TracedStack stackBefore, int evaluationCount)
Description copied from interface:PartialEvaluatorStateTracker
The instruction within this instruction block has been seen with the those variables and this stack, and thus it is not needed to evaluate this block any further.- Specified by:
skipInstructionBlock
in interfacePartialEvaluatorStateTracker
-
generalizeInstructionBlock
public void generalizeInstructionBlock(Clazz clazz, Method method, int instructionOffset, Instruction instruction, TracedVariables variablesBefore, TracedStack stackBefore, int evaluationCount)
Description copied from interface:PartialEvaluatorStateTracker
The instruction has been seen a certain number of times and the evaluator deems it time to start generalizing the instruction.- Specified by:
generalizeInstructionBlock
in interfacePartialEvaluatorStateTracker
-
startInstructionEvaluation
public void startInstructionEvaluation(Clazz clazz, Method method, int instructionOffset, Instruction instruction, TracedVariables variablesBefore, TracedStack stackBefore, int evaluationCount)
Description copied from interface:PartialEvaluatorStateTracker
The partial evaluator will forward the evaluation of the instruction. An exception right after this state is likely.- Specified by:
startInstructionEvaluation
in interfacePartialEvaluatorStateTracker
-
afterInstructionEvaluation
public void afterInstructionEvaluation(Clazz clazz, Method method, int instructionOffset, Instruction instruction, TracedVariables variablesAfter, TracedStack stackAfter, BasicBranchUnit branchUnit, InstructionOffsetValue branchTarget)
Description copied from interface:PartialEvaluatorStateTracker
The instruction is evaluated and branching information is obtained.- Specified by:
afterInstructionEvaluation
in interfacePartialEvaluatorStateTracker
-
definitiveBranch
public void definitiveBranch(Clazz clazz, Method method, int instructionOffset, Instruction instruction, TracedVariables variablesAfter, TracedStack stackAfter, InstructionOffsetValue branchTargets)
Description copied from interface:PartialEvaluatorStateTracker
The instruction causes a definitive branch. This means the partial evaluator discovered a jump is used and is sure what the next instruction will be. This next instruction will be evaluated next and within the same instructionBlock evaluation.- Specified by:
definitiveBranch
in interfacePartialEvaluatorStateTracker
-
registerAlternativeBranch
public void registerAlternativeBranch(Clazz clazz, Method method, int fromInstructionOffset, Instruction fromInstruction, TracedVariables variablesAfter, TracedStack stackAfter, int branchIndex, int branchTargetCount, int offset)
Description copied from interface:PartialEvaluatorStateTracker
The evaluator detects multiple branches need to be evaluated. It adds these block evaluations to a stack of blocks that still need to be evaluated. After all branches have been registered, the evaluator exits the evaluation of the current instruction block.- Specified by:
registerAlternativeBranch
in interfacePartialEvaluatorStateTracker
-
startSubroutine
public void startSubroutine(Clazz clazz, Method method, TracedVariables startVariables, TracedStack startStack, int subroutineStart, int subroutineEnd)
Description copied from interface:PartialEvaluatorStateTracker
The current instruction was JSR or JSR_W and the partial evaluator starts with the evaluation of the subroutine.- Specified by:
startSubroutine
in interfacePartialEvaluatorStateTracker
-
registerSubroutineReturn
public void registerSubroutineReturn(Clazz clazz, Method method, int returnOffset, TracedVariables returnVariables, TracedStack returnStack)
Description copied from interface:PartialEvaluatorStateTracker
The current instruction was RET and the partial evaluator pushes the return address to the branch stack of the calling partial evaluator.- Specified by:
registerSubroutineReturn
in interfacePartialEvaluatorStateTracker
-
generalizeSubroutine
public void generalizeSubroutine(Clazz clazz, Method method, TracedVariables startVariables, TracedStack startStack, int subroutineStart, int subroutineEnd)
Description copied from interface:PartialEvaluatorStateTracker
The partial evaluator will start generalizing the results of the evaluated subroutine.- Specified by:
generalizeSubroutine
in interfacePartialEvaluatorStateTracker
-
endSubroutine
public void endSubroutine(Clazz clazz, Method method, TracedVariables variablesAfter, TracedStack stackAfter, int subroutineStart, int subroutineEnd)
Description copied from interface:PartialEvaluatorStateTracker
The evaluation and generalization of the subroutine is done, the partial evaluator moves on.- Specified by:
endSubroutine
in interfacePartialEvaluatorStateTracker
-
-