/* * Fernflower - The Analytical Java Decompiler * http://www.reversed-java.com * * (C) 2008 - 2010, Stiver * * This software is NEITHER public domain NOR free software * as per GNU License. See license.txt for more details. * * This software is distributed WITHOUT ANY WARRANTY; without * even the implied warranty of MERCHANTABILITY or FITNESS FOR * A PARTICULAR PURPOSE. */ package org.jetbrains.java.decompiler.code.cfg; import java.util.ArrayList; import java.util.List; import org.jetbrains.java.decompiler.code.Instruction; import org.jetbrains.java.decompiler.code.InstructionSequence; import org.jetbrains.java.decompiler.code.SimpleInstructionSequence; import org.jetbrains.java.decompiler.main.DecompilerContext; import org.jetbrains.java.decompiler.modules.decompiler.decompose.IGraphNode; public class BasicBlock implements IGraphNode { // ***************************************************************************** // public fields // ***************************************************************************** public int id = 0; public int mark = 0; // ***************************************************************************** // private fields // ***************************************************************************** private InstructionSequence seq = new SimpleInstructionSequence(); private List preds = new ArrayList(); private List succs = new ArrayList(); private List instrOldOffsets = new ArrayList(); private List predExceptions = new ArrayList(); private List succExceptions = new ArrayList(); public BasicBlock() {} public BasicBlock(int id) { this.id = id; } // ***************************************************************************** // public methods // ***************************************************************************** public Object clone() { BasicBlock block = new BasicBlock(); block.id = id; block.setSeq(seq.clone()); block.setInstrOldOffsets(new ArrayList(instrOldOffsets)); return block; } public void free() { preds.clear(); succs.clear(); instrOldOffsets.clear(); succExceptions.clear(); seq = new SimpleInstructionSequence(); } public Instruction getInstruction(int index) { return seq.getInstr(index); } public Instruction getLastInstruction() { if(seq.isEmpty()) { return null; } else { return seq.getLastInstr(); } } public int size() { return seq.length(); } public void addPredecessor(BasicBlock block) { preds.add(block); } public void removePredecessor(BasicBlock block) { while(preds.remove(block)); } public void addSuccessor(BasicBlock block) { succs.add(block); block.addPredecessor(this); } public void removeSuccessor(BasicBlock block) { while(succs.remove(block)); block.removePredecessor(this); } // FIXME: unify block comparisons: id or direkt equality public void replaceSuccessor(BasicBlock oldBlock, BasicBlock newBlock) { for(int i=0;i getInstrOldOffsets() { return instrOldOffsets; } public void setInstrOldOffsets(List instrInds) { this.instrOldOffsets = instrInds; } public List getPredecessors() { List lst = new ArrayList(preds); lst.addAll(predExceptions); return lst; } public List getPreds() { return preds; } public void setPreds(List preds) { this.preds = preds; } public InstructionSequence getSeq() { return seq; } public void setSeq(InstructionSequence seq) { this.seq = seq; } public List getSuccs() { return succs; } public void setSuccs(List succs) { this.succs = succs; } public List getSuccExceptions() { return succExceptions; } public void setSuccExceptions(List succExceptions) { this.succExceptions = succExceptions; } public List getPredExceptions() { return predExceptions; } public void setPredExceptions(List predExceptions) { this.predExceptions = predExceptions; } }