/*******************************************************************************
* Copyright (c) 2002,2006 IBM Corporation.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package com.ibm.wala.shrikeBT;
import java.io.IOException;
import java.io.Writer;
/**
* This is a very simple component to disassemble a ShrikeBT method. The disassembly is just the list of ShrikeBT instructions,
* annotated with exception handler blocks and the mapping back to the original bytecodes.
*/
public class Disassembler {
final private IInstruction[] instructions;
final private ExceptionHandler[][] handlers;
final private int[] instructionsToBytecodes;
/**
* Create a disassembler for a method.
*/
public Disassembler(IInstruction[] instructions, ExceptionHandler[][] handlers, int[] instructionsToBytecodes) {
this.instructions = instructions;
this.handlers = handlers;
this.instructionsToBytecodes = instructionsToBytecodes;
}
/**
* Create a disassembler for a method.
*
* @throws NullPointerException if data is null
*/
public Disassembler(MethodData data) throws NullPointerException {
this(data.getInstructions(), data.getHandlers(), data.getInstructionsToBytecodes());
}
/**
* Write the disassembly to a stream. Each line is prefixed with 'prefix'.
*/
public void disassembleTo(String prefix, Writer w) throws IOException {
for (int j = 0; j < instructions.length; j++) {
w.write(prefix + j + ": " + instructions[j] + " (" + instructionsToBytecodes[j] + ")\n");
for (int k = 0; k < handlers[j].length; k++) {
w.write(prefix + " Handles " + handlers[j][k].catchClass + " at " + handlers[j][k].handler + "\n");
}
}
}
/**
* Write the disassembly to a stream.
*/
public void disassembleTo(Writer w) throws IOException {
disassembleTo("", w);
}
}