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;
21 import gov.nasa.jpf.JPFException;
22 import gov.nasa.jpf.util.Invocation;
23 import gov.nasa.jpf.vm.ClassInfo;
24 import gov.nasa.jpf.vm.Instruction;
25 import gov.nasa.jpf.vm.bytecode.LookupSwitchInstruction;
26 import gov.nasa.jpf.vm.MethodInfo;
27 import gov.nasa.jpf.vm.NativeMethodInfo;
28 import gov.nasa.jpf.vm.bytecode.TableSwitchInstruction;
30 import java.util.ArrayList;
31 import java.util.List;
34 * a special JVMByteCodeReader implementation that builds code arrays for
35 * MethodInfos, setting index and pc on the fly
37 public class JVMCodeBuilder implements JVMByteCodeReader {
39 protected JVMInstructionFactory insnFactory;
41 protected ClassFile cf;
42 protected MethodInfo mi;
44 // have to cache these to set switch entries
45 // <2do> these should use interface types to avoid hardwiring our own instruction classes
46 protected TableSwitchInstruction tableswitchInsn;
47 protected LookupSwitchInstruction lookupswitchInsn;
49 protected ArrayList<Instruction> code;
51 protected int pc; // bytecode position within method code
52 protected int idx; // instruction index within MethodInfo
54 // flag to remember wide immediate operand modification
57 //--- for testing purposes
58 protected JVMCodeBuilder (JVMInstructionFactory ifact){
59 this.code = new ArrayList<Instruction>(64);
60 this.insnFactory = ifact;
65 // this is dangerous - it enables reuse of CodeBuilders, but
66 // you better make sure this does not get recursive or is used concurrently
67 public void reset (ClassFile classFile, MethodInfo targetMethod){
69 this.mi = targetMethod;
75 tableswitchInsn = null;
76 lookupswitchInsn = null;
81 protected void add(Instruction insn){
82 insn.setMethodInfo(mi);
83 insn.setLocation(idx++, pc);
87 public void installCode(){
88 Instruction[] a = code.toArray( new Instruction[code.size()]);
92 public int getCodeSize(){
96 //--- the factory methods
98 @Override public void aconst_null() {
99 add( insnFactory.aconst_null());
103 @Override public void aload(int localVarIndex) {
104 add( insnFactory.aload(localVarIndex));
112 @Override public void aload_0() {
113 add( insnFactory.aload(0));
117 @Override public void aload_1() {
118 add( insnFactory.aload(1));
122 @Override public void aload_2() {
123 add( insnFactory.aload(2));
127 @Override public void aload_3() {
128 add( insnFactory.aload(3));
132 @Override public void aaload() {
133 add( insnFactory.aaload());
137 @Override public void astore(int localVarIndex) {
138 add( insnFactory.astore(localVarIndex));
146 @Override public void astore_0() {
147 add( insnFactory.astore(0));
151 @Override public void astore_1() {
152 add( insnFactory.astore(1));
156 @Override public void astore_2() {
157 add( insnFactory.astore(2));
161 @Override public void astore_3() {
162 add( insnFactory.astore(3));
166 @Override public void aastore() {
167 add( insnFactory.aastore());
171 @Override public void areturn() {
172 add( insnFactory.areturn());
176 @Override public void anewarray(int cpClassIndex) {
177 String clsName = cf.classNameAt(cpClassIndex);
178 add( insnFactory.anewarray(clsName));
182 @Override public void arraylength() {
183 add( insnFactory.arraylength());
187 @Override public void athrow() {
188 add( insnFactory.athrow());
192 @Override public void baload() {
193 add( insnFactory.baload());
197 @Override public void bastore() {
198 add( insnFactory.bastore());
202 @Override public void bipush(int b) {
203 add( insnFactory.bipush(b));
207 @Override public void caload() {
208 add( insnFactory.caload());
212 @Override public void castore() {
213 add( insnFactory.castore());
217 @Override public void checkcast(int cpClassIndex) {
218 String clsName = cf.classNameAt(cpClassIndex);
219 add( insnFactory.checkcast(clsName));
223 @Override public void d2f() {
224 add( insnFactory.d2f());
228 @Override public void d2i() {
229 add( insnFactory.d2i());
233 @Override public void d2l() {
234 add( insnFactory.d2l());
238 @Override public void dadd() {
239 add( insnFactory.dadd());
243 @Override public void daload() {
244 add( insnFactory.daload());
248 @Override public void dastore() {
249 add( insnFactory.dastore());
253 @Override public void dcmpg() {
254 add( insnFactory.dcmpg());
258 @Override public void dcmpl() {
259 add( insnFactory.dcmpl());
263 @Override public void dconst_0() {
264 add( insnFactory.dconst_0());
268 @Override public void dconst_1() {
269 add( insnFactory.dconst_1());
273 @Override public void ddiv() {
274 add( insnFactory.ddiv());
278 @Override public void dload(int localVarIndex) {
279 add( insnFactory.dload(localVarIndex));
287 @Override public void dload_0() {
288 add( insnFactory.dload(0));
292 @Override public void dload_1() {
293 add( insnFactory.dload(1));
297 @Override public void dload_2() {
298 add( insnFactory.dload(2));
302 @Override public void dload_3() {
303 add( insnFactory.dload(3));
307 @Override public void dmul() {
308 add( insnFactory.dmul());
312 @Override public void dneg() {
313 add( insnFactory.dneg());
317 @Override public void drem() {
318 add( insnFactory.drem());
322 @Override public void dreturn() {
323 add( insnFactory.dreturn());
327 @Override public void dstore(int localVarIndex) {
328 add( insnFactory.dstore(localVarIndex));
336 @Override public void dstore_0() {
337 add( insnFactory.dstore(0));
341 @Override public void dstore_1() {
342 add( insnFactory.dstore(1));
346 @Override public void dstore_2() {
347 add( insnFactory.dstore(2));
351 @Override public void dstore_3() {
352 add( insnFactory.dstore(3));
356 @Override public void dsub() {
357 add( insnFactory.dsub());
361 @Override public void dup() {
362 add( insnFactory.dup());
366 @Override public void dup_x1() {
367 add( insnFactory.dup_x1());
371 @Override public void dup_x2() {
372 add( insnFactory.dup_x2());
376 @Override public void dup2() {
377 add( insnFactory.dup2());
381 @Override public void dup2_x1() {
382 add( insnFactory.dup2_x1());
386 @Override public void dup2_x2() {
387 add( insnFactory.dup2_x2());
391 @Override public void f2d() {
392 add( insnFactory.f2d());
396 @Override public void f2i() {
397 add( insnFactory.f2i());
401 @Override public void f2l() {
402 add( insnFactory.f2l());
406 @Override public void fadd() {
407 add( insnFactory.fadd());
411 @Override public void faload() {
412 add( insnFactory.faload());
416 @Override public void fastore() {
417 add( insnFactory.fastore());
421 @Override public void fcmpg() {
422 add( insnFactory.fcmpg());
426 @Override public void fcmpl() {
427 add( insnFactory.fcmpl());
431 @Override public void fconst_0() {
432 add( insnFactory.fconst_0());
436 @Override public void fconst_1() {
437 add( insnFactory.fconst_1());
441 @Override public void fconst_2() {
442 add( insnFactory.fconst_2());
446 @Override public void fdiv() {
447 add( insnFactory.fdiv());
451 @Override public void fload(int localVarIndex) {
452 add( insnFactory.fload(localVarIndex));
460 @Override public void fload_0() {
461 add( insnFactory.fload(0));
465 @Override public void fload_1() {
466 add( insnFactory.fload(1));
470 @Override public void fload_2() {
471 add( insnFactory.fload(2));
475 @Override public void fload_3() {
476 add( insnFactory.fload(3));
480 @Override public void fmul() {
481 add( insnFactory.fmul());
485 @Override public void fneg() {
486 add( insnFactory.fneg());
490 @Override public void frem() {
491 add( insnFactory.frem());
495 @Override public void freturn() {
496 add( insnFactory.freturn());
500 @Override public void fstore(int localVarIndex) {
501 add( insnFactory.fstore(localVarIndex));
509 @Override public void fstore_0() {
510 add( insnFactory.fstore(0));
514 @Override public void fstore_1() {
515 add( insnFactory.fstore(1));
519 @Override public void fstore_2() {
520 add( insnFactory.fstore(2));
524 @Override public void fstore_3() {
525 add( insnFactory.fstore(3));
529 @Override public void fsub() {
530 add( insnFactory.fsub());
534 @Override public void getfield(int cpFieldRefIndex) {
535 String fieldName = cf.fieldNameAt(cpFieldRefIndex);
536 String clsName = cf.fieldClassNameAt(cpFieldRefIndex);
537 String fieldDescriptor = cf.fieldDescriptorAt(cpFieldRefIndex);
539 add( insnFactory.getfield(fieldName, clsName, fieldDescriptor));
542 public void getfield(String fieldName, String clsName, String fieldDescriptor){
543 add( insnFactory.getfield(fieldName, clsName, fieldDescriptor));
547 @Override public void getstatic(int cpFieldRefIndex) {
548 String fieldName = cf.fieldNameAt(cpFieldRefIndex);
549 String clsName = cf.fieldClassNameAt(cpFieldRefIndex);
550 String fieldDescriptor = cf.fieldDescriptorAt(cpFieldRefIndex);
552 add( insnFactory.getstatic(fieldName, clsName, fieldDescriptor));
555 public void getstatic(String fieldName, String clsName, String fieldDescriptor){
556 add( insnFactory.getstatic(fieldName, clsName, fieldDescriptor));
560 @Override public void goto_(int pcOffset) {
561 add( insnFactory.goto_(pc + pcOffset));
565 @Override public void goto_w(int pcOffset) {
566 add( insnFactory.goto_w(pc + pcOffset));
570 @Override public void i2b() {
571 add( insnFactory.i2b());
575 @Override public void i2c() {
576 add( insnFactory.i2c());
580 @Override public void i2d() {
581 add( insnFactory.i2d());
585 @Override public void i2f() {
586 add( insnFactory.i2f());
590 @Override public void i2l() {
591 add( insnFactory.i2l());
595 @Override public void i2s() {
596 add( insnFactory.i2s());
600 @Override public void iadd() {
601 add( insnFactory.iadd());
605 @Override public void iaload() {
606 add( insnFactory.iaload());
610 @Override public void iand() {
611 add( insnFactory.iand());
615 @Override public void iastore() {
616 add( insnFactory.iastore());
620 @Override public void iconst_m1() {
621 add( insnFactory.iconst_m1());
625 @Override public void iconst_0() {
626 add( insnFactory.iconst_0());
630 @Override public void iconst_1() {
631 add( insnFactory.iconst_1());
635 @Override public void iconst_2() {
636 add( insnFactory.iconst_2());
640 @Override public void iconst_3() {
641 add( insnFactory.iconst_3());
645 @Override public void iconst_4() {
646 add( insnFactory.iconst_4());
650 @Override public void iconst_5() {
651 add( insnFactory.iconst_5());
655 @Override public void idiv() {
656 add( insnFactory.idiv());
660 @Override public void if_acmpeq(int pcOffset) {
661 add( insnFactory.if_acmpeq(pc + pcOffset));
665 @Override public void if_acmpne(int pcOffset) {
666 add( insnFactory.if_acmpne(pc + pcOffset));
670 @Override public void if_icmpeq(int pcOffset) {
671 add( insnFactory.if_icmpeq(pc + pcOffset));
675 @Override public void if_icmpne(int pcOffset) {
676 add( insnFactory.if_icmpne(pc + pcOffset));
680 @Override public void if_icmplt(int pcOffset) {
681 add( insnFactory.if_icmplt(pc + pcOffset));
685 @Override public void if_icmpge(int pcOffset) {
686 add( insnFactory.if_icmpge(pc + pcOffset));
690 @Override public void if_icmpgt(int pcOffset) {
691 add( insnFactory.if_icmpgt(pc + pcOffset));
695 @Override public void if_icmple(int pcOffset) {
696 add( insnFactory.if_icmple(pc + pcOffset));
700 @Override public void ifeq(int pcOffset) {
701 add( insnFactory.ifeq(pc + pcOffset));
705 @Override public void ifne(int pcOffset) {
706 add( insnFactory.ifne(pc + pcOffset));
710 @Override public void iflt(int pcOffset) {
711 add( insnFactory.iflt(pc + pcOffset));
715 @Override public void ifge(int pcOffset) {
716 add( insnFactory.ifge(pc + pcOffset));
720 @Override public void ifgt(int pcOffset) {
721 add( insnFactory.ifgt(pc + pcOffset));
725 @Override public void ifle(int pcOffset) {
726 add( insnFactory.ifle(pc + pcOffset));
730 @Override public void ifnonnull(int pcOffset) {
731 add( insnFactory.ifnonnull(pc + pcOffset));
735 @Override public void ifnull(int pcOffset) {
736 add( insnFactory.ifnull(pc + pcOffset));
740 @Override public void iinc(int localVarIndex, int incConstant) {
741 add( insnFactory.iinc(localVarIndex, incConstant));
749 @Override public void iload(int localVarIndex) {
750 add( insnFactory.iload(localVarIndex));
758 @Override public void iload_0() {
759 add( insnFactory.iload(0));
763 @Override public void iload_1() {
764 add( insnFactory.iload(1));
768 @Override public void iload_2() {
769 add( insnFactory.iload(2));
773 @Override public void iload_3() {
774 add( insnFactory.iload(3));
778 @Override public void imul() {
779 add( insnFactory.imul());
783 @Override public void ineg() {
784 add( insnFactory.ineg());
788 @Override public void instanceof_(int cpClassIndex) {
789 String clsName = cf.classNameAt(cpClassIndex);
790 add( insnFactory.instanceof_(clsName));
794 @Override public void invokeinterface(int cpInterfaceMethodRefIndex, int count, int zero) {
795 String clsName = cf.interfaceMethodClassNameAt(cpInterfaceMethodRefIndex);
796 String methodName = cf.interfaceMethodNameAt(cpInterfaceMethodRefIndex);
797 String methodSignature = cf.interfaceMethodDescriptorAt(cpInterfaceMethodRefIndex);
799 add( insnFactory.invokeinterface(clsName, methodName, methodSignature));
802 public void invokeinterface(String clsName, String methodName, String methodSignature){
803 add( insnFactory.invokeinterface(clsName, methodName, methodSignature));
808 public void invokedynamic (int cpInvokeDynamicIndex){
809 int bootstrapMethodIndex = cf.bootstrapMethodIndex(cpInvokeDynamicIndex);
810 String samMethodName = cf.samMethodNameAt(cpInvokeDynamicIndex);
811 String callSiteDescriptor = cf.callSiteDescriptor(cpInvokeDynamicIndex);
812 add( insnFactory.invokedynamic(bootstrapMethodIndex, samMethodName, callSiteDescriptor));
816 @Override public void invokespecial(int cpMethodRefIndex) {
817 String clsName = cf.methodClassNameAt(cpMethodRefIndex);
818 String methodName = cf.methodNameAt(cpMethodRefIndex);
819 String methodSignature = cf.methodDescriptorAt(cpMethodRefIndex);
821 add( insnFactory.invokespecial(clsName, methodName, methodSignature));
824 public void invokespecial(String clsName, String methodName, String methodSignature){
825 add( insnFactory.invokespecial(clsName, methodName, methodSignature));
829 @Override public void invokestatic(int cpMethodRefIndex) {
830 String clsName = cf.methodClassNameAt(cpMethodRefIndex);
831 String methodName = cf.methodNameAt(cpMethodRefIndex);
832 String methodSignature = cf.methodDescriptorAt(cpMethodRefIndex);
834 add( insnFactory.invokestatic(clsName, methodName, methodSignature));
837 public void invokestatic(String clsName, String methodName, String methodSignature){
838 add( insnFactory.invokestatic(clsName, methodName, methodSignature));
842 @Override public void invokevirtual(int cpMethodRefIndex) {
843 String clsName = cf.methodClassNameAt(cpMethodRefIndex);
844 String methodName = cf.methodNameAt(cpMethodRefIndex);
845 String methodSignature = cf.methodDescriptorAt(cpMethodRefIndex);
847 add( insnFactory.invokevirtual(clsName, methodName, methodSignature));
850 public void invokevirtual(String clsName, String methodName, String methodSignature){
851 add( insnFactory.invokevirtual(clsName, methodName, methodSignature));
855 @Override public void ior() {
856 add( insnFactory.ior());
860 @Override public void irem() {
861 add( insnFactory.irem());
865 @Override public void ireturn() {
866 add( insnFactory.ireturn());
870 @Override public void ishl() {
871 add( insnFactory.ishl());
875 @Override public void ishr() {
876 add( insnFactory.ishr());
880 @Override public void istore(int localVarIndex) {
881 add( insnFactory.istore(localVarIndex));
889 @Override public void istore_0() {
890 add( insnFactory.istore(0));
894 @Override public void istore_1() {
895 add( insnFactory.istore(1));
899 @Override public void istore_2() {
900 add( insnFactory.istore(2));
904 @Override public void istore_3() {
905 add( insnFactory.istore(3));
909 @Override public void isub() {
910 add( insnFactory.isub());
914 @Override public void iushr() {
915 add( insnFactory.iushr());
919 @Override public void ixor() {
920 add( insnFactory.ixor());
924 @Override public void jsr(int pcOffset) {
925 add( insnFactory.jsr(pc + pcOffset));
929 @Override public void jsr_w(int pcOffset) {
930 add( insnFactory.jsr_w(pc + pcOffset));
934 @Override public void l2d() {
935 add( insnFactory.l2d());
939 @Override public void l2f() {
940 add( insnFactory.l2f());
944 @Override public void l2i() {
945 add( insnFactory.l2i());
949 @Override public void ladd() {
950 add( insnFactory.ladd());
954 @Override public void laload() {
955 add( insnFactory.laload());
959 @Override public void land() {
960 add( insnFactory.land());
964 @Override public void lastore() {
965 add( insnFactory.lastore());
969 @Override public void lcmp() {
970 add( insnFactory.lcmp());
974 @Override public void lconst_0() {
975 add( insnFactory.lconst_0());
979 @Override public void lconst_1() {
980 add( insnFactory.lconst_1());
984 @Override public void ldc_(int cpIntOrFloatOrStringOrClassIndex) {
985 Object v = cf.getCpValue(cpIntOrFloatOrStringOrClassIndex);
986 switch (cf.getCpTag(cpIntOrFloatOrStringOrClassIndex)){
987 case ClassFile.CONSTANT_INTEGER:
988 add( insnFactory.ldc((Integer)v)); break;
989 case ClassFile.CONSTANT_FLOAT:
990 add( insnFactory.ldc((Float)v)); break;
991 case ClassFile.CONSTANT_STRING:
992 add( insnFactory.ldc((String)v, false)); break;
993 case ClassFile.CONSTANT_CLASS:
994 add( insnFactory.ldc((String)v, true)); break;
999 @Override public void ldc_w_(int cpIntOrFloatOrStringOrClassIndex) {
1000 Object v = cf.getCpValue(cpIntOrFloatOrStringOrClassIndex);
1001 switch (cf.getCpTag(cpIntOrFloatOrStringOrClassIndex)){
1002 case ClassFile.CONSTANT_INTEGER:
1003 add( insnFactory.ldc_w((Integer) v)); break;
1004 case ClassFile.CONSTANT_FLOAT:
1005 add( insnFactory.ldc_w((Float) v)); break;
1006 case ClassFile.CONSTANT_STRING:
1007 add( insnFactory.ldc_w((String) v, false)); break;
1008 case ClassFile.CONSTANT_CLASS:
1009 add( insnFactory.ldc_w((String) v, true)); break;
1014 @Override public void ldc2_w(int cpLongOrDoubleIndex) {
1015 Object v = cf.getCpValue(cpLongOrDoubleIndex);
1016 if (v instanceof Long){
1017 add( insnFactory.ldc2_w((Long)v));
1019 add( insnFactory.ldc2_w((Double)v));
1024 @Override public void ldiv() {
1025 add( insnFactory.ldiv());
1029 @Override public void lload(int localVarIndex) {
1030 add( insnFactory.lload(localVarIndex));
1038 @Override public void lload_0() {
1039 add( insnFactory.lload(0));
1043 @Override public void lload_1() {
1044 add( insnFactory.lload(1));
1048 @Override public void lload_2() {
1049 add( insnFactory.lload(2));
1053 @Override public void lload_3() {
1054 add( insnFactory.lload(3));
1058 @Override public void lmul() {
1059 add( insnFactory.lmul());
1063 @Override public void lneg() {
1064 add( insnFactory.lneg());
1069 @Override public void lookupswitch(int defaultPcOffset, int nEntries) {
1070 Instruction insn = insnFactory.lookupswitch(pc + defaultPcOffset, nEntries);
1073 lookupswitchInsn = (LookupSwitchInstruction)insn;
1076 cf.parseLookupSwitchEntries(this, nEntries);
1079 pc = ((pc+4)>>2)<<2; // opcode and padding
1080 pc += 8 + nEntries*8; // arguments and lookup table
1082 @Override public void lookupswitchEntry(int index, int match, int pcOffset) {
1083 lookupswitchInsn.setTarget(index, match, pc + pcOffset);
1086 @Override public void lor() {
1087 add( insnFactory.lor());
1091 @Override public void lrem() {
1092 add( insnFactory.lrem());
1096 @Override public void lreturn() {
1097 add( insnFactory.lreturn());
1101 @Override public void lshl() {
1102 add( insnFactory.lshl());
1106 @Override public void lshr() {
1107 add( insnFactory.lshr());
1111 @Override public void lstore(int localVarIndex) {
1112 add( insnFactory.lstore(localVarIndex));
1120 @Override public void lstore_0() {
1121 add( insnFactory.lstore(0));
1125 @Override public void lstore_1() {
1126 add( insnFactory.lstore(1));
1130 @Override public void lstore_2() {
1131 add( insnFactory.lstore(2));
1135 @Override public void lstore_3() {
1136 add( insnFactory.lstore(3));
1140 @Override public void lsub() {
1141 add( insnFactory.lsub());
1145 @Override public void lushr() {
1146 add( insnFactory.lushr());
1150 @Override public void lxor() {
1151 add( insnFactory.lxor());
1155 @Override public void monitorenter() {
1156 add( insnFactory.monitorenter());
1160 @Override public void monitorexit() {
1161 add( insnFactory.monitorexit());
1165 @Override public void multianewarray(int cpClassIndex, int dimensions) {
1166 add( insnFactory.multianewarray(cf.classNameAt(cpClassIndex), dimensions));
1170 @Override public void new_(int cpClassIndex) {
1171 add( insnFactory.new_(cf.classNameAt(cpClassIndex)));
1174 public void new_(String className) {
1175 add( insnFactory.new_(className));
1179 @Override public void newarray(int typeCode) {
1180 add( insnFactory.newarray(typeCode));
1184 @Override public void nop() {
1185 add( insnFactory.nop());
1189 @Override public void pop() {
1190 add( insnFactory.pop());
1194 @Override public void pop2() {
1195 add( insnFactory.pop2());
1199 @Override public void putfield(int cpFieldRefIndex) {
1200 String fieldName = cf.fieldNameAt(cpFieldRefIndex);
1201 String clsName = cf.fieldClassNameAt(cpFieldRefIndex);
1202 String fieldDescriptor = cf.fieldDescriptorAt(cpFieldRefIndex);
1204 add( insnFactory.putfield(fieldName, clsName, fieldDescriptor));
1207 public void putfield(String fieldName, String clsName, String fieldDescriptor){
1208 add( insnFactory.putfield(fieldName, clsName, fieldDescriptor));
1213 @Override public void putstatic(int cpFieldRefIndex) {
1214 String fieldName = cf.fieldNameAt(cpFieldRefIndex);
1215 String clsName = cf.fieldClassNameAt(cpFieldRefIndex);
1216 String fieldDescriptor = cf.fieldDescriptorAt(cpFieldRefIndex);
1218 add( insnFactory.putstatic(fieldName, clsName, fieldDescriptor));
1221 public void putstatic(String fieldName, String clsName, String fieldDescriptor){
1222 add( insnFactory.putstatic(fieldName, clsName, fieldDescriptor));
1227 @Override public void ret(int localVarIndex) {
1228 add( insnFactory.ret(localVarIndex));
1236 @Override public void return_() {
1237 add( insnFactory.return_());
1241 @Override public void saload() {
1242 add( insnFactory.saload());
1246 @Override public void sastore() {
1247 add( insnFactory.sastore());
1251 @Override public void sipush(int val) {
1252 add( insnFactory.sipush(val));
1256 @Override public void swap() {
1257 add( insnFactory.swap());
1261 @Override public void tableswitch(int defaultPcOffset, int low, int high) {
1262 Instruction insn = insnFactory.tableswitch(pc + defaultPcOffset, low, high);
1265 tableswitchInsn = (TableSwitchInstruction)insn;
1268 cf.parseTableSwitchEntries(this, low, high);
1271 pc = ((pc+4)>>2)<<2; // opcode and padding
1272 pc+=12 + (high-low+1)*4; // the fixed args and jump table
1275 @Override public void tableswitchEntry(int value, int pcOffset) {
1276 tableswitchInsn.setTarget(value, pc + pcOffset);
1279 @Override public void wide() {
1280 add( insnFactory.wide());
1285 @Override public void unknown(int bytecode) {
1286 throw new JPFException("unknown bytecode: " + Integer.toHexString(bytecode));
1290 //--- the JPF specific ones (only used in synthetic methods)
1291 public void invokecg(List<Invocation> invokes) {
1292 add (insnFactory.invokecg(invokes));
1296 public void invokeclinit(ClassInfo ci) {
1297 add( insnFactory.invokeclinit(ci));
1301 public void finishclinit (ClassInfo ci){
1302 add (insnFactory.finishclinit(ci));
1306 public void directcallreturn(){
1307 add( insnFactory.directcallreturn());
1311 public void executenative(NativeMethodInfo mi){
1312 add( insnFactory.executenative(mi));
1316 public void nativereturn(){
1317 add( insnFactory.nativereturn());
1321 public void runStart (MethodInfo mi){
1322 add( insnFactory.runstart(mi));