diff src/main/gov/nasa/jpf/jvm/JVMCodeBuilder.java @ 0:61d41facf527

initial v8 import (history reset)
author Peter Mehlitz <Peter.C.Mehlitz@nasa.gov>
date Fri, 23 Jan 2015 10:14:01 -0800
parents
children 6774e2e08d37
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/gov/nasa/jpf/jvm/JVMCodeBuilder.java	Fri Jan 23 10:14:01 2015 -0800
@@ -0,0 +1,1313 @@
+/*
+ * Copyright (C) 2014, United States Government, as represented by the
+ * Administrator of the National Aeronautics and Space Administration.
+ * All rights reserved.
+ *
+ * The Java Pathfinder core (jpf-core) platform is licensed under the
+ * Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ * 
+ *        http://www.apache.org/licenses/LICENSE-2.0. 
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and 
+ * limitations under the License.
+ */
+
+package gov.nasa.jpf.jvm;
+
+import gov.nasa.jpf.JPFException;
+import gov.nasa.jpf.util.Invocation;
+import gov.nasa.jpf.vm.ClassInfo;
+import gov.nasa.jpf.vm.Instruction;
+import gov.nasa.jpf.vm.bytecode.LookupSwitchInstruction;
+import gov.nasa.jpf.vm.MethodInfo;
+import gov.nasa.jpf.vm.NativeMethodInfo;
+import gov.nasa.jpf.vm.bytecode.TableSwitchInstruction;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * a special JVMByteCodeReader implementation that builds code arrays for
+ * MethodInfos, setting index and pc on the fly
+ */
+public class JVMCodeBuilder implements JVMByteCodeReader {
+
+  protected JVMInstructionFactory insnFactory;
+  
+  protected ClassFile cf;
+  protected MethodInfo mi;
+
+  // have to cache these to set switch entries
+  // <2do> these should use interface types to avoid hardwiring our own instruction classes
+  protected TableSwitchInstruction tableswitchInsn;
+  protected LookupSwitchInstruction lookupswitchInsn;
+
+  protected ArrayList<Instruction> code;
+
+  protected int pc; // bytecode position within method code
+  protected int idx; // instruction index within MethodInfo
+
+  // flag to remember wide immediate operand modification
+  boolean isWide;
+  
+  //--- for testing purposes
+  protected JVMCodeBuilder (JVMInstructionFactory ifact){
+    this.code = new ArrayList<Instruction>(64);
+    this.insnFactory = ifact;
+  }
+
+  
+  
+  // this is dangerous - it enables reuse of CodeBuilders, but
+  // you better make sure this does not get recursive or is used concurrently
+  public void reset (ClassFile classFile, MethodInfo targetMethod){
+    this.cf = classFile;
+    this.mi = targetMethod;
+
+    pc = 0;
+    idx = 0;
+    isWide = false;
+
+    tableswitchInsn = null;
+    lookupswitchInsn = null;
+
+    code.clear();
+  }
+  
+  protected void add(Instruction insn){
+    insn.setMethodInfo(mi);
+    insn.setLocation(idx++, pc);
+    code.add(insn);
+  }
+
+  public void installCode(){
+    Instruction[] a = code.toArray( new Instruction[code.size()]);
+    mi.setCode(a);
+  }
+  
+  //--- the factory methods
+
+  @Override public void aconst_null() {
+    add( insnFactory.aconst_null());
+    pc++;
+  }
+
+  @Override public void aload(int localVarIndex) {
+    add( insnFactory.aload(localVarIndex));
+    pc+=2;
+    if (isWide){
+      pc++;
+      isWide = false;
+    }
+  }
+
+  @Override public void aload_0() {
+    add( insnFactory.aload(0));
+    pc++;
+  }
+
+  @Override public void aload_1() {
+    add( insnFactory.aload(1));
+    pc++;
+  }
+
+  @Override public void aload_2() {
+    add( insnFactory.aload(2));
+    pc++;
+  }
+
+  @Override public void aload_3() {
+    add( insnFactory.aload(3));
+    pc++;
+  }
+
+  @Override public void aaload() {
+    add( insnFactory.aaload());
+    pc++;
+  }
+
+  @Override public void astore(int localVarIndex) {
+    add( insnFactory.astore(localVarIndex));
+    pc+=2;
+    if (isWide){
+      pc++;
+      isWide = false;
+    }
+  }
+
+  @Override public void astore_0() {
+    add( insnFactory.astore(0));
+    pc++;
+  }
+
+  @Override public void astore_1() {
+    add( insnFactory.astore(1));
+    pc++;
+  }
+
+  @Override public void astore_2() {
+    add( insnFactory.astore(2));
+    pc++;
+  }
+
+  @Override public void astore_3() {
+    add( insnFactory.astore(3));
+    pc++;
+  }
+
+  @Override public void aastore() {
+    add( insnFactory.aastore());
+    pc++;
+  }
+
+  @Override public void areturn() {
+    add( insnFactory.areturn());
+    pc++;
+  }
+
+  @Override public void anewarray(int cpClassIndex) {
+    String clsName = cf.classNameAt(cpClassIndex);
+    add( insnFactory.anewarray(clsName));
+    pc+=3;
+  }
+
+  @Override public void arraylength() {
+    add( insnFactory.arraylength());
+    pc++;
+  }
+
+  @Override public void athrow() {
+    add( insnFactory.athrow());
+    pc++;
+  }
+
+  @Override public void baload() {
+    add( insnFactory.baload());
+    pc++;
+  }
+
+  @Override public void bastore() {
+    add( insnFactory.bastore());
+    pc++;
+  }
+
+  @Override public void bipush(int b) {
+    add( insnFactory.bipush(b));
+    pc+=2;
+  }
+
+  @Override public void caload() {
+    add( insnFactory.caload());
+    pc++;
+  }
+
+  @Override public void castore() {
+    add( insnFactory.castore());
+    pc++;
+  }
+
+  @Override public void checkcast(int cpClassIndex) {
+    String clsName = cf.classNameAt(cpClassIndex);
+    add( insnFactory.checkcast(clsName));
+    pc+=3;
+  }
+
+  @Override public void d2f() {
+    add( insnFactory.d2f());
+    pc++;
+  }
+
+  @Override public void d2i() {
+    add( insnFactory.d2i());
+    pc++;
+  }
+
+  @Override public void d2l() {
+    add( insnFactory.d2l());
+    pc++;
+  }
+
+  @Override public void dadd() {
+    add( insnFactory.dadd());
+    pc++;
+  }
+
+  @Override public void daload() {
+    add( insnFactory.daload());
+    pc++;
+  }
+
+  @Override public void dastore() {
+    add( insnFactory.dastore());
+    pc++;
+  }
+
+  @Override public void dcmpg() {
+    add( insnFactory.dcmpg());
+    pc++;
+  }
+
+  @Override public void dcmpl() {
+    add( insnFactory.dcmpl());
+    pc++;
+  }
+
+  @Override public void dconst_0() {
+    add( insnFactory.dconst_0());
+    pc++;
+  }
+
+  @Override public void dconst_1() {
+    add( insnFactory.dconst_1());
+    pc++;
+  }
+
+  @Override public void ddiv() {
+    add( insnFactory.ddiv());
+    pc++;
+  }
+
+  @Override public void dload(int localVarIndex) {
+    add( insnFactory.dload(localVarIndex));
+    pc+=2;
+    if (isWide){
+      pc++;
+      isWide = false;
+    }
+  }
+
+  @Override public void dload_0() {
+    add( insnFactory.dload(0));
+    pc++;
+  }
+
+  @Override public void dload_1() {
+    add( insnFactory.dload(1));
+    pc++;
+  }
+
+  @Override public void dload_2() {
+    add( insnFactory.dload(2));
+    pc++;
+  }
+
+  @Override public void dload_3() {
+    add( insnFactory.dload(3));
+    pc++;
+  }
+
+  @Override public void dmul() {
+    add( insnFactory.dmul());
+    pc++;
+  }
+
+  @Override public void dneg() {
+    add( insnFactory.dneg());
+    pc++;
+  }
+
+  @Override public void drem() {
+    add( insnFactory.drem());
+    pc++;
+  }
+
+  @Override public void dreturn() {
+    add( insnFactory.dreturn());
+    pc++;
+  }
+
+  @Override public void dstore(int localVarIndex) {
+    add( insnFactory.dstore(localVarIndex));
+    pc+=2;
+    if (isWide){
+      pc++;
+      isWide = false;
+    }
+  }
+
+  @Override public void dstore_0() {
+    add( insnFactory.dstore(0));
+    pc++;
+  }
+
+  @Override public void dstore_1() {
+    add( insnFactory.dstore(1));
+    pc++;
+  }
+
+  @Override public void dstore_2() {
+    add( insnFactory.dstore(2));
+    pc++;
+  }
+
+  @Override public void dstore_3() {
+    add( insnFactory.dstore(3));
+    pc++;
+  }
+
+  @Override public void dsub() {
+    add( insnFactory.dsub());
+    pc++;
+  }
+
+  @Override public void dup() {
+    add( insnFactory.dup());
+    pc++;
+  }
+
+  @Override public void dup_x1() {
+    add( insnFactory.dup_x1());
+    pc++;
+  }
+
+  @Override public void dup_x2() {
+    add( insnFactory.dup_x2());
+    pc++;
+  }
+
+  @Override public void dup2() {
+    add( insnFactory.dup2());
+    pc++;
+  }
+
+  @Override public void dup2_x1() {
+    add( insnFactory.dup2_x1());
+    pc++;
+  }
+
+  @Override public void dup2_x2() {
+    add( insnFactory.dup2_x2());
+    pc++;
+  }
+
+  @Override public void f2d() {
+    add( insnFactory.f2d());
+    pc++;
+  }
+
+  @Override public void f2i() {
+    add( insnFactory.f2i());
+    pc++;
+  }
+
+  @Override public void f2l() {
+    add( insnFactory.f2l());
+    pc++;
+  }
+
+  @Override public void fadd() {
+    add( insnFactory.fadd());
+    pc++;
+  }
+
+  @Override public void faload() {
+    add( insnFactory.faload());
+    pc++;
+  }
+
+  @Override public void fastore() {
+    add( insnFactory.fastore());
+    pc++;
+  }
+
+  @Override public void fcmpg() {
+    add( insnFactory.fcmpg());
+    pc++;
+  }
+
+  @Override public void fcmpl() {
+    add( insnFactory.fcmpl());
+    pc++;
+  }
+
+  @Override public void fconst_0() {
+    add( insnFactory.fconst_0());
+    pc++;
+  }
+
+  @Override public void fconst_1() {
+    add( insnFactory.fconst_1());
+    pc++;
+  }
+
+  @Override public void fconst_2() {
+    add( insnFactory.fconst_2());
+    pc++;
+  }
+
+  @Override public void fdiv() {
+    add( insnFactory.fdiv());
+    pc++;
+  }
+
+  @Override public void fload(int localVarIndex) {
+    add( insnFactory.fload(localVarIndex));
+    pc+=2;
+    if (isWide){
+      pc++;
+      isWide = false;
+    }
+  }
+
+  @Override public void fload_0() {
+    add( insnFactory.fload(0));
+    pc++;
+  }
+
+  @Override public void fload_1() {
+    add( insnFactory.fload(1));
+    pc++;
+  }
+
+  @Override public void fload_2() {
+    add( insnFactory.fload(2));
+    pc++;
+  }
+
+  @Override public void fload_3() {
+    add( insnFactory.fload(3));
+    pc++;
+  }
+
+  @Override public void fmul() {
+    add( insnFactory.fmul());
+    pc++;
+  }
+
+  @Override public void fneg() {
+    add( insnFactory.fneg());
+    pc++;
+  }
+
+  @Override public void frem() {
+    add( insnFactory.frem());
+    pc++;
+  }
+
+  @Override public void freturn() {
+    add( insnFactory.freturn());
+    pc++;
+  }
+
+  @Override public void fstore(int localVarIndex) {
+    add( insnFactory.fstore(localVarIndex));
+    pc+=2;
+    if (isWide){
+      pc++;
+      isWide = false;
+    }
+  }
+
+  @Override public void fstore_0() {
+    add( insnFactory.fstore(0));
+    pc++;
+  }
+
+  @Override public void fstore_1() {
+    add( insnFactory.fstore(1));
+    pc++;
+  }
+
+  @Override public void fstore_2() {
+    add( insnFactory.fstore(2));
+    pc++;
+  }
+
+  @Override public void fstore_3() {
+    add( insnFactory.fstore(3));
+    pc++;
+  }
+
+  @Override public void fsub() {
+    add( insnFactory.fsub());
+    pc++;
+  }
+
+  @Override public void getfield(int cpFieldRefIndex) {
+    String fieldName = cf.fieldNameAt(cpFieldRefIndex);
+    String clsName = cf.fieldClassNameAt(cpFieldRefIndex);
+    String fieldDescriptor = cf.fieldDescriptorAt(cpFieldRefIndex);
+
+    add( insnFactory.getfield(fieldName, clsName, fieldDescriptor));
+    pc+=3;
+  }
+  public void getfield(String fieldName, String clsName, String fieldDescriptor){
+    add( insnFactory.getfield(fieldName, clsName, fieldDescriptor));
+    pc+=3;
+  }
+
+  @Override public void getstatic(int cpFieldRefIndex) {
+    String fieldName = cf.fieldNameAt(cpFieldRefIndex);
+    String clsName = cf.fieldClassNameAt(cpFieldRefIndex);
+    String fieldDescriptor = cf.fieldDescriptorAt(cpFieldRefIndex);
+
+    add( insnFactory.getstatic(fieldName, clsName, fieldDescriptor));
+    pc+=3;
+  }
+  public void getstatic(String fieldName, String clsName, String fieldDescriptor){
+    add( insnFactory.getstatic(fieldName, clsName, fieldDescriptor));
+    pc+=3;
+  }
+
+  @Override public void goto_(int pcOffset) {
+    add( insnFactory.goto_(pc + pcOffset));
+    pc+=3;
+  }
+
+  @Override public void goto_w(int pcOffset) {
+    add( insnFactory.goto_w(pc + pcOffset));
+    pc+=5;
+  }
+
+  @Override public void i2b() {
+    add( insnFactory.i2b());
+    pc++;
+  }
+
+  @Override public void i2c() {
+    add( insnFactory.i2c());
+    pc++;
+  }
+
+  @Override public void i2d() {
+    add( insnFactory.i2d());
+    pc++;
+  }
+
+  @Override public void i2f() {
+    add( insnFactory.i2f());
+    pc++;
+  }
+
+  @Override public void i2l() {
+    add( insnFactory.i2l());
+    pc++;
+  }
+
+  @Override public void i2s() {
+    add( insnFactory.i2s());
+    pc++;
+  }
+
+  @Override public void iadd() {
+    add( insnFactory.iadd());
+    pc++;
+  }
+
+  @Override public void iaload() {
+    add( insnFactory.iaload());
+    pc++;
+  }
+
+  @Override public void iand() {
+    add( insnFactory.iand());
+    pc++;
+  }
+
+  @Override public void iastore() {
+    add( insnFactory.iastore());
+    pc++;
+  }
+
+  @Override public void iconst_m1() {
+    add( insnFactory.iconst_m1());
+    pc++;
+  }
+
+  @Override public void iconst_0() {
+    add( insnFactory.iconst_0());
+    pc++;
+  }
+
+  @Override public void iconst_1() {
+    add( insnFactory.iconst_1());
+    pc++;
+  }
+
+  @Override public void iconst_2() {
+    add( insnFactory.iconst_2());
+    pc++;
+  }
+
+  @Override public void iconst_3() {
+    add( insnFactory.iconst_3());
+    pc++;
+  }
+
+  @Override public void iconst_4() {
+    add( insnFactory.iconst_4());
+    pc++;
+  }
+
+  @Override public void iconst_5() {
+    add( insnFactory.iconst_5());
+    pc++;
+  }
+
+  @Override public void idiv() {
+    add( insnFactory.idiv());
+    pc++;
+  }
+
+  @Override public void if_acmpeq(int pcOffset) {
+    add( insnFactory.if_acmpeq(pc + pcOffset));
+    pc+=3;
+  }
+
+  @Override public void if_acmpne(int pcOffset) {
+    add( insnFactory.if_acmpne(pc + pcOffset));
+    pc+=3;
+  }
+
+  @Override public void if_icmpeq(int pcOffset) {
+    add( insnFactory.if_icmpeq(pc + pcOffset));
+    pc+=3;
+  }
+
+  @Override public void if_icmpne(int pcOffset) {
+    add( insnFactory.if_icmpne(pc + pcOffset));
+    pc+=3;
+  }
+
+  @Override public void if_icmplt(int pcOffset) {
+    add( insnFactory.if_icmplt(pc + pcOffset));
+    pc+=3;
+  }
+
+  @Override public void if_icmpge(int pcOffset) {
+    add( insnFactory.if_icmpge(pc + pcOffset));
+    pc+=3;
+  }
+
+  @Override public void if_icmpgt(int pcOffset) {
+    add( insnFactory.if_icmpgt(pc + pcOffset));
+    pc+=3;
+  }
+
+  @Override public void if_icmple(int pcOffset) {
+    add( insnFactory.if_icmple(pc + pcOffset));
+    pc+=3;
+  }
+
+  @Override public void ifeq(int pcOffset) {
+    add( insnFactory.ifeq(pc + pcOffset));
+    pc+=3;
+  }
+
+  @Override public void ifne(int pcOffset) {
+    add( insnFactory.ifne(pc + pcOffset));
+    pc+=3;
+  }
+
+  @Override public void iflt(int pcOffset) {
+    add( insnFactory.iflt(pc + pcOffset));
+    pc+=3;
+  }
+
+  @Override public void ifge(int pcOffset) {
+    add( insnFactory.ifge(pc + pcOffset));
+    pc+=3;
+  }
+
+  @Override public void ifgt(int pcOffset) {
+    add( insnFactory.ifgt(pc + pcOffset));
+    pc+=3;
+  }
+
+  @Override public void ifle(int pcOffset) {
+    add( insnFactory.ifle(pc + pcOffset));
+    pc+=3;
+  }
+
+  @Override public void ifnonnull(int pcOffset) {
+    add( insnFactory.ifnonnull(pc + pcOffset));
+    pc+=3;
+  }
+
+  @Override public void ifnull(int pcOffset) {
+    add( insnFactory.ifnull(pc + pcOffset));
+    pc+=3;
+  }
+
+  @Override public void iinc(int localVarIndex, int incConstant) {
+    add( insnFactory.iinc(localVarIndex, incConstant));
+    pc+=3;
+    if (isWide){
+      pc+=2;
+      isWide = false;
+    }
+  }
+
+  @Override public void iload(int localVarIndex) {
+    add( insnFactory.iload(localVarIndex));
+    pc+=2;
+    if (isWide){
+      pc++;
+      isWide = false;
+    }
+  }
+
+  @Override public void iload_0() {
+    add( insnFactory.iload(0));
+    pc++;
+  }
+
+  @Override public void iload_1() {
+    add( insnFactory.iload(1));
+    pc++;
+  }
+
+  @Override public void iload_2() {
+    add( insnFactory.iload(2));
+    pc++;
+  }
+
+  @Override public void iload_3() {
+    add( insnFactory.iload(3));
+    pc++;
+  }
+
+  @Override public void imul() {
+    add( insnFactory.imul());
+    pc++;
+  }
+
+  @Override public void ineg() {
+    add( insnFactory.ineg());
+    pc++;
+  }
+
+  @Override public void instanceof_(int cpClassIndex) {
+    String clsName = cf.classNameAt(cpClassIndex);
+    add( insnFactory.instanceof_(clsName));
+    pc+=3;
+  }
+
+  @Override public void invokeinterface(int cpInterfaceMethodRefIndex, int count, int zero) {
+    String clsName = cf.interfaceMethodClassNameAt(cpInterfaceMethodRefIndex);
+    String methodName = cf.interfaceMethodNameAt(cpInterfaceMethodRefIndex);
+    String methodSignature = cf.interfaceMethodDescriptorAt(cpInterfaceMethodRefIndex);
+
+    add( insnFactory.invokeinterface(clsName, methodName, methodSignature));
+    pc+=5;
+  }
+  public void invokeinterface(String clsName, String methodName, String methodSignature){
+    add( insnFactory.invokeinterface(clsName, methodName, methodSignature));
+    pc+=5;
+  }
+
+  @Override
+  public void invokedynamic (int cpInvokeDynamicIndex){
+    int bootstrapMethodIndex = cf.bootstrapMethodIndex(cpInvokeDynamicIndex);
+    String samMethodName = cf.samMethodNameAt(cpInvokeDynamicIndex);
+    String callSiteDescriptor = cf.callSiteDescriptor(cpInvokeDynamicIndex);
+    add( insnFactory.invokedynamic(bootstrapMethodIndex, samMethodName, callSiteDescriptor));
+    pc+=5;
+  }
+  
+  @Override public void invokespecial(int cpMethodRefIndex) {
+    String clsName = cf.methodClassNameAt(cpMethodRefIndex);
+    String methodName = cf.methodNameAt(cpMethodRefIndex);
+    String methodSignature = cf.methodDescriptorAt(cpMethodRefIndex);
+
+    add( insnFactory.invokespecial(clsName, methodName, methodSignature));
+    pc+=3;
+  }
+  public void invokespecial(String clsName, String methodName, String methodSignature){
+    add( insnFactory.invokespecial(clsName, methodName, methodSignature));
+    pc+=3;
+  }
+
+  @Override public void invokestatic(int cpMethodRefIndex) {
+    String clsName = cf.methodClassNameAt(cpMethodRefIndex);
+    String methodName = cf.methodNameAt(cpMethodRefIndex);
+    String methodSignature = cf.methodDescriptorAt(cpMethodRefIndex);
+
+    add( insnFactory.invokestatic(clsName, methodName, methodSignature));
+    pc+=3;
+  }
+  public void invokestatic(String clsName, String methodName, String methodSignature){
+    add( insnFactory.invokestatic(clsName, methodName, methodSignature));
+    pc+=3;
+  }
+
+  @Override public void invokevirtual(int cpMethodRefIndex) {
+    String clsName = cf.methodClassNameAt(cpMethodRefIndex);
+    String methodName = cf.methodNameAt(cpMethodRefIndex);
+    String methodSignature = cf.methodDescriptorAt(cpMethodRefIndex);
+
+    add( insnFactory.invokevirtual(clsName, methodName, methodSignature));
+    pc+=3;
+  }
+  public void invokevirtual(String clsName, String methodName, String methodSignature){
+    add( insnFactory.invokevirtual(clsName, methodName, methodSignature));
+    pc+=3;
+  }
+
+  @Override public void ior() {
+    add( insnFactory.ior());
+    pc++;
+  }
+
+  @Override public void irem() {
+    add( insnFactory.irem());
+    pc++;
+  }
+
+  @Override public void ireturn() {
+    add( insnFactory.ireturn());
+    pc++;
+  }
+
+  @Override public void ishl() {
+    add( insnFactory.ishl());
+    pc++;
+  }
+
+  @Override public void ishr() {
+    add( insnFactory.ishr());
+    pc++;
+  }
+
+  @Override public void istore(int localVarIndex) {
+    add( insnFactory.istore(localVarIndex));
+    pc+=2;
+    if (isWide){
+      pc++;
+      isWide = false;
+    }
+  }
+
+  @Override public void istore_0() {
+    add( insnFactory.istore(0));
+    pc++;
+  }
+
+  @Override public void istore_1() {
+    add( insnFactory.istore(1));
+    pc++;
+  }
+
+  @Override public void istore_2() {
+    add( insnFactory.istore(2));
+    pc++;
+  }
+
+  @Override public void istore_3() {
+    add( insnFactory.istore(3));
+    pc++;
+  }
+
+  @Override public void isub() {
+    add( insnFactory.isub());
+    pc++;
+  }
+
+  @Override public void iushr() {
+    add( insnFactory.iushr());
+    pc++;
+  }
+
+  @Override public void ixor() {
+    add( insnFactory.ixor());
+    pc++;
+  }
+
+  @Override public void jsr(int pcOffset) {
+    add( insnFactory.jsr(pc + pcOffset));
+    pc+=3;
+  }
+
+  @Override public void jsr_w(int pcOffset) {
+    add( insnFactory.jsr_w(pc + pcOffset));
+    pc+=5;
+  }
+
+  @Override public void l2d() {
+    add( insnFactory.l2d());
+    pc++;
+  }
+
+  @Override public void l2f() {
+    add( insnFactory.l2f());
+    pc++;
+  }
+
+  @Override public void l2i() {
+    add( insnFactory.l2i());
+    pc++;
+  }
+
+  @Override public void ladd() {
+    add( insnFactory.ladd());
+    pc++;
+  }
+
+  @Override public void laload() {
+    add( insnFactory.laload());
+    pc++;
+  }
+
+  @Override public void land() {
+    add( insnFactory.land());
+    pc++;
+  }
+
+  @Override public void lastore() {
+    add( insnFactory.lastore());
+    pc++;
+  }
+
+  @Override public void lcmp() {
+    add( insnFactory.lcmp());
+    pc++;
+  }
+
+  @Override public void lconst_0() {
+    add( insnFactory.lconst_0());
+    pc++;
+  }
+
+  @Override public void lconst_1() {
+    add( insnFactory.lconst_1());
+    pc++;
+  }
+
+  @Override public void ldc_(int cpIntOrFloatOrStringOrClassIndex) {
+    Object v = cf.getCpValue(cpIntOrFloatOrStringOrClassIndex);
+    switch (cf.getCpTag(cpIntOrFloatOrStringOrClassIndex)){
+      case ClassFile.CONSTANT_INTEGER:
+        add( insnFactory.ldc((Integer)v)); break;
+      case ClassFile.CONSTANT_FLOAT:
+        add( insnFactory.ldc((Float)v)); break;
+      case ClassFile.CONSTANT_STRING:
+        add( insnFactory.ldc((String)v, false)); break;
+      case ClassFile.CONSTANT_CLASS:
+        add( insnFactory.ldc((String)v, true)); break;
+    }
+    pc+=2;
+  }
+
+  @Override public void ldc_w_(int cpIntOrFloatOrStringOrClassIndex) {
+    Object v = cf.getCpValue(cpIntOrFloatOrStringOrClassIndex);
+    switch (cf.getCpTag(cpIntOrFloatOrStringOrClassIndex)){
+      case ClassFile.CONSTANT_INTEGER:
+        add( insnFactory.ldc_w((Integer)v)); break;
+      case ClassFile.CONSTANT_FLOAT:
+        add( insnFactory.ldc_w((Float)v)); break;
+      case ClassFile.CONSTANT_STRING:
+        add( insnFactory.ldc_w((String)v, false)); break;
+      case ClassFile.CONSTANT_CLASS:
+        add( insnFactory.ldc_w((String)v, true)); break;
+    }
+    pc+=3;
+  }
+
+  @Override public void ldc2_w(int cpLongOrDoubleIndex) {
+    Object v = cf.getCpValue(cpLongOrDoubleIndex);
+    if (v instanceof Long){
+      add( insnFactory.ldc2_w((Long)v));
+    } else {
+      add( insnFactory.ldc2_w((Double)v));
+    }
+    pc+=3;
+  }
+
+  @Override public void ldiv() {
+    add( insnFactory.ldiv());
+    pc++;
+  }
+
+  @Override public void lload(int localVarIndex) {
+    add( insnFactory.lload(localVarIndex));
+    pc+=2;
+    if (isWide){
+      pc++;
+      isWide = false;
+    }
+  }
+
+  @Override public void lload_0() {
+    add( insnFactory.lload(0));
+    pc++;
+  }
+
+  @Override public void lload_1() {
+    add( insnFactory.lload(1));
+    pc++;
+  }
+
+  @Override public void lload_2() {
+    add( insnFactory.lload(2));
+    pc++;
+  }
+
+  @Override public void lload_3() {
+    add( insnFactory.lload(3));
+    pc++;
+  }
+
+  @Override public void lmul() {
+    add( insnFactory.lmul());
+    pc++;
+  }
+
+  @Override public void lneg() {
+    add( insnFactory.lneg());
+    pc++;
+  }
+
+
+  @Override public void lookupswitch(int defaultPcOffset, int nEntries) {
+    Instruction insn = insnFactory.lookupswitch(pc + defaultPcOffset, nEntries);
+    add( insn);
+
+    lookupswitchInsn = (LookupSwitchInstruction)insn;
+
+    if (cf != null){
+      cf.parseLookupSwitchEntries(this, nEntries);
+    }
+
+    pc = ((pc+4)>>2)<<2; // opcode and padding
+    pc += 8 + nEntries*8; // arguments and lookup table
+  }
+  @Override public void lookupswitchEntry(int index, int match, int pcOffset) {
+    lookupswitchInsn.setTarget(index, match, pc + pcOffset);
+  }
+
+  @Override public void lor() {
+    add( insnFactory.lor());
+    pc++;
+  }
+
+  @Override public void lrem() {
+    add( insnFactory.lrem());
+    pc++;
+  }
+
+  @Override public void lreturn() {
+    add( insnFactory.lreturn());
+    pc++;
+  }
+
+  @Override public void lshl() {
+    add( insnFactory.lshl());
+    pc++;
+  }
+
+  @Override public void lshr() {
+    add( insnFactory.lshr());
+    pc++;
+  }
+
+  @Override public void lstore(int localVarIndex) {
+    add( insnFactory.lstore(localVarIndex));
+    pc+=2;
+    if (isWide){
+      pc++;
+      isWide = false;
+    }
+  }
+
+  @Override public void lstore_0() {
+    add( insnFactory.lstore(0));
+    pc++;
+  }
+
+  @Override public void lstore_1() {
+    add( insnFactory.lstore(1));
+    pc++;
+  }
+
+  @Override public void lstore_2() {
+    add( insnFactory.lstore(2));
+    pc++;
+  }
+
+  @Override public void lstore_3() {
+    add( insnFactory.lstore(3));
+    pc++;
+  }
+
+  @Override public void lsub() {
+    add( insnFactory.lsub());
+    pc++;
+  }
+
+  @Override public void lushr() {
+    add( insnFactory.lushr());
+    pc++;
+  }
+
+  @Override public void lxor() {
+    add( insnFactory.lxor());
+    pc++;
+  }
+
+  @Override public void monitorenter() {
+    add( insnFactory.monitorenter());
+    pc++;
+  }
+
+  @Override public void monitorexit() {
+    add( insnFactory.monitorexit());
+    pc++;
+  }
+
+  @Override public void multianewarray(int cpClassIndex, int dimensions) {
+    add( insnFactory.multianewarray(cf.classNameAt(cpClassIndex), dimensions));
+    pc+=4;
+  }
+
+  @Override public void new_(int cpClassIndex) {
+    add( insnFactory.new_(cf.classNameAt(cpClassIndex)));
+    pc+=3;
+  }
+
+  @Override public void newarray(int typeCode) {
+    add( insnFactory.newarray(typeCode));
+    pc+=2;
+  }
+
+  @Override public void nop() {
+    add( insnFactory.nop());
+    pc++;
+  }
+
+  @Override public void pop() {
+    add( insnFactory.pop());
+    pc++;
+  }
+
+  @Override public void pop2() {
+    add( insnFactory.pop2());
+    pc++;
+  }
+
+  @Override public void putfield(int cpFieldRefIndex) {
+    String fieldName = cf.fieldNameAt(cpFieldRefIndex);
+    String clsName = cf.fieldClassNameAt(cpFieldRefIndex);
+    String fieldDescriptor = cf.fieldDescriptorAt(cpFieldRefIndex);
+
+    add( insnFactory.putfield(fieldName, clsName, fieldDescriptor));
+    pc+=3;
+  }
+  public void putfield(String fieldName, String clsName, String fieldDescriptor){
+    add( insnFactory.putfield(fieldName, clsName, fieldDescriptor));
+    pc+=3;
+  }
+
+
+  @Override public void putstatic(int cpFieldRefIndex) {
+    String fieldName = cf.fieldNameAt(cpFieldRefIndex);
+    String clsName = cf.fieldClassNameAt(cpFieldRefIndex);
+    String fieldDescriptor = cf.fieldDescriptorAt(cpFieldRefIndex);
+
+    add( insnFactory.putstatic(fieldName, clsName, fieldDescriptor));
+    pc+=3;
+  }
+  public void putstatic(String fieldName, String clsName, String fieldDescriptor){
+    add( insnFactory.putstatic(fieldName, clsName, fieldDescriptor));
+    pc+=3;
+  }
+
+
+  @Override public void ret(int localVarIndex) {
+    add( insnFactory.ret(localVarIndex));
+    pc+=2;
+    if (isWide){
+      pc++;
+      isWide = false;
+    }
+  }
+
+  @Override public void return_() {
+    add( insnFactory.return_());
+    pc++;
+  }
+
+  @Override public void saload() {
+    add( insnFactory.saload());
+    pc++;
+  }
+
+  @Override public void sastore() {
+    add( insnFactory.sastore());
+    pc++;
+  }
+
+  @Override public void sipush(int val) {
+    add( insnFactory.sipush(val));
+    pc+=3;
+  }
+
+  @Override public void swap() {
+    add( insnFactory.swap());
+    pc++;
+  }
+
+  @Override public void tableswitch(int defaultPcOffset, int low, int high) {
+    Instruction insn = insnFactory.tableswitch(pc + defaultPcOffset, low, high);
+    add( insn);
+    
+    tableswitchInsn = (TableSwitchInstruction)insn;
+
+    if (cf != null){
+      cf.parseTableSwitchEntries(this, low, high);
+    }
+
+    pc = ((pc+4)>>2)<<2; // opcode and padding
+    pc+=12 + (high-low+1)*4; // the fixed args and jump table
+  }
+
+  @Override public void tableswitchEntry(int value, int pcOffset) {
+    tableswitchInsn.setTarget(value, pc + pcOffset);
+  }
+
+  @Override public void wide() {
+    add( insnFactory.wide());
+    pc++;
+    isWide = true;
+  }
+
+  @Override public void unknown(int bytecode) {
+    throw new JPFException("unknown bytecode: " + Integer.toHexString(bytecode));
+  }
+
+
+  //--- the JPF specific ones (only used in synthetic methods)
+  public void invokecg(List<Invocation> invokes) {
+    add (insnFactory.invokecg(invokes));
+    pc++;
+  }
+
+  public void invokeclinit(ClassInfo ci) {
+    add( insnFactory.invokeclinit(ci));
+    pc++;
+  }
+
+  public void directcallreturn(){
+    add( insnFactory.directcallreturn());
+    pc++;
+  }
+
+  public void executenative(NativeMethodInfo mi){
+    add( insnFactory.executenative(mi));
+    pc++;
+  }
+
+  public void nativereturn(){
+    add( insnFactory.nativereturn());
+    pc++;
+  }
+
+  public void runStart (MethodInfo mi){
+    add( insnFactory.runstart(mi));
+    pc++;
+  }
+  
+}