Fixing a new bug: Considering parameters with Type and Type array, e.g., T and T[].
[jpf-core.git] / src / main / gov / nasa / jpf / jvm / JVMInstructionFactory.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;
19
20 import gov.nasa.jpf.util.Invocation;
21 import gov.nasa.jpf.vm.ClassInfo;
22 import gov.nasa.jpf.vm.Instruction;
23 import gov.nasa.jpf.vm.MethodInfo;
24 import gov.nasa.jpf.vm.NativeMethodInfo;
25
26 import java.util.List;
27
28 /**
29  * interface for bytecode creation
30  *
31  * this deliberately uses the abstract abstract public Instruction as return type to allow different instruction hierarchies in
32  * extensions.
33  *
34  * This shouldn't impose runtime overhead since mandatory parameters are now passed in as factory method arguments. The only
35  * drawback is that the compiler cannot check for abstract public Instruction class typos, but that seems less important than
36  * allowing extension specific abstract public Instruction class hierarchies
37  *
38  * <2do> there are still direct references of LOOKUPSWITCH, TABLESWITCH. Once these are removed, .jvm does not assume a particular
39  * abstract public Instruction hierarchy
40  */
41 public abstract class JVMInstructionFactory implements Cloneable {
42
43   protected static JVMInstructionFactory singleton;
44   
45   public static JVMInstructionFactory getFactory(){
46     return singleton;
47   }
48   
49   protected JVMInstructionFactory(){
50     // we should check the singleton first
51     singleton = this;
52   }
53   
54
55   //--- the factory methods
56   abstract public Instruction aconst_null ();
57
58   abstract public Instruction aload (int localVarIndex);
59
60   abstract public Instruction aload_0 ();
61
62   abstract public Instruction aload_1 ();
63
64   abstract public Instruction aload_2 ();
65
66   abstract public Instruction aload_3 ();
67
68   abstract public Instruction aaload ();
69
70   abstract public Instruction astore (int localVarIndex);
71
72   abstract public Instruction astore_0 ();
73
74   abstract public Instruction astore_1 ();
75
76   abstract public Instruction astore_2 ();
77
78   abstract public Instruction astore_3 ();
79
80   abstract public Instruction aastore ();
81
82   abstract public Instruction areturn ();
83
84   abstract public Instruction anewarray (String clsName);
85
86   abstract public Instruction arraylength ();
87
88   abstract public Instruction athrow ();
89
90   abstract public Instruction baload ();
91
92   abstract public Instruction bastore ();
93
94   abstract public Instruction bipush (int b);
95
96   abstract public Instruction caload ();
97
98   abstract public Instruction castore ();
99
100   abstract public Instruction checkcast (String clsName);
101
102   abstract public Instruction d2f ();
103
104   abstract public Instruction d2i ();
105
106   abstract public Instruction d2l ();
107
108   abstract public Instruction dadd ();
109
110   abstract public Instruction daload ();
111
112   abstract public Instruction dastore ();
113
114   abstract public Instruction dcmpg ();
115
116   abstract public Instruction dcmpl ();
117
118   abstract public Instruction dconst_0 ();
119
120   abstract public Instruction dconst_1 ();
121
122   abstract public Instruction ddiv ();
123
124   abstract public Instruction dload (int localVarIndex);
125
126   abstract public Instruction dload_0 ();
127
128   abstract public Instruction dload_1 ();
129
130   abstract public Instruction dload_2 ();
131
132   abstract public Instruction dload_3 ();
133
134   abstract public Instruction dmul ();
135
136   abstract public Instruction dneg ();
137
138   abstract public Instruction drem ();
139
140   abstract public Instruction dreturn ();
141
142   abstract public Instruction dstore (int localVarIndex);
143
144   abstract public Instruction dstore_0 ();
145
146   abstract public Instruction dstore_1 ();
147
148   abstract public Instruction dstore_2 ();
149
150   abstract public Instruction dstore_3 ();
151
152   abstract public Instruction dsub ();
153
154   abstract public Instruction dup ();
155
156   abstract public Instruction dup_x1 ();
157
158   abstract public Instruction dup_x2 ();
159
160   abstract public Instruction dup2 ();
161
162   abstract public Instruction dup2_x1 ();
163
164   abstract public Instruction dup2_x2 ();
165
166   abstract public Instruction f2d ();
167
168   abstract public Instruction f2i ();
169
170   abstract public Instruction f2l ();
171
172   abstract public Instruction fadd ();
173
174   abstract public Instruction faload ();
175
176   abstract public Instruction fastore ();
177
178   abstract public Instruction fcmpg ();
179
180   abstract public Instruction fcmpl ();
181
182   abstract public Instruction fconst_0 ();
183
184   abstract public Instruction fconst_1 ();
185
186   abstract public Instruction fconst_2 ();
187
188   abstract public Instruction fdiv ();
189
190   abstract public Instruction fload (int localVarIndex);
191
192   abstract public Instruction fload_0 ();
193
194   abstract public Instruction fload_1 ();
195
196   abstract public Instruction fload_2 ();
197
198   abstract public Instruction fload_3 ();
199
200   abstract public Instruction fmul ();
201
202   abstract public Instruction fneg ();
203
204   abstract public Instruction frem ();
205
206   abstract public Instruction freturn ();
207
208   abstract public Instruction fstore (int localVarIndex);
209
210   abstract public Instruction fstore_0 ();
211
212   abstract public Instruction fstore_1 ();
213
214   abstract public Instruction fstore_2 ();
215
216   abstract public Instruction fstore_3 ();
217
218   abstract public Instruction fsub ();
219
220   abstract public Instruction getfield (String fieldName, String clsName, String fieldDescriptor);
221
222   abstract public Instruction getstatic (String fieldName, String clsName, String fieldDescriptor);
223
224   abstract public Instruction goto_ (int targetPc);
225
226   abstract public Instruction goto_w (int targetPc);
227
228   abstract public Instruction i2b ();
229
230   abstract public Instruction i2c ();
231
232   abstract public Instruction i2d ();
233
234   abstract public Instruction i2f ();
235
236   abstract public Instruction i2l ();
237
238   abstract public Instruction i2s ();
239
240   abstract public Instruction iadd ();
241
242   abstract public Instruction iaload ();
243
244   abstract public Instruction iand ();
245
246   abstract public Instruction iastore ();
247
248   abstract public Instruction iconst_m1 ();
249
250   abstract public Instruction iconst_0 ();
251
252   abstract public Instruction iconst_1 ();
253
254   abstract public Instruction iconst_2 ();
255
256   abstract public Instruction iconst_3 ();
257
258   abstract public Instruction iconst_4 ();
259
260   abstract public Instruction iconst_5 ();
261
262   abstract public Instruction idiv ();
263
264   abstract public Instruction if_acmpeq (int targetPc);
265
266   abstract public Instruction if_acmpne (int targetPc);
267
268   abstract public Instruction if_icmpeq (int targetPc);
269
270   abstract public Instruction if_icmpne (int targetPc);
271
272   abstract public Instruction if_icmplt (int targetPc);
273
274   abstract public Instruction if_icmpge (int targetPc);
275
276   abstract public Instruction if_icmpgt (int targetPc);
277
278   abstract public Instruction if_icmple (int targetPc);
279
280   abstract public Instruction ifeq (int targetPc);
281
282   abstract public Instruction ifne (int targetPc);
283
284   abstract public Instruction iflt (int targetPc);
285
286   abstract public Instruction ifge (int targetPc);
287
288   abstract public Instruction ifgt (int targetPc);
289
290   abstract public Instruction ifle (int targetPc);
291
292   abstract public Instruction ifnonnull (int targetPc);
293
294   abstract public Instruction ifnull (int targetPc);
295
296   abstract public Instruction iinc (int localVarIndex, int incConstant);
297
298   abstract public Instruction iload (int localVarIndex);
299
300   abstract public Instruction iload_0 ();
301
302   abstract public Instruction iload_1 ();
303
304   abstract public Instruction iload_2 ();
305
306   abstract public Instruction iload_3 ();
307
308   abstract public Instruction imul ();
309
310   abstract public Instruction ineg ();
311
312   abstract public Instruction instanceof_ (String clsName);
313
314   abstract public Instruction invokeinterface (String clsName, String methodName, String methodSignature);
315
316   abstract public Instruction invokespecial (String clsName, String methodName, String methodSignature);
317
318   abstract public Instruction invokestatic (String clsName, String methodName, String methodSignature);
319
320   abstract public Instruction invokevirtual (String clsName, String methodName, String methodSignature);
321   
322   abstract public Instruction invokedynamic (int bootstrapIndex, String samMethodName, String functionType);
323
324   abstract public Instruction ior ();
325
326   abstract public Instruction irem ();
327
328   abstract public Instruction ireturn ();
329
330   abstract public Instruction ishl ();
331
332   abstract public Instruction ishr ();
333
334   abstract public Instruction istore (int localVarIndex);
335
336   abstract public Instruction istore_0 ();
337
338   abstract public Instruction istore_1 ();
339
340   abstract public Instruction istore_2 ();
341
342   abstract public Instruction istore_3 ();
343
344   abstract public Instruction isub ();
345
346   abstract public Instruction iushr ();
347
348   abstract public Instruction ixor ();
349
350   abstract public Instruction jsr (int targetPc);
351
352   abstract public Instruction jsr_w (int targetPc);
353
354   abstract public Instruction l2d ();
355
356   abstract public Instruction l2f ();
357
358   abstract public Instruction l2i ();
359
360   abstract public Instruction ladd ();
361
362   abstract public Instruction laload ();
363
364   abstract public Instruction land ();
365
366   abstract public Instruction lastore ();
367
368   abstract public Instruction lcmp ();
369
370   abstract public Instruction lconst_0 ();
371
372   abstract public Instruction lconst_1 ();
373
374   abstract public Instruction ldc (int v);
375
376   abstract public Instruction ldc (float v);
377
378   abstract public Instruction ldc (String v, boolean isClass);
379
380   abstract public Instruction ldc_w (int v);
381
382   abstract public Instruction ldc_w (float v);
383
384   abstract public Instruction ldc_w (String v, boolean isClass);
385
386   abstract public Instruction ldc2_w (long v);
387
388   abstract public Instruction ldc2_w (double v);
389
390   abstract public Instruction ldiv ();
391
392   abstract public Instruction lload (int localVarIndex);
393
394   abstract public Instruction lload_0 ();
395
396   abstract public Instruction lload_1 ();
397
398   abstract public Instruction lload_2 ();
399
400   abstract public Instruction lload_3 ();
401
402   abstract public Instruction lmul ();
403
404   abstract public Instruction lneg ();
405
406   abstract public Instruction lookupswitch (int defaultTargetPc, int nEntries);
407
408   abstract public Instruction lor ();
409
410   abstract public Instruction lrem ();
411
412   abstract public Instruction lreturn ();
413
414   abstract public Instruction lshl ();
415
416   abstract public Instruction lshr ();
417
418   abstract public Instruction lstore (int localVarIndex);
419
420   abstract public Instruction lstore_0 ();
421
422   abstract public Instruction lstore_1 ();
423
424   abstract public Instruction lstore_2 ();
425
426   abstract public Instruction lstore_3 ();
427
428   abstract public Instruction lsub ();
429
430   abstract public Instruction lushr ();
431
432   abstract public Instruction lxor ();
433
434   abstract public Instruction monitorenter ();
435
436   abstract public Instruction monitorexit ();
437
438   abstract public Instruction multianewarray (String clsName, int dimensions);
439
440   abstract public Instruction new_ (String clsName);
441
442   abstract public Instruction newarray (int typeCode);
443
444   abstract public Instruction nop ();
445
446   abstract public Instruction pop ();
447
448   abstract public Instruction pop2 ();
449
450   abstract public Instruction putfield (String fieldName, String clsName, String fieldDescriptor);
451
452   abstract public Instruction putstatic (String fieldName, String clsName, String fieldDescriptor);
453
454   abstract public Instruction ret (int localVarIndex);
455
456   abstract public Instruction return_ ();
457
458   abstract public Instruction saload ();
459
460   abstract public Instruction sastore ();
461
462   abstract public Instruction sipush (int val);
463
464   abstract public Instruction swap ();
465
466   abstract public Instruction tableswitch (int defaultTargetPc, int low, int high);
467
468   abstract public Instruction wide ();
469
470   //--- the JPF specific ones (only used in synthetic methods)
471   abstract public Instruction invokecg (List<Invocation> invokes);
472
473   abstract public Instruction invokeclinit (ClassInfo ci);
474
475   abstract public Instruction directcallreturn ();
476
477   abstract public Instruction executenative (NativeMethodInfo mi);
478
479   abstract public Instruction nativereturn ();
480
481   // this is never part of MethodInfo stored code
482   abstract public Instruction runstart (MethodInfo miRun);
483
484   abstract public Instruction finishclinit (ClassInfo ci);
485 }