1 package gov.nasa.jpf.jvm.bytecode; 20 21 import gov.nasa.jpf.jvm.ElementInfo; 22 import gov.nasa.jpf.jvm.KernelState; 23 import gov.nasa.jpf.jvm.SystemState; 24 import gov.nasa.jpf.jvm.ThreadInfo; 25 26 import org.apache.bcel.classfile.ConstantPool; 27 28 29 33 public class MULTIANEWARRAY extends Instruction { 34 private String type; 35 private int dimensions; 36 37 public void setPeer (org.apache.bcel.generic.Instruction i, ConstantPool cp) { 38 type = cp.constantToString(cp.getConstant( 39 ((org.apache.bcel.generic.MULTIANEWARRAY) i).getIndex())); 40 dimensions = ((org.apache.bcel.generic.MULTIANEWARRAY) i).getDimensions(); 41 } 42 43 public int allocateArray (String type, int[] dim, ThreadInfo th, int d) { 44 int l = dim[d++]; 45 int arrayRef = th.list.ks.da.newArray(type.substring(d), l, th); 46 ElementInfo e = th.list.ks.da.get(arrayRef); 47 48 if (dim.length > d) { 49 for (int i = 0; i < l; i++) { 50 e.setElement(i, allocateArray(type, dim, th, d)); 51 } 52 } else { 53 for (int i = 0; i < l; i++) { 54 e.setElement(i, -1); 55 } 56 } 57 58 return arrayRef; 59 } 60 61 public Instruction execute (SystemState ss, KernelState ks, ThreadInfo th) { 62 int[] dim = new int[dimensions]; 63 64 for (int i = dimensions - 1; i >= 0; i--) { 65 dim[i] = th.pop(); 66 } 67 68 int arrayRef = allocateArray(type, dim, th, 0); 69 70 71 th.push(arrayRef, true); 73 74 return getNext(th); 75 } 76 77 public int getByteCode () { 78 return 0xC5; 79 } 80 } 81 | Popular Tags |