本文整理汇总了Java中proguard.classfile.instruction.InstructionConstants.OP_GOTO_W属性的典型用法代码示例。如果您正苦于以下问题:Java InstructionConstants.OP_GOTO_W属性的具体用法?Java InstructionConstants.OP_GOTO_W怎么用?Java InstructionConstants.OP_GOTO_W使用的例子?那么, 这里精选的属性代码示例或许可以为您提供帮助。您也可以进一步了解该属性所在类proguard.classfile.instruction.InstructionConstants
的用法示例。
在下文中一共展示了InstructionConstants.OP_GOTO_W属性的8个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Java代码示例。
示例1: visitBranchInstruction
public void visitBranchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, BranchInstruction branchInstruction)
{
switch (branchInstruction.opcode)
{
case InstructionConstants.OP_GOTO:
case InstructionConstants.OP_GOTO_W:
// Don't replace unconditional branches.
break;
case InstructionConstants.OP_JSR:
case InstructionConstants.OP_JSR_W:
replaceJsrInstruction(clazz, offset, branchInstruction);
break;
default:
replaceBranchInstruction(clazz, offset, branchInstruction);
break;
}
}
示例2: visitBranchInstruction
public void visitBranchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, BranchInstruction branchInstruction)
{
byte opcode = branchInstruction.opcode;
// Evaluate the target instruction blocks.
evaluateInstructionBlock(clazz,
method,
codeAttribute,
offset +
branchInstruction.branchOffset);
// Evaluate the instructions after a subroutine branch.
if (opcode == InstructionConstants.OP_JSR ||
opcode == InstructionConstants.OP_JSR_W)
{
// We assume subroutine calls (jsr and jsr_w instructions) don't
// change the stack, other than popping the return value.
stackSize -= 1;
evaluateInstructionBlock(clazz,
method,
codeAttribute,
offset + branchInstruction.length(offset));
}
// Some branch instructions always end the current instruction block.
exitInstructionBlock =
opcode == InstructionConstants.OP_GOTO ||
opcode == InstructionConstants.OP_GOTO_W ||
opcode == InstructionConstants.OP_JSR ||
opcode == InstructionConstants.OP_JSR_W;
}
示例3: visitBranchInstruction
public void visitBranchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, BranchInstruction branchInstruction)
{
// Mark the branch target.
markBranchTarget(clazz,
method,
codeAttribute,
offset + branchInstruction.branchOffset);
byte opcode = branchInstruction.opcode;
if (opcode == InstructionConstants.OP_GOTO ||
opcode == InstructionConstants.OP_GOTO_W)
{
next = false;
}
}
示例4: visitBranchInstruction
public void visitBranchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, BranchInstruction branchInstruction)
{
// Mark the branch origin.
markBranchOrigin(offset);
// Check if this is the first instruction of a subroutine.
checkSubroutine(offset);
// Mark the branch target.
markBranchTarget(offset, branchInstruction.branchOffset);
byte opcode = branchInstruction.opcode;
if (opcode == InstructionConstants.OP_JSR ||
opcode == InstructionConstants.OP_JSR_W)
{
// Mark the subroutine invocation.
instructionMarks[offset] |= SUBROUTINE_INVOCATION;
// Mark the subroutine start.
int targetOffset = offset + branchInstruction.branchOffset;
subroutineStarts[targetOffset] = targetOffset;
}
else if (opcode == InstructionConstants.OP_GOTO ||
opcode == InstructionConstants.OP_GOTO_W)
{
// Mark the next instruction.
markAfterBranchOrigin(offset + branchInstruction.length(offset));
}
}
示例5: visitBranchInstruction
public void visitBranchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, BranchInstruction branchInstruction)
{
// Check if the instruction is an unconditional goto instruction.
byte opcode = branchInstruction.opcode;
if (opcode == InstructionConstants.OP_GOTO ||
opcode == InstructionConstants.OP_GOTO_W)
{
// Check if the goto instruction points to a return instruction.
int targetOffset = offset + branchInstruction.branchOffset;
if (!codeAttributeEditor.isModified(offset) &&
!codeAttributeEditor.isModified(targetOffset))
{
Instruction targetInstruction = InstructionFactory.create(codeAttribute.code,
targetOffset);
switch (targetInstruction.opcode)
{
case InstructionConstants.OP_IRETURN:
case InstructionConstants.OP_LRETURN:
case InstructionConstants.OP_FRETURN:
case InstructionConstants.OP_DRETURN:
case InstructionConstants.OP_ARETURN:
case InstructionConstants.OP_RETURN:
// Replace the goto instruction by the return instruction.
Instruction returnInstruction =
new SimpleInstruction(targetInstruction.opcode);
codeAttributeEditor.replaceInstruction(offset,
returnInstruction);
// Visit the instruction, if required.
if (extraInstructionVisitor != null)
{
extraInstructionVisitor.visitBranchInstruction(clazz, method, codeAttribute, offset, branchInstruction);
}
break;
}
}
}
}
示例6: visitSimpleInstruction
public void visitSimpleInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, SimpleInstruction simpleInstruction)
{
// Are we inlining this instruction?
if (inlining)
{
// Replace any return instructions by branches to the end of the code.
switch (simpleInstruction.opcode)
{
case InstructionConstants.OP_IRETURN:
case InstructionConstants.OP_LRETURN:
case InstructionConstants.OP_FRETURN:
case InstructionConstants.OP_DRETURN:
case InstructionConstants.OP_ARETURN:
case InstructionConstants.OP_RETURN:
// Are we not at the last instruction?
if (offset < codeAttribute.u4codeLength-1)
{
// Replace the return instruction by a branch instruction.
Instruction branchInstruction =
new BranchInstruction(InstructionConstants.OP_GOTO_W,
codeAttribute.u4codeLength - offset);
codeAttributeComposer.appendInstruction(offset,
branchInstruction.shrink());
}
else
{
// Just leave out the instruction, but put in a label,
// for the sake of any other branch instructions.
codeAttributeComposer.appendLabel(offset);
}
return;
}
}
codeAttributeComposer.appendInstruction(offset, simpleInstruction.shrink());
}
示例7: visitBranchInstruction
public void visitBranchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, BranchInstruction branchInstruction)
{
// Check if the instruction is an unconditional goto instruction.
byte opcode = branchInstruction.opcode;
if (opcode == InstructionConstants.OP_GOTO ||
opcode == InstructionConstants.OP_GOTO_W)
{
// Check if the goto instruction points to another simple goto
// instruction.
int branchOffset = branchInstruction.branchOffset;
int targetOffset = offset + branchOffset;
if (branchOffset != branchInstruction.length(offset) &&
!codeAttributeEditor.isModified(offset) &&
!codeAttributeEditor.isModified(targetOffset))
{
Instruction targetInstruction =
InstructionFactory.create(codeAttribute.code, targetOffset);
if (targetInstruction.opcode == InstructionConstants.OP_GOTO)
{
// Simplify the goto instruction.
int targetBranchOffset = ((BranchInstruction)targetInstruction).branchOffset;
Instruction newBranchInstruction =
new BranchInstruction(opcode,
(branchOffset + targetBranchOffset));
codeAttributeEditor.replaceInstruction(offset,
newBranchInstruction);
// Visit the instruction, if required.
if (extraInstructionVisitor != null)
{
extraInstructionVisitor.visitBranchInstruction(clazz, method, codeAttribute, offset, branchInstruction);
}
}
}
}
}
示例8: visitBranchInstruction
public void visitBranchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, BranchInstruction branchInstruction)
{
// Check if the instruction is an unconditional goto instruction that
// isn't the target of a branch itself.
byte opcode = branchInstruction.opcode;
if ((opcode == InstructionConstants.OP_GOTO ||
opcode == InstructionConstants.OP_GOTO_W) &&
!branchTargetFinder.isBranchTarget(offset))
{
int branchOffset = branchInstruction.branchOffset;
int targetOffset = offset + branchOffset;
// Get the number of common bytes.
int commonCount = commonByteCodeCount(codeAttribute, offset, targetOffset);
if (commonCount > 0 &&
!exceptionBoundary(codeAttribute, offset, targetOffset))
{
if (DEBUG)
{
System.out.println("GotoCommonCodeReplacer: "+clazz.getName()+"."+method.getName(clazz)+" (["+(offset-commonCount)+"] - "+branchInstruction.toString(offset)+" -> "+targetOffset+")");
}
// Delete the common instructions.
for (int delta = 0; delta <= commonCount; delta++)
{
int deleteOffset = offset - delta;
if (branchTargetFinder.isInstruction(deleteOffset))
{
codeAttributeEditor.replaceInstruction( deleteOffset, (Instruction)null);
codeAttributeEditor.insertBeforeInstruction(deleteOffset, (Instruction)null);
codeAttributeEditor.insertAfterInstruction( deleteOffset, (Instruction)null);
codeAttributeEditor.deleteInstruction(deleteOffset);
}
}
// Redirect the goto instruction, if it is still necessary.
int newBranchOffset = branchOffset - commonCount;
if (newBranchOffset != branchInstruction.length(offset))
{
Instruction newGotoInstruction =
new BranchInstruction(opcode, newBranchOffset);
codeAttributeEditor.replaceInstruction(offset,
newGotoInstruction);
}
// Visit the instruction, if required.
if (extraInstructionVisitor != null)
{
extraInstructionVisitor.visitBranchInstruction(clazz, method, codeAttribute, offset, branchInstruction);
}
}
}
}