1 package gov.nasa.jpf.jvm.bytecode; 20 21 import gov.nasa.jpf.JPFException; 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 import gov.nasa.jpf.jvm.DynamicArea; 27 28 import gov.nasa.jpf.jvm.FieldInfo; 29 30 31 35 public class PUTFIELD extends InstanceFieldInstruction implements StoreInstruction 36 { 37 public Instruction execute (SystemState ss, KernelState ks, ThreadInfo ti) { 38 FieldInfo fi = getFieldInfo(); 39 long lvalue = 0; 40 int ivalue = 0; 41 42 switch (fi.getStorageSize()) { 45 case 1: 46 ivalue = ti.pop(); 47 break; 48 case 2: 49 lvalue = ti.longPop(); 50 break; 51 default: 52 throw new JPFException("invalid field type"); 53 } 54 55 int objRef = lastThis = ti.pop(); 56 if (objRef == -1) { 57 return ti.createAndThrowException("java.lang.NullPointerException", 58 "referencing field '" + fname + "' on null object"); 59 } 60 61 ElementInfo e = DynamicArea.getHeap().get(objRef); 62 if (fi.isReference()) { 63 e.setReferenceField(fi, ivalue); 64 } else { 65 if (size == 1) { 66 e.setIntField(fi, ivalue); 67 } else { 68 e.setLongField(fi, lvalue); 69 } 70 } 71 72 return getNext(ti); 73 } 74 75 public int getByteCode () { 76 return 0xB5; 77 } 78 79 public boolean isSchedulingRelevant (SystemState ss, KernelState ks, ThreadInfo ti) { 80 if (ti.usePorFieldBoundaries()) { 81 FieldInfo fi = getFieldInfo(); 82 int objRef = ti.peek( (fi.getStorageSize() == 1) ? 1 : 2); 83 84 return isSchedulingRelevant(ks, ti, objRef); 85 } 86 87 return false; 88 } 89 } 90 91 92 93 | Popular Tags |