gt: 			int branchIndex, int target, int[] goals);
context: /**
   * Copyright (C) 2010-2017 Gordon Fraser, Andrea Arcuri and EvoSuite
   * contributors
   *
   * This file is part of EvoSuite.
   *
   * EvoSuite is free software: you can redistribute it and/or modify it
   * under the terms of the GNU Lesser General Public License as published
   * by the Free Software Foundation, either version 3.0 of the License, or
   * (at your option) any later version.
   *
   * EvoSuite is distributed in the hope that it will be useful, but
   * WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
   * Lesser Public License for more details.
   *
   * You should have received a copy of the GNU Lesser General Public
   * License along with EvoSuite. If not, see <http://www.gnu.org/licenses/>.
   */
  package org.evosuite.dse;
  
  /*
      This class is taken and adapted from the DSC tool developed by Christoph Csallner.
      Link at :
      http://ranger.uta.edu/~csallner/dsc/index.html
   */
  
  /**
   * @author csallner@uta.edu (Christoph Csallner)
   */
  public interface IVM {
  
  	/**
  	 * Pass a caller's nr-th concrete method argument value (which is sitting on
  	 * the caller's operand stack). There will be no such call for a potentially
  	 * present receiver instance ("this" parameter).
  	 * <p>
  	 * There is no CALLER_STACK_RECEIVER, as the receiver is already passed by
  	 * the corresponding INVOKE.
  	 * 
  	 * @param nr
  	 *            index of the parameter, not counting the receiver and ignoring
  	 *            the additional width of category-2 parameters. E.g., in
  	 *            foo(double a, int b) parameter b would always have nr 1,
  	 *            regardless of foo being an instance method or not.
  	 * @param calleeLocalsIndex
  	 *            is the index in which this value is stored in the receiver
  	 *            frame. In contrast to nr, this accounts for the receiver and
  	 *            the different widths of category-1 and category-2 parameter
  	 *            types.
  	 */
  	public void CALLER_STACK_PARAM(int nr, int calleeLocalsIndex, int value);
  
  	public void CALLER_STACK_PARAM(int nr, int calleeLocalsIndex, boolean value);
  
  	public void CALLER_STACK_PARAM(int nr, int calleeLocalsIndex, short value);
  
  	public void CALLER_STACK_PARAM(int nr, int calleeLocalsIndex, byte value);
  
  	public void CALLER_STACK_PARAM(int nr, int calleeLocalsIndex, char value);
  
  	public void CALLER_STACK_PARAM(int nr, int calleeLocalsIndex, long value);
  
  	public void CALLER_STACK_PARAM(int nr, int calleeLocalsIndex, float value);
  
  	public void CALLER_STACK_PARAM(int nr, int calleeLocalsIndex, double value);
  
  	public void CALLER_STACK_PARAM(int nr, int calleeLocalsIndex, Object value);
  
  	/**
  	 * Line number in the Java source code.
  	 */
  	public void SRC_LINE_NUMBER(int lineNr);
  
  	/**
  	 * Start of a new method
  	 */
  	public void METHOD_BEGIN(int access, String className, String methName,
  			String methDesc);
  
  	/**
  	 * Max values of a method
  	 */
  	public void METHOD_MAXS(String className, String methName, String methDesc,
  			int maxStack, int maxLocals);
  
  	/**
  	 * Pass index-th concrete parameter of the just called method. There will be
  	 * no such call for a potentially present receiver instance ("this"
  	 * parameter).
  	 * 
  	 * @param nr
  	 *            index of the parameter, not counting the receiver and ignoring
  	 *            the additional width of category-2 parameters. E.g., in
  	 *            foo(double a, int b) parameter b would always have nr 1,
  	 *            regardless of foo being an instance method or not.
  	 * @param calleeLocalsIndex
  	 *            is the index in which this value is stored in the receiver
  	 *            frame. In contrast to nr, this accounts for the receiver and
  	 *            the different widths of category-1 and category-2 parameter
  	 *            types.
  	 */
  	public void METHOD_BEGIN_PARAM(int nr, int calleeLocalsIndex, int value);
  
  	public void METHOD_BEGIN_PARAM(int nr, int calleeLocalsIndex, boolean value);
  
  	public void METHOD_BEGIN_PARAM(int nr, int calleeLocalsIndex, short value);
  
  	public void METHOD_BEGIN_PARAM(int nr, int calleeLocalsIndex, byte value);
  
  	public void METHOD_BEGIN_PARAM(int nr, int calleeLocalsIndex, char value);
  
  	public void METHOD_BEGIN_PARAM(int nr, int calleeLocalsIndex, long value);
  
  	public void METHOD_BEGIN_PARAM(int nr, int calleeLocalsIndex, float value);
  
  	public void METHOD_BEGIN_PARAM(int nr, int calleeLocalsIndex, double value);
  
  	public void METHOD_BEGIN_PARAM(int nr, int calleeLocalsIndex, Object value);
  
  	/**
  	 * METHOD_BEGIN_PARAM for the receiver instance ("this"), if this method is
  	 * a non-constructor instance method.
  	 */
  	public void METHOD_BEGIN_RECEIVER(Object value);
  
  	/**
  	 * Value returned by the just completed method call
  	 */
  	public void CALL_RESULT(String owner, String name, String desc);
  
  	public void CALL_RESULT(boolean res, String owner, String name, String desc);
  
  	public void CALL_RESULT(int res, String owner, String name, String desc);
  
  	public void CALL_RESULT(long res, String owner, String name, String desc);
  
  	public void CALL_RESULT(double res, String owner, String name, String desc);
  
  	public void CALL_RESULT(float res, String owner, String name, String desc);
  
  	public void CALL_RESULT(Object res, String owner, String name, String desc);
  
  	/**
  	 * Start of a new basic block
  	 */
  	public void BB_BEGIN();
  
  	public void HANDLER_BEGIN(int access, String className, String methName,
  			String methDesc);
  
  	/*
  	 * Some 200 JVM ByteCode instructions
  	 */
  
  	public void NOP();
  
  	public void ACONST_NULL();
  
  	public void ICONST_M1();
  
  	public void ICONST_0();
  
  	public void ICONST_1();
  
  	public void ICONST_2();
  
  	public void ICONST_3();
  
  	public void ICONST_4();
  
  	public void ICONST_5();
  
  	public void LCONST_0();
  
  	public void LCONST_1();
  
  	public void FCONST_0();
  
  	public void FCONST_1();
  
  	public void FCONST_2();
  
  	public void DCONST_0();
  
  	public void DCONST_1();
  
  	public void BIPUSH(int value);
  
  	public void SIPUSH(int value);
  
  	/**
  	 * http://java.sun.com/docs/books/jvms/second_edition/html/Instructions2.
  	 * doc8. html#ldc
  	 */
  	public void LDC(String x);
  
  	public void LDC(Class<?> x);
  
  	public void LDC(int x);
  
  	public void LDC(float x);
  
  	public void LDC_W();
  
  	public void LDC2_W(long x);
  
  	public void LDC2_W(double x);
  
  	/**
  	 * http://java.sun.com/docs/books/jvms/second_edition/html/Instructions2.
  	 * doc6. html#iload
  	 */
  	public void ILOAD(int i);
  
  	public void LLOAD(int i);
  
  	public void FLOAD(int i);
  
  	public void DLOAD(int i);
  
  	public void ALOAD(int i);
  
  	public void ILOAD_0();
  
  	public void ILOAD_1();
  
  	public void ILOAD_2();
  
  	public void ILOAD_3();
  
  	public void LLOAD_0();
  
  	public void LLOAD_1();
  
  	public void LLOAD_2();
  
  	public void LLOAD_3();
  
  	public void FLOAD_0();
  
  	public void FLOAD_1();
  
  	public void FLOAD_2();
  
  	public void FLOAD_3();
  
  	public void DLOAD_0();
  
  	public void DLOAD_1();
  
  	public void DLOAD_2();
  
  	public void DLOAD_3();
  
  	public void ALOAD_0();
  
  	public void ALOAD_1();
  
  	public void ALOAD_2();
  
  	public void ALOAD_3();
  
  	/**
  	 * http://java.sun.com/docs/books/jvms/second_edition/html/Instructions2.
  	 * doc6.html#iaload
  	 */
  	public void IALOAD(Object receiver, int index);
  
  	public void LALOAD(Object receiver, int index);
  
  	public void FALOAD(Object receiver, int index);
  
  	public void DALOAD(Object receiver, int index);
  
  	public void AALOAD(Object receiver, int index);
  
  	public void BALOAD(Object receiver, int index);
  
  	public void CALOAD(Object receiver, int index);
  
  	public void SALOAD(Object receiver, int index);
  
  	/**
  	 * http://java.sun.com/docs/books/jvms/second_edition/html/Instructions2.
  	 * doc6.html#istore
  	 */
  	public void ISTORE(int i);
  
  	public void LSTORE(int i);
  
  	public void FSTORE(int i);
  
  	public void DSTORE(int i);
  
  	public void ASTORE(int i);
  
  	public void ISTORE_0();
  
  	public void ISTORE_1();
  
  	public void ISTORE_2();
  
  	public void ISTORE_3();
  
  	public void LSTORE_0();
  
  	public void LSTORE_1();
  
  	public void LSTORE_2();
  
  	public void LSTORE_3();
  
  	public void FSTORE_0();
  
  	public void FSTORE_1();
  
  	public void FSTORE_2();
  
  	public void FSTORE_3();
  
  	public void DSTORE_0();
  
  	public void DSTORE_1();
  
  	public void DSTORE_2();
  
  	public void DSTORE_3();
  
  	public void ASTORE_0();
  
  	public void ASTORE_1();
  
  	public void ASTORE_2();
  
  	public void ASTORE_3();
  
  	public void IASTORE(Object receiver, int index);
  
  	public void LASTORE(Object receiver, int index);
  
  	public void FASTORE(Object receiver, int index);
  
  	public void DASTORE(Object receiver, int index);
  
  	public void AASTORE(Object receiver, int index);
  
  	public void BASTORE(Object receiver, int index);
  
  	public void CASTORE(Object receiver, int index);
  
  	public void SASTORE(Object receiver, int index);
  
  	public void POP();
  
  	public void POP2();
  
  	public void DUP();
  
  	public void DUP_X1();
  
  	public void DUP_X2();
  
  	public void DUP2();
  
  	public void DUP2_X1();
  
  	public void DUP2_X2();
  
  	public void SWAP();
  
  	/**
  	 * http://java.sun.com/docs/books/jvms/second_edition/html/Instructions2.
  	 * doc6. html#iadd
  	 */
  	public void IADD();
  
  	public void LADD();
  
  	public void FADD();
  
  	public void DADD();
  
  	public void ISUB();
  
  	public void LSUB();
  
  	public void FSUB();
  
  	public void DSUB();
  
  	public void IMUL();
  
  	public void LMUL();
  
  	public void FMUL();
  
  	public void DMUL();
  
  	public void IDIV(int rhs);
  
  	public void LDIV(long rhs);
  
  	public void FDIV(float rhs);
  
  	public void DDIV(double rhs);
  
  	public void IREM(int rhs);
  
  	public void LREM(long rhs);
  
  	public void FREM(float rhs);
  
  	public void DREM(double rhs);
  
  	public void INEG();
  
  	public void LNEG();
  
  	public void FNEG();
  
  	public void DNEG();
  
  	public void ISHL();
  
  	public void LSHL();
  
  	public void ISHR();
  
  	public void LSHR();
  
  	public void IUSHR();
  
  	public void LUSHR();
  
  	public void IAND();
  
  	public void LAND();
  
  	public void IOR();
  
  	public void LOR();
  
  	public void IXOR();
  
  	public void LXOR();
  
  	public void IINC(int i, int value);
  
  	public void I2L();
  
  	public void I2F();
  
  	public void I2D();
  
  	public void L2I();
  
  	public void L2F();
  
  	public void L2D();
  
  	public void F2I();
  
  	public void F2L();
  
  	public void F2D();
  
  	public void D2I();
  
  	public void D2L();
  
  	public void D2F();
  
  	public void I2B();
  
  	public void I2C();
  
  	public void I2S();
  
  	public void LCMP();
  
  	public void FCMPL();
  
  	public void FCMPG();
  
  	public void DCMPL();
  
  	public void DCMPG();
  
  	public void IFEQ(String className, String methNane, int branchIndex,
  			int param);
  
  	public void IFNE(String className, String methNane, int branchIndex,
  			int param);
  
  	public void IFLT(String className, String methNane, int branchIndex,
  			int param);
  
  	public void IFGE(String className, String methNane, int branchIndex,
  			int param);
  
  	public void IFGT(String className, String methNane, int branchIndex,
  			int param);
  
  	public void IFLE(String className, String methNane, int branchIndex,
  			int param);
  
  	public void IF_ICMPEQ(String className, String methNane, int branchIndex,
  			int left, int right);
  
  	public void IF_ICMPNE(String className, String methNane, int branchIndex,
  			int left, int right);
  
  	public void IF_ICMPLT(String className, String methNane, int branchIndex,
  			int left, int right);
  
  	public void IF_ICMPGE(String className, String methNane, int branchIndex,
  			int left, int right);
  
  	public void IF_ICMPGT(String className, String methNane, int branchIndex,
  			int left, int right);
  
  	public void IF_ICMPLE(String className, String methNane, int branchIndex,
  			int left, int right);
  
  	public void IF_ACMPEQ(String className, String methNane, int branchIndex,
  			Object left, Object right);
  
  	public void IF_ACMPNE(String className, String methNane, int branchIndex,
  			Object left, Object right);
  
  	public void GOTO();
  
  	public void JSR();
  
  	public void RET();
  
  	public void TABLESWITCH(String className, String methName, int branchIndex,
  			int target, int min, int max);
  
  	public void LOOKUPSWITCH(String className, String methName,
  