Initial import
[jpf-core.git] / src / main / gov / nasa / jpf / jvm / bytecode / TABLESWITCH.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.jvm.bytecode;
19
20 import gov.nasa.jpf.JPFException;
21 import gov.nasa.jpf.vm.Instruction;
22 import gov.nasa.jpf.vm.StackFrame;
23 import gov.nasa.jpf.vm.ThreadInfo;
24
25
26 /**
27  * Access jump table by index and jump
28  *   ..., index  => ...
29  */
30 public class TABLESWITCH extends SwitchInstruction implements gov.nasa.jpf.vm.bytecode.TableSwitchInstruction {
31
32   int min, max;
33
34   public TABLESWITCH(int defaultTarget, int min, int max){
35     super(defaultTarget, (max - min +1));
36     this.min = min;
37     this.max = max;
38   }
39   
40   public int getMin(){
41           return min;
42   }
43   
44   public int getMax(){
45           return max;
46   }
47
48   @Override
49   public void setTarget (int value, int target){
50     int i = value-min;
51
52     if (i>=0 && i<targets.length){
53       targets[i] = target;
54     } else {
55       throw new JPFException("illegal tableswitch target: " + value);
56     }
57   }
58
59   @Override
60   protected Instruction executeConditional (ThreadInfo ti){
61     StackFrame frame = ti.getModifiableTopFrame();
62
63     int value = frame.pop();
64     int i = value-min;
65     int pc;
66
67     if (i>=0 && i<targets.length){
68       lastIdx = i;
69       pc = targets[i];
70     } else {
71       lastIdx = -1;
72       pc = target;
73     }
74
75     // <2do> this is BAD - we should compute the target insns just once
76     return mi.getInstructionAt(pc);
77   }
78
79
80   @Override
81   public int getLength() {
82     return 13 + 2*(matches.length); // <2do> NOT RIGHT: padding!!
83   }
84   
85   @Override
86   public int getByteCode () {
87     return 0xAA;
88   }
89   
90   @Override
91   public void accept(JVMInstructionVisitor insVisitor) {
92           insVisitor.visit(this);
93   }
94 }