package org.codehaus.groovy.gjit;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.objectweb.asm.tree.AbstractInsnNode;
import org.objectweb.asm.tree.analysis.AnalyzerException;
import org.objectweb.asm.tree.analysis.BasicValue;
import org.objectweb.asm.tree.analysis.Value;
public class MyBasicInterpreter extends SimpleVerifier {
public final Map<AbstractInsnNode, Value[]> use = new HashMap<AbstractInsnNode, Value[]>();
@Override
public Value binaryOperation(AbstractInsnNode insn, Value value1,
Value value2) throws AnalyzerException {
use.put(insn, new Value[]{value1, value2});
Value v = super.binaryOperation(insn, value1, value2);
return def(insn, v);
}
@Override
public Value copyOperation(AbstractInsnNode insn, Value value)
throws AnalyzerException {
use.put(insn, new Value[]{value});
Value v = super.copyOperation(insn, value);
return def(insn, v);
}
@Override
public Value naryOperation(AbstractInsnNode insn, List<Value> values)
throws AnalyzerException {
use.put(insn, values.toArray(new Value[values.size()]));
Value v = super.naryOperation(insn, values);
return def(insn, v);
}
@Override
public Value newOperation(AbstractInsnNode insn) {
Value v = super.newOperation(insn);
return def(insn, v);
}
@Override
public Value ternaryOperation(AbstractInsnNode insn, Value value1,
Value value2, Value value3) throws AnalyzerException {
use.put(insn, new Value[]{value1,value2,value3});
Value v = super.ternaryOperation(insn, value1, value2, value3);
return def(insn, v);
}
@Override
public Value unaryOperation(AbstractInsnNode insn, Value value)
throws AnalyzerException {
use.put(insn, new Value[]{value});
Value v = super.unaryOperation(insn, value);
return def(insn, v);
}
private DefValue def(AbstractInsnNode insn, Value value) {
if(value == null) return new DefValue(insn, null);
return new DefValue(insn, ((BasicValue)value).getType());
}
}