controlflowgraph.java
来自「纯java操作系统jnode,安装简单和操作简单的个人使用的Java操作系统」· Java 代码 · 共 80 行
JAVA
80 行
/**
* $Id: ControlFlowGraph.java,v 1.2 2003/12/10 08:39:46 epr Exp $
*/
package org.jnode.vm.bytecode;
import java.util.Iterator;
import org.jnode.util.ObjectArrayIterator;
import org.jnode.vm.VmSystemObject;
import org.jnode.vm.classmgr.VmByteCode;
/**
* Determine and maintain the flow of control through a bytecode method.
*
* @author epr
*/
public class ControlFlowGraph extends VmSystemObject {
private final byte[] opcodeFlags;
private final BasicBlock[] bblocks;
/**
* Create a new instance
* @param bytecode
*/
public ControlFlowGraph(VmByteCode bytecode) {
// First determine the basic blocks
final BasicBlockFinder bbf = new BasicBlockFinder();
BytecodeParser.parse(bytecode, bbf);
this.bblocks = bbf.createBasicBlocks();
this.opcodeFlags = bbf.getOpcodeFlags();
}
/**
* Create an iterator to iterate over all basic blocks.
* @return An iterator that will return instances of BasicBlock.
*/
public Iterator basicBlockIterator() {
return new ObjectArrayIterator(bblocks);
}
/**
* Gets the basic block that contains the given address.
* @param pc
* @return
*/
public BasicBlock getBasicBlock(int pc) {
final int max = bblocks.length;
for (int i = 0; i < max; i++) {
final BasicBlock bb = bblocks[i];
if (bb.contains(pc)) {
return bb;
}
}
return null;
}
/**
* Is a given combination of opcode flags set for a given bytecode address.
* @param address
* @param flags
* @return boolean
* @see BytecodeFlags
*/
public final boolean isOpcodeFlagSet(int address, int flags) {
return ((opcodeFlags[address] & flags) == flags);
}
/**
* Get the opcode flags set for a given bytecode address.
* @param address
* @return int
* @see BytecodeFlags
*/
public final int getOpcodeFlags(int address) {
return opcodeFlags[address];
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?