Initial import
[jpf-core.git] / src / tests / gov / nasa / jpf / test / mc / basic / JPF_gov_nasa_jpf_test_mc_basic_RestorerTest$X.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 package gov.nasa.jpf.test.mc.basic;
19
20 import gov.nasa.jpf.annotation.MJI;
21 import gov.nasa.jpf.vm.ClosedMemento;
22 import gov.nasa.jpf.vm.Instruction;
23 import gov.nasa.jpf.vm.MJIEnv;
24 import gov.nasa.jpf.vm.NativePeer;
25 import gov.nasa.jpf.vm.StackFrame;
26 import gov.nasa.jpf.vm.SystemState;
27 import gov.nasa.jpf.vm.ThreadInfo;
28
29 /**
30  * peer for the regression test for on-demand state restoration by means of
31  * ClosedMementos
32  */
33 public class JPF_gov_nasa_jpf_test_mc_basic_RestorerTest$X extends NativePeer {
34
35   static class InsnExecCount {
36     int count;    
37   }
38   
39   static class InsnCountRestorer implements ClosedMemento {
40     InsnExecCount insnAttr;
41     int count; // the value to restore
42     
43     InsnCountRestorer (InsnExecCount insnAttr){
44       this.insnAttr = insnAttr;
45       this.count = insnAttr.count;
46       
47       System.out.println("## storing: " + count);
48     }
49     
50     @Override
51         public void restore(){
52       System.out.println("## restoring: " + count);
53       insnAttr.count = count;
54     }
55   }
56
57   @MJI
58   public void $init (MJIEnv env, int objref){
59     ThreadInfo ti = env.getThreadInfo();
60     StackFrame caller = ti.getCallerStackFrame();
61     Instruction insn = caller.getPC();
62         
63     InsnExecCount a = insn.getAttr(InsnExecCount.class);
64     if (a == null){
65       a = new InsnExecCount();
66       insn.addAttr( a);
67     }
68
69     SystemState ss = env.getSystemState();
70     if (!ss.hasRestorer(a)){
71       env.getSystemState().putRestorer( a, new InsnCountRestorer(a));      
72     }
73     
74     a.count++;
75     env.setIntField(objref, "id", a.count);
76   }
77 }