2 * Copyright (C) 2014, United States Government, as represented by the
3 * Administrator of the National Aeronautics and Space Administration.
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
10 * http://www.apache.org/licenses/LICENSE-2.0.
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.
19 package gov.nasa.jpf.jvm.bytecode;
21 import gov.nasa.jpf.JPFException;
22 import gov.nasa.jpf.jvm.JVMInstructionFactory;
23 import gov.nasa.jpf.util.Invocation;
24 import gov.nasa.jpf.vm.ClassInfo;
25 import gov.nasa.jpf.vm.Instruction;
26 import gov.nasa.jpf.vm.MethodInfo;
27 import gov.nasa.jpf.vm.NativeMethodInfo;
29 import java.util.List;
32 * this is the new JVMInstructionFactory
34 public class InstructionFactory extends JVMInstructionFactory {
36 public InstructionFactory(){
41 public Object clone() {
44 } catch (CloneNotSupportedException cnsx){
45 throw new JPFException("InstructionFactory " + this.getClass().getName() + " does not support cloning");
49 //--- the factory methods
51 public Instruction aconst_null() {
52 return new ACONST_NULL();
56 public Instruction aload(int localVarIndex) {
57 return new ALOAD(localVarIndex);
61 public Instruction aload_0() {
66 public Instruction aload_1() {
71 public Instruction aload_2() {
76 public Instruction aload_3() {
81 public Instruction aaload() {
86 public Instruction astore(int localVarIndex) {
87 return new ASTORE(localVarIndex);
91 public Instruction astore_0() {
96 public Instruction astore_1() {
101 public Instruction astore_2() {
102 return new ASTORE(2);
106 public Instruction astore_3() {
107 return new ASTORE(3);
111 public Instruction aastore() {
112 return new AASTORE();
116 public Instruction areturn() {
117 return new ARETURN();
121 public Instruction anewarray(String clsName){
122 return new ANEWARRAY(clsName);
126 public Instruction arraylength() {
127 return new ARRAYLENGTH();
131 public Instruction athrow() {
136 public Instruction baload() {
141 public Instruction bastore() {
142 return new BASTORE();
146 public Instruction bipush(int b) {
147 return new BIPUSH(b);
151 public Instruction caload() {
156 public Instruction castore() {
157 return new CASTORE();
161 public Instruction checkcast(String clsName){
162 return new CHECKCAST(clsName);
166 public Instruction d2f() {
171 public Instruction d2i() {
176 public Instruction d2l() {
181 public Instruction dadd() {
186 public Instruction daload() {
191 public Instruction dastore() {
192 return new DASTORE();
196 public Instruction dcmpg() {
201 public Instruction dcmpl() {
206 public Instruction dconst_0() {
207 return new DCONST(0.0);
211 public Instruction dconst_1() {
212 return new DCONST(1.0);
216 public Instruction ddiv() {
221 public Instruction dload(int localVarIndex) {
222 return new DLOAD(localVarIndex);
226 public Instruction dload_0() {
231 public Instruction dload_1() {
236 public Instruction dload_2() {
241 public Instruction dload_3() {
246 public Instruction dmul() {
251 public Instruction dneg() {
256 public Instruction drem() {
261 public Instruction dreturn() {
262 return new DRETURN();
266 public Instruction dstore(int localVarIndex) {
267 return new DSTORE(localVarIndex);
271 public Instruction dstore_0() {
272 return new DSTORE(0);
276 public Instruction dstore_1() {
277 return new DSTORE(1);
281 public Instruction dstore_2() {
282 return new DSTORE(2);
286 public Instruction dstore_3() {
287 return new DSTORE(3);
291 public Instruction dsub() {
296 public Instruction dup() {
301 public Instruction dup_x1() {
306 public Instruction dup_x2() {
311 public Instruction dup2() {
316 public Instruction dup2_x1() {
317 return new DUP2_X1();
321 public Instruction dup2_x2() {
322 return new DUP2_X2();
326 public Instruction f2d() {
331 public Instruction f2i() {
336 public Instruction f2l() {
341 public Instruction fadd() {
346 public Instruction faload() {
351 public Instruction fastore() {
352 return new FASTORE();
356 public Instruction fcmpg() {
361 public Instruction fcmpl() {
366 public Instruction fconst_0() {
367 return new FCONST(0.0f);
371 public Instruction fconst_1() {
372 return new FCONST(1.0f);
376 public Instruction fconst_2() {
377 return new FCONST(2.0f);
381 public Instruction fdiv() {
386 public Instruction fload(int localVarIndex) {
387 return new FLOAD(localVarIndex);
391 public Instruction fload_0() {
396 public Instruction fload_1() {
401 public Instruction fload_2() {
406 public Instruction fload_3() {
411 public Instruction fmul() {
416 public Instruction fneg() {
421 public Instruction frem() {
426 public Instruction freturn() {
427 return new FRETURN();
431 public Instruction fstore(int localVarIndex) {
432 return new FSTORE(localVarIndex);
436 public Instruction fstore_0() {
437 return new FSTORE(0);
441 public Instruction fstore_1() {
442 return new FSTORE(1);
446 public Instruction fstore_2() {
447 return new FSTORE(2);
451 public Instruction fstore_3() {
452 return new FSTORE(3);
456 public Instruction fsub() {
461 public Instruction getfield(String fieldName, String clsName, String fieldDescriptor){
462 return new GETFIELD(fieldName, clsName, fieldDescriptor);
466 public Instruction getstatic(String fieldName, String clsName, String fieldDescriptor){
467 return new GETSTATIC(fieldName, clsName, fieldDescriptor);
472 public Instruction goto_(int targetPc) {
473 return new GOTO(targetPc);
477 public Instruction goto_w(int targetPc) {
478 return new GOTO_W(targetPc);
482 public Instruction i2b() {
487 public Instruction i2c() {
492 public Instruction i2d() {
497 public Instruction i2f() {
502 public Instruction i2l() {
507 public Instruction i2s() {
512 public Instruction iadd() {
517 public Instruction iaload() {
522 public Instruction iand() {
527 public Instruction iastore() {
528 return new IASTORE();
532 public Instruction iconst_m1() {
533 return new ICONST(-1);
537 public Instruction iconst_0() {
538 return new ICONST(0);
542 public Instruction iconst_1() {
543 return new ICONST(1);
547 public Instruction iconst_2() {
548 return new ICONST(2);
552 public Instruction iconst_3() {
553 return new ICONST(3);
557 public Instruction iconst_4() {
558 return new ICONST(4);
562 public Instruction iconst_5() {
563 return new ICONST(5);
567 public Instruction idiv() {
572 public Instruction if_acmpeq(int targetPc) {
573 return new IF_ACMPEQ(targetPc);
577 public Instruction if_acmpne(int targetPc) {
578 return new IF_ACMPNE(targetPc);
582 public Instruction if_icmpeq(int targetPc) {
583 return new IF_ICMPEQ(targetPc);
587 public Instruction if_icmpne(int targetPc) {
588 return new IF_ICMPNE(targetPc);
592 public Instruction if_icmplt(int targetPc) {
593 return new IF_ICMPLT(targetPc);
597 public Instruction if_icmpge(int targetPc) {
598 return new IF_ICMPGE(targetPc);
602 public Instruction if_icmpgt(int targetPc) {
603 return new IF_ICMPGT(targetPc);
607 public Instruction if_icmple(int targetPc) {
608 return new IF_ICMPLE(targetPc);
612 public Instruction ifeq(int targetPc) {
613 return new IFEQ(targetPc);
617 public Instruction ifne(int targetPc) {
618 return new IFNE(targetPc);
622 public Instruction iflt(int targetPc) {
623 return new IFLT(targetPc);
627 public Instruction ifge(int targetPc) {
628 return new IFGE(targetPc);
632 public Instruction ifgt(int targetPc) {
633 return new IFGT(targetPc);
637 public Instruction ifle(int targetPc) {
638 return new IFLE(targetPc);
642 public Instruction ifnonnull(int targetPc) {
643 return new IFNONNULL(targetPc);
647 public Instruction ifnull(int targetPc) {
648 return new IFNULL(targetPc);
652 public Instruction iinc(int localVarIndex, int incConstant) {
653 return new IINC(localVarIndex, incConstant);
657 public Instruction iload(int localVarIndex) {
658 return new ILOAD(localVarIndex);
662 public Instruction iload_0() {
667 public Instruction iload_1() {
672 public Instruction iload_2() {
677 public Instruction iload_3() {
682 public Instruction imul() {
687 public Instruction ineg() {
692 public Instruction instanceof_(String clsName){
693 return new INSTANCEOF(clsName);
697 public Instruction invokeinterface(String clsName, String methodName, String methodSignature){
698 return new INVOKEINTERFACE(clsName, methodName, methodSignature);
702 public Instruction invokespecial(String clsName, String methodName, String methodSignature){
703 return new INVOKESPECIAL(clsName, methodName, methodSignature);
707 public Instruction invokestatic(String clsName, String methodName, String methodSignature){
708 return new INVOKESTATIC(clsName, methodName, methodSignature);
712 public Instruction invokevirtual(String clsName, String methodName, String methodSignature){
713 return new INVOKEVIRTUAL(clsName, methodName, methodSignature);
717 public Instruction invokedynamic(int bootstrapIndex, String samMethodName, String functionType){
718 return new INVOKEDYNAMIC(bootstrapIndex, samMethodName, functionType);
722 public Instruction ior() {
727 public Instruction irem() {
732 public Instruction ireturn() {
733 return new IRETURN();
737 public Instruction ishl() {
742 public Instruction ishr() {
747 public Instruction istore(int localVarIndex) {
748 return new ISTORE(localVarIndex);
752 public Instruction istore_0() {
753 return new ISTORE(0);
757 public Instruction istore_1() {
758 return new ISTORE(1);
762 public Instruction istore_2() {
763 return new ISTORE(2);
767 public Instruction istore_3() {
768 return new ISTORE(3);
772 public Instruction isub() {
777 public Instruction iushr() {
782 public Instruction ixor() {
787 public Instruction jsr(int targetPc) {
788 return new JSR(targetPc);
792 public Instruction jsr_w(int targetPc) {
793 return new JSR_W(targetPc);
797 public Instruction l2d() {
802 public Instruction l2f() {
807 public Instruction l2i() {
812 public Instruction ladd() {
817 public Instruction laload() {
822 public Instruction land() {
827 public Instruction lastore() {
828 return new LASTORE();
832 public Instruction lcmp() {
837 public Instruction lconst_0() {
838 return new LCONST(0);
842 public Instruction lconst_1() {
843 return new LCONST(1L);
847 public Instruction ldc(int v){
851 public Instruction ldc(float v){
855 public Instruction ldc(String v, boolean isClass){
856 return new LDC(v, isClass);
861 public Instruction ldc_w(int v){
865 public Instruction ldc_w(float v){
869 public Instruction ldc_w(String v, boolean isClass){
870 return new LDC_W(v, isClass);
874 public Instruction ldc2_w(long v){
875 return new LDC2_W(v);
878 public Instruction ldc2_w(double v){
879 return new LDC2_W(v);
883 public Instruction ldiv() {
888 public Instruction lload(int localVarIndex) {
889 return new LLOAD(localVarIndex);
893 public Instruction lload_0() {
898 public Instruction lload_1() {
903 public Instruction lload_2() {
908 public Instruction lload_3() {
913 public Instruction lmul() {
918 public Instruction lneg() {
923 public Instruction lookupswitch(int defaultTargetPc, int nEntries) {
924 return new LOOKUPSWITCH(defaultTargetPc, nEntries);
928 public Instruction lor() {
933 public Instruction lrem() {
938 public Instruction lreturn() {
939 return new LRETURN();
943 public Instruction lshl() {
948 public Instruction lshr() {
953 public Instruction lstore(int localVarIndex) {
954 return new LSTORE(localVarIndex);
958 public Instruction lstore_0() {
959 return new LSTORE(0);
963 public Instruction lstore_1() {
964 return new LSTORE(1);
968 public Instruction lstore_2() {
969 return new LSTORE(2);
973 public Instruction lstore_3() {
974 return new LSTORE(3);
978 public Instruction lsub() {
983 public Instruction lushr() {
988 public Instruction lxor() {
993 public Instruction monitorenter() {
994 return new MONITORENTER();
998 public Instruction monitorexit() {
999 return new MONITOREXIT();
1003 public Instruction multianewarray(String clsName, int dimensions){
1004 return new MULTIANEWARRAY(clsName, dimensions);
1008 public Instruction new_(String clsName) {
1009 return new NEW(clsName);
1013 public Instruction newarray(int typeCode) {
1014 return new NEWARRAY(typeCode);
1018 public Instruction nop() {
1023 public Instruction pop() {
1028 public Instruction pop2() {
1033 public Instruction putfield(String fieldName, String clsName, String fieldDescriptor){
1034 return new PUTFIELD(fieldName, clsName, fieldDescriptor);
1038 public Instruction putstatic(String fieldName, String clsName, String fieldDescriptor){
1039 return new PUTSTATIC(fieldName, clsName, fieldDescriptor);
1043 public Instruction ret(int localVarIndex) {
1044 return new RET(localVarIndex);
1048 public Instruction return_() {
1049 return new RETURN();
1053 public Instruction saload() {
1054 return new SALOAD();
1058 public Instruction sastore() {
1059 return new SASTORE();
1063 public Instruction sipush(int val) {
1064 return new SIPUSH(val);
1068 public Instruction swap() {
1073 public Instruction tableswitch(int defaultTargetPc, int low, int high) {
1074 return new TABLESWITCH(defaultTargetPc, low, high);
1078 public Instruction wide() {
1083 //--- the JPF specific ones (only used in synthetic methods)
1085 public Instruction invokecg(List<Invocation> invokes) {
1086 return new INVOKECG(invokes);
1090 public Instruction invokeclinit(ClassInfo ci) {
1091 return new INVOKECLINIT(ci);
1095 public Instruction directcallreturn(){
1096 return new DIRECTCALLRETURN();
1100 public Instruction executenative(NativeMethodInfo mi){
1101 return new EXECUTENATIVE(mi);
1105 public Instruction nativereturn(){
1106 return new NATIVERETURN();
1109 // this is never part of MethodInfo stored code
1111 public Instruction runstart(MethodInfo miRun){
1112 return new RUNSTART();
1116 public Instruction finishclinit(ClassInfo ci) {
1117 return new FINISHCLINIT(ci);