Initial import
[jpf-core.git] / src / main / gov / nasa / jpf / jvm / bytecode / PutHelper.java
1 /*
2  * Copyright (C) 2014, United States Government, as represented by the
3  * Administrator of the National Aeronautics and Space Administration.
4  * All rights reserved.
5  *
6  * The Java Pathfinder core (jpf-core) platform is licensed under the
7  * Apache License, Version 2.0 (the "License"); you may not use this file except
8  * in compliance with the License. You may obtain a copy of the License at
9  * 
10  *        http://www.apache.org/licenses/LICENSE-2.0. 
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and 
16  * limitations under the License.
17  */
18
19 package gov.nasa.jpf.jvm.bytecode;
20
21 import gov.nasa.jpf.vm.ElementInfo;
22 import gov.nasa.jpf.vm.FieldInfo;
23 import gov.nasa.jpf.vm.StackFrame;
24 import gov.nasa.jpf.vm.ThreadInfo;
25
26 /**
27  * helper class to factor out common PUT code
28  * 
29  * <2do> This is going to be moved into a Java 8 interface with default methods
30  */
31 public class PutHelper {
32
33   protected static boolean hasNewValue (ThreadInfo ti, StackFrame frame, ElementInfo eiFieldOwner, FieldInfo fi){
34     Object valAttr = null;
35     int fieldSize = fi.getStorageSize();
36     
37     if (fieldSize == 1){
38       valAttr = frame.getOperandAttr();
39       int val = frame.peek();
40       if (eiFieldOwner.get1SlotField(fi) != val){
41         return true;
42       }
43       
44     } else {
45       valAttr = frame.getLongOperandAttr();
46       long val = frame.peekLong();
47       if (eiFieldOwner.get2SlotField(fi) != val){
48         return true;
49       }
50     }
51     
52     if (eiFieldOwner.getFieldAttr(fi) != valAttr){
53       return true;
54     }
55     
56     return false;
57   }
58   
59   protected static int setReferenceField (ThreadInfo ti, StackFrame frame, ElementInfo eiFieldOwner, FieldInfo fi){
60     Object valAttr = frame.getOperandAttr();
61     int val = frame.peek();
62     eiFieldOwner.set1SlotField(fi, val);
63     eiFieldOwner.setFieldAttr(fi, valAttr);
64     return val;
65   }
66   
67   protected static long setField (ThreadInfo ti, StackFrame frame, ElementInfo eiFieldOwner, FieldInfo fi){
68     int fieldSize = fi.getStorageSize();
69     
70     if (fieldSize == 1){
71       Object valAttr = frame.getOperandAttr();
72       int val = frame.peek();
73       eiFieldOwner.set1SlotField(fi, val);
74       eiFieldOwner.setFieldAttr(fi, valAttr);
75       return val;
76       
77     } else {
78       Object valAttr = frame.getLongOperandAttr();
79       long val = frame.peekLong();
80       eiFieldOwner.set2SlotField(fi, val);
81       eiFieldOwner.setFieldAttr(fi, valAttr);
82       return val;
83     }
84   }
85 }