1 package gov.nasa.jpf.jvm.bytecode; 20 21 import gov.nasa.jpf.jvm.ArrayIndexOutOfBoundsExecutiveException; 22 import gov.nasa.jpf.jvm.ElementInfo; 23 import gov.nasa.jpf.jvm.KernelState; 24 import gov.nasa.jpf.jvm.SystemState; 25 import gov.nasa.jpf.jvm.ThreadInfo; 26 27 28 31 public abstract class ArrayStoreInstruction extends ArrayInstruction 32 implements StoreInstruction 33 { 34 public Instruction execute (SystemState ss, KernelState ks, ThreadInfo th) { 35 long value; 36 int index; 37 int arrayRef; 38 39 value = getValue(th); 40 index = th.pop(); 41 arrayRef = th.pop(); 42 43 ElementInfo e = ks.da.get(arrayRef); 44 45 if (arrayRef == -1) { 46 return th.createAndThrowException("java.lang.NullPointerException"); 47 } 48 49 try { 50 setField(e, index, value); 51 52 return getNext(th); 53 } catch (ArrayIndexOutOfBoundsExecutiveException ex) { 54 return ex.getInstruction(); 55 } 56 } 57 58 protected void setField (ElementInfo e, int index, long value) 59 throws ArrayIndexOutOfBoundsExecutiveException { 60 e.checkArrayBounds(index); 61 e.setElement(index, (int) value); 62 } 63 64 protected long getValue (ThreadInfo th) { 65 return (long) th.pop(); 66 } 67 68 public boolean isSchedulingRelevant (SystemState ss, KernelState ks, ThreadInfo ti) { 69 if (ti.usePorFieldBoundaries()) { 72 int off = getElementSize() + 1; 73 if (ks.da.isSchedulingRelevantObject(ti.peek(off)) && ti.hasOtherRunnables()) { 74 return true; 75 } 76 } 77 78 return false; 79 } 80 } 81 | Popular Tags |