view src/main/gov/nasa/jpf/jvm/JVMCodeBuilder.java @ 28:7be90179bb3b

Provided support for double colon operator used for lamabda expressions. Fixed a bug related to generating names for funcation object classes (by supporting double colon operator, a new stragety needed to generate unique names for function objects. To achive that the bootstrap ids are incorporated into names). Finally modified the method that retrieves the SAM from functional interfaces.
author nastaran <nastaran.shafiei@gmail.com>
date Thu, 25 Jun 2015 13:20:50 -0700
parents 6774e2e08d37
children
line wrap: on
line source

/*
 * 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);
  }

  public int getCodeSize(){
    return code.size();
  }

  //--- 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;
  }
  public void new_(String className) {
    add( insnFactory.new_(className));
    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 finishclinit (ClassInfo ci){
    add (insnFactory.finishclinit(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++;
  }

}