1 package gov.nasa.jpf.jvm.bytecode; 20 21 import gov.nasa.jpf.JPFException; 22 import gov.nasa.jpf.jvm.KernelState; 23 import gov.nasa.jpf.jvm.SystemState; 24 import gov.nasa.jpf.jvm.ThreadInfo; 25 import gov.nasa.jpf.jvm.ClassInfo; 26 import gov.nasa.jpf.jvm.Types; 27 28 import org.apache.bcel.classfile.ConstantFloat; 29 import org.apache.bcel.classfile.ConstantInteger; 30 import org.apache.bcel.classfile.ConstantPool; 31 import org.apache.bcel.classfile.ConstantString; 32 import org.apache.bcel.generic.ConstantPoolGen; 33 import org.apache.bcel.generic.Type; 34 35 36 40 public class LDC extends Instruction { 41 private String string; 42 private int value; 43 private boolean isString; 44 45 public void setPeer (org.apache.bcel.generic.Instruction i, ConstantPool cp) { 46 ConstantPoolGen cpg = ClassInfo.getConstantPoolGen(cp); 47 Type type = ((org.apache.bcel.generic.LDC) i).getType(cpg); 48 49 if (type == Type.STRING) { 50 isString = true; 51 string = cp.constantToString(cp.getConstant( 52 ((ConstantString) cp.getConstant( 53 ((org.apache.bcel.generic.LDC) i).getIndex())).getStringIndex())); 54 } else if (type == Type.INT) { 55 isString = false; 56 string = null; 57 value = ((ConstantInteger) cp.getConstant( 58 ((org.apache.bcel.generic.LDC) i).getIndex())).getBytes(); 59 } else if (type == Type.FLOAT) { 60 isString = false; 61 string = null; 62 value = Types.floatToInt( 63 ((ConstantFloat) cp.getConstant( 64 ((org.apache.bcel.generic.LDC) i).getIndex())).getBytes()); 65 } else { 66 throw new JPFException("invalid type of constant"); 67 } 68 } 69 70 public Instruction execute (SystemState ss, KernelState ks, ThreadInfo th) { 71 if (isString) { 72 th.push(ks.da.newConstantString(string), true); 73 } else { 74 th.push(value, false); 75 } 76 77 return getNext(th); 78 } 79 80 public int getByteCode () { 81 return 0x12; 82 } 83 } 84 | Popular Tags |