01: //
02: // Copyright (C) 2005 United States Government as represented by the
03: // Administrator of the National Aeronautics and Space Administration
04: // (NASA). All Rights Reserved.
05: //
06: // This software is distributed under the NASA Open Source Agreement
07: // (NOSA), version 1.3. The NOSA has been approved by the Open Source
08: // Initiative. See the file NOSA-1.3-JPF at the top of the distribution
09: // directory tree for the complete NOSA document.
10: //
11: // THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY OF ANY
12: // KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, BUT NOT
13: // LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM TO
14: // SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR
15: // A PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT
16: // THE SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT
17: // DOCUMENTATION, IF PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE.
18: //
19: 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: * Set field in object
32: * ..., objectref, value => ...
33: */
34: public class PUTFIELD extends InstanceFieldInstruction implements
35: StoreInstruction {
36: public Instruction execute(SystemState ss, KernelState ks,
37: ThreadInfo ti) {
38: FieldInfo fi = getFieldInfo();
39: long lvalue = 0;
40: int ivalue = 0;
41:
42: // Hrmm, we can't encapsulate the size discrimination in ElementInfo, since
43: // we have to pop different data types before we ever get to it
44: 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(
58: "java.lang.NullPointerException",
59: "referencing field '" + fname + "' on null object");
60: }
61:
62: ElementInfo e = DynamicArea.getHeap().get(objRef);
63: if (fi.isReference()) {
64: e.setReferenceField(fi, ivalue);
65: } else {
66: if (size == 1) {
67: e.setIntField(fi, ivalue);
68: } else {
69: e.setLongField(fi, lvalue);
70: }
71: }
72:
73: return getNext(ti);
74: }
75:
76: public int getByteCode() {
77: return 0xB5;
78: }
79:
80: public boolean isSchedulingRelevant(SystemState ss, KernelState ks,
81: ThreadInfo ti) {
82: if (ti.usePorFieldBoundaries()) {
83: FieldInfo fi = getFieldInfo();
84: int objRef = ti.peek((fi.getStorageSize() == 1) ? 1 : 2);
85:
86: return isSchedulingRelevant(ks, ti, objRef);
87: }
88:
89: return false;
90: }
91: }
|