Advertisement
Guest User

Untitled

a guest
Jun 22nd, 2017
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5 23.30 KB | None | 0 0
  1. /*
  2.  * Created on 11 nov 2009
  3.  */
  4.  
  5. package interpreter.internals.runtime;
  6.  
  7. import interpreter.api.InterpreterHeap;
  8. import interpreter.api.ExecutionFrame;
  9. import interpreter.api.ExecutionThread;
  10. import interpreter.api.InterpreterContext;
  11. import interpreter.api.util.InterpreterTypeUtil;
  12.  
  13. import org.objectweb.asm.Opcodes;
  14.  
  15. public class BytecodeStream
  16. {
  17.    private final int[]    stream;
  18.    private final String[] instructions;
  19.  
  20.    private final int[]    iConst;
  21.    private final long[]   lConst;
  22.    private final float[]  fConst;
  23.    private final double[] dConst;
  24.    private final int[]    sConst;
  25.  
  26.    public BytecodeStream(int[] stream, String[] instructions, int[] iConst, long[] lConst, float[] fConst, double[] dConst, int[] sConst)
  27.    {
  28.       this.stream = stream;
  29.       this.instructions = instructions;
  30.  
  31.       this.iConst = iConst;
  32.       this.lConst = lConst;
  33.       this.fConst = fConst;
  34.       this.dConst = dConst;
  35.       this.sConst = sConst;
  36.    }
  37.  
  38.    public boolean step(ExecutionFrame frame) throws Throwable
  39.    {
  40.       InterpreterHeap heap = frame.thread.process.heap;
  41.  
  42.       int i1, i2, ref;
  43.       long l1, l2;
  44.       float f1, f2;
  45.       double d1, d2;
  46.  
  47.       int ip = frame.instructionPointer;
  48.       frame.instructionPointer++;
  49.       int ip3 = ip * 3;
  50.  
  51.       int[] s = this.stream;
  52.  
  53.       ExecutionThread stack = frame.thread;
  54.       String instruction = this.instructions[ip];
  55.  
  56.       if (InterpreterContext.feedback().isLoggingExecution())
  57.       {
  58.          InterpreterContext.feedback().executing(instruction);
  59.       }
  60.  
  61.       switch (s[ip3])
  62.       {
  63.          case Opcodes.ICONST_0:
  64.             frame.pushInt(0);
  65.             break;
  66.          case Opcodes.ICONST_1:
  67.             frame.pushInt(1);
  68.             break;
  69.          case Opcodes.ICONST_2:
  70.             frame.pushInt(2);
  71.             break;
  72.          case Opcodes.ICONST_3:
  73.             frame.pushInt(3);
  74.             break;
  75.          case Opcodes.ICONST_4:
  76.             frame.pushInt(4);
  77.             break;
  78.          case Opcodes.ICONST_5:
  79.             frame.pushInt(5);
  80.             break;
  81.          case Opcodes.ICONST_M1:
  82.             frame.pushInt(-1);
  83.             break;
  84.  
  85.          case Opcodes.ACONST_NULL:
  86.             frame.pushInt(0);
  87.             break;
  88.  
  89.          case Opcodes.IINC:
  90.             i1 = frame.loadInt(s[ip3 + 1]);
  91.             frame.storeInt(s[ip3 + 1], i1 + s[ip3 + 2]);
  92.             break;
  93.          case Opcodes.BIPUSH:
  94.             frame.pushInt(s[ip3 + 1]);
  95.             break;
  96.          case Opcodes.SIPUSH:
  97.             frame.pushInt(s[ip3 + 1]);
  98.             break;
  99.          case Opcodes.LDC:
  100.             switch (s[ip3 + 1])
  101.             {
  102.                case 0:
  103.                   frame.pushInt(this.iConst[s[ip3 + 2]]);
  104.                   break;
  105.                case 1:
  106.                   frame.pushLong(this.lConst[s[ip3 + 2]]);
  107.                   break;
  108.                case 2:
  109.                   frame.pushFloat(this.fConst[s[ip3 + 2]]);
  110.                   break;
  111.                case 3:
  112.                   frame.pushDouble(this.dConst[s[ip3 + 2]]);
  113.                   break;
  114.                case 4:
  115.                   frame.pushReference(this.sConst[s[ip3 + 2]]);
  116.                   break;
  117.             }
  118.             break;
  119.  
  120.          // load
  121.  
  122.          case Opcodes.ILOAD:
  123.             frame.pushInt(frame.loadInt(s[ip3 + 1]));
  124.             break;
  125.          case Opcodes.LLOAD:
  126.             frame.pushLong(frame.loadLong(s[ip3 + 1]));
  127.             break;
  128.          case Opcodes.FLOAD:
  129.             frame.pushFloat(frame.loadFloat(s[ip3 + 1]));
  130.             break;
  131.          case Opcodes.DLOAD:
  132.             frame.pushDouble(frame.loadDouble(s[ip3 + 1]));
  133.             break;
  134.          case Opcodes.ALOAD:
  135.             frame.pushReference(frame.loadReference(s[ip3 + 1]));
  136.             break;
  137.          case Opcodes.BALOAD:
  138.             i1 = frame.popInt();
  139.             ref = frame.popReference();
  140.             i1 = heap.getArrayByte(ref, i1);
  141.             frame.pushInt(i1);
  142.             break;
  143.          case Opcodes.SALOAD:
  144.             i1 = frame.popInt();
  145.             ref = frame.popReference();
  146.             i1 = heap.getArrayShort(ref, i1);
  147.             frame.pushInt(i1);
  148.             break;
  149.          case Opcodes.CALOAD:
  150.             i1 = frame.popInt();
  151.             ref = frame.popReference();
  152.             i1 = heap.getArrayChar(ref, i1);
  153.             frame.pushInt(i1);
  154.             break;
  155.          case Opcodes.IALOAD:
  156.             i1 = frame.popInt();
  157.             ref = frame.popReference();
  158.             i1 = heap.getArrayInt(ref, i1);
  159.             frame.pushInt(i1);
  160.             break;
  161.          case Opcodes.LALOAD:
  162.             i1 = frame.popInt();
  163.             ref = frame.popReference();
  164.             l1 = heap.getArrayLong(ref, i1);
  165.             frame.pushLong(l1);
  166.             break;
  167.          case Opcodes.FALOAD:
  168.             i1 = frame.popInt();
  169.             ref = frame.popReference();
  170.             f1 = heap.getArrayFloat(ref, i1);
  171.             frame.pushFloat(f1);
  172.             break;
  173.          case Opcodes.DALOAD:
  174.             i1 = frame.popInt();
  175.             ref = frame.popReference();
  176.             d1 = heap.getArrayDouble(ref, i1);
  177.             frame.pushDouble(d1);
  178.             break;
  179.          case Opcodes.AALOAD:
  180.             i1 = frame.popInt();
  181.             ref = frame.popReference();
  182.             i1 = heap.getArrayInt(ref, i1);
  183.             frame.pushInt(i1);
  184.             break;
  185.  
  186.          // store
  187.  
  188.          case Opcodes.ISTORE:
  189.             frame.storeInt(s[ip3 + 1], frame.popInt());
  190.             break;
  191.          case Opcodes.LSTORE:
  192.             frame.storeLong(s[ip3 + 1], frame.popLong());
  193.             break;
  194.          case Opcodes.FSTORE:
  195.             frame.storeFloat(s[ip3 + 1], frame.popFloat());
  196.             break;
  197.          case Opcodes.DSTORE:
  198.             frame.storeDouble(s[ip3 + 1], frame.popDouble());
  199.             break;
  200.          case Opcodes.ASTORE:
  201.             frame.storeReference(s[ip3 + 1], frame.popReference());
  202.             break;
  203.          case Opcodes.BASTORE:
  204.             i1 = frame.popInt();
  205.             i2 = frame.popInt();
  206.             ref = frame.popReference();
  207.             heap.putArrayByte(ref, i2, (byte) i1);
  208.             break;
  209.          case Opcodes.SASTORE:
  210.             i1 = frame.popInt();
  211.             i2 = frame.popInt();
  212.             ref = frame.popReference();
  213.             heap.putArrayShort(ref, i2, (short) i1);
  214.             break;
  215.          case Opcodes.CASTORE:
  216.             i1 = frame.popInt();
  217.             i2 = frame.popInt();
  218.             ref = frame.popReference();
  219.             heap.putArrayChar(ref, i2, (char) i1);
  220.             break;
  221.          case Opcodes.IASTORE:
  222.             i1 = frame.popInt();
  223.             i2 = frame.popInt();
  224.             ref = frame.popReference();
  225.             heap.putArrayInt(ref, i2, i1);
  226.             break;
  227.          case Opcodes.LASTORE:
  228.             l1 = frame.popLong();
  229.             i2 = frame.popInt();
  230.             ref = frame.popReference();
  231.             heap.putArrayLong(ref, i2, l1);
  232.             break;
  233.          case Opcodes.FASTORE:
  234.             f1 = frame.popFloat();
  235.             i2 = frame.popInt();
  236.             ref = frame.popReference();
  237.             heap.putArrayFloat(ref, i2, f1);
  238.             break;
  239.          case Opcodes.DASTORE:
  240.             d1 = frame.popDouble();
  241.             i2 = frame.popInt();
  242.             ref = frame.popReference();
  243.             heap.putArrayDouble(ref, i2, d1);
  244.             break;
  245.          case Opcodes.AASTORE:
  246.             i1 = frame.popInt();
  247.             i2 = frame.popInt();
  248.             ref = frame.popReference();
  249.             heap.putArrayInt(ref, i2, i1);
  250.             break;
  251.  
  252.          //
  253.  
  254.          case Opcodes.I2B:
  255.             frame.pushInt((byte) frame.popInt());
  256.             break;
  257.          case Opcodes.I2S:
  258.             frame.pushInt((short) frame.popInt());
  259.             break;
  260.          case Opcodes.I2C:
  261.             frame.pushInt((char) frame.popInt());
  262.             break;
  263.          case Opcodes.I2L:
  264.             frame.pushLong(frame.popInt());
  265.             break;
  266.          case Opcodes.I2F:
  267.             frame.pushFloat(frame.popInt());
  268.             break;
  269.          case Opcodes.I2D:
  270.             frame.pushDouble(frame.popInt());
  271.             break;
  272.          case Opcodes.L2I:
  273.             frame.pushInt((int) frame.popLong());
  274.             break;
  275.          case Opcodes.L2F:
  276.             frame.pushFloat(frame.popLong());
  277.             break;
  278.          case Opcodes.L2D:
  279.             frame.pushDouble(frame.popLong());
  280.             break;
  281.          case Opcodes.F2I:
  282.             frame.pushInt((int) frame.popFloat());
  283.             break;
  284.          case Opcodes.F2L:
  285.             frame.pushLong((long) frame.popFloat());
  286.             break;
  287.          case Opcodes.F2D:
  288.             frame.pushDouble(frame.popFloat());
  289.             break;
  290.          case Opcodes.D2I:
  291.             frame.pushInt((int) frame.popDouble());
  292.             break;
  293.          case Opcodes.D2L:
  294.             frame.pushLong((long) frame.popDouble());
  295.             break;
  296.          case Opcodes.D2F:
  297.             frame.pushFloat((float) frame.popDouble());
  298.             break;
  299.  
  300.          // fancy
  301.  
  302.          case Opcodes.ARRAYLENGTH:
  303.             ref = frame.popReference();
  304.             int len = heap.getArrayLength(ref);
  305.             frame.pushInt(len);
  306.             break;
  307.  
  308.          case Opcodes.NEWARRAY:
  309.             int alen = frame.popInt();
  310.             switch (s[ip3 + 1])
  311.             {
  312.                case 0:
  313.                   frame.pushReference(heap.mallocBooleanArray(alen));
  314.                   break;
  315.                case 1:
  316.                   frame.pushReference(heap.mallocByteArray(alen));
  317.                   break;
  318.                case 2:
  319.                   frame.pushReference(heap.mallocShortArray(alen));
  320.                   break;
  321.                case 3:
  322.                   frame.pushReference(heap.mallocCharArray(alen));
  323.                   break;
  324.                case 4:
  325.                   frame.pushReference(heap.mallocIntArray(alen));
  326.                   break;
  327.                case 5:
  328.                   frame.pushReference(heap.mallocLongArray(alen));
  329.                   break;
  330.                case 6:
  331.                   frame.pushReference(heap.mallocFloatArray(alen));
  332.                   break;
  333.                case 7:
  334.                   frame.pushReference(heap.mallocDoubleArray(alen));
  335.                   break;
  336.                default:
  337.                   throw new IllegalStateException();
  338.             }
  339.             break;
  340.  
  341.          case Opcodes.ANEWARRAY:
  342.             int aalen = frame.popInt();
  343.             String classname = heap.lookupString(sConst[s[ip3 + 1]]);
  344.             if (classname.equals("java/lang/String"))
  345.             {
  346.                frame.pushReference(heap.mallocReferenceArray(aalen));
  347.             }
  348.             else
  349.             {
  350.                throw new UnsupportedOperationException("new " + classname + "[" + aalen + "]");
  351.             }
  352.             break;
  353.  
  354.          case Opcodes.INVOKESTATIC:
  355.             stack.process.invokeStaticLookup.getAt(s[ip3 + 1]).execute(frame);
  356.             break;
  357.          case Opcodes.INVOKEVIRTUAL:
  358.             stack.process.invokeVirtualLookup.getAt(s[ip3 + 1]).execute(frame);
  359.             break;
  360.          case Opcodes.INVOKESPECIAL:
  361.             stack.process.invokeSpecialLookup.getAt(s[ip3 + 1]).execute(frame);
  362.             break;
  363.          case Opcodes.INVOKEINTERFACE:
  364.             stack.process.invokeInterfaceLookup.getAt(s[ip3 + 1]).execute(frame);
  365.             break;
  366.          case Opcodes.GETFIELD:
  367.             stack.process.getFieldLookup.getAt(s[ip3 + 1]).execute(frame);
  368.             break;
  369.          case Opcodes.PUTFIELD:
  370.             stack.process.putFieldLookup.getAt(s[ip3 + 1]).execute(frame);
  371.             break;
  372.          case Opcodes.GETSTATIC:
  373.             stack.process.getStaticLookup.getAt(s[ip3 + 1]).execute(frame);
  374.             break;
  375.          case Opcodes.PUTSTATIC:
  376.             stack.process.putStaticLookup.getAt(s[ip3 + 1]).execute(frame);
  377.             break;
  378.          case Opcodes.NEW:
  379.             stack.process.newLookup.getAt(s[ip3 + 1]).execute(frame);
  380.             break;
  381.  
  382.          case Opcodes.ATHROW:
  383.             throw (Throwable) InterpreterTypeUtil.popValueFromStack(frame, Throwable.class);
  384.  
  385.             // stack
  386.  
  387.          case Opcodes.NOP:
  388.             break;
  389.  
  390.          case Opcodes.POP:
  391.             frame.popInt();
  392.             break;
  393.  
  394.          case Opcodes.DUP:
  395.          {
  396.             int a = frame.popInt();
  397.             frame.pushInt(a);
  398.             frame.pushInt(a);
  399.          }
  400.             break;
  401.  
  402.          case Opcodes.DUP_X1:
  403.          {
  404.             int a = frame.popInt();
  405.             int b = frame.popInt();
  406.  
  407.             frame.pushInt(a);
  408.             frame.pushInt(b);
  409.             frame.pushInt(a);
  410.          }
  411.             break;
  412.  
  413.          case Opcodes.DUP_X2:
  414.          {
  415.             int a = frame.popInt();
  416.             int b = frame.popInt();
  417.             int c = frame.popInt();
  418.  
  419.             frame.pushInt(a);
  420.             frame.pushInt(c);
  421.             frame.pushInt(b);
  422.             frame.pushInt(a);
  423.          }
  424.             break;
  425.  
  426.          case Opcodes.DUP2:
  427.          {
  428.             int a = frame.popInt();
  429.             int b = frame.popInt();
  430.  
  431.             frame.pushInt(b);
  432.             frame.pushInt(a);
  433.             frame.pushInt(b);
  434.             frame.pushInt(a);
  435.          }
  436.             break;
  437.  
  438.          case Opcodes.DUP2_X1:
  439.          {
  440.             int a = frame.popInt();
  441.             int b = frame.popInt();
  442.             int c = frame.popInt();
  443.  
  444.             frame.pushInt(b);
  445.             frame.pushInt(a);
  446.             frame.pushInt(c);
  447.             frame.pushInt(b);
  448.             frame.pushInt(a);
  449.          }
  450.             break;
  451.  
  452.          case Opcodes.DUP2_X2:
  453.          {
  454.             int a = frame.popInt();
  455.             int b = frame.popInt();
  456.             int c = frame.popInt();
  457.             int d = frame.popInt();
  458.  
  459.             frame.pushInt(b);
  460.             frame.pushInt(a);
  461.             frame.pushInt(d);
  462.             frame.pushInt(c);
  463.             frame.pushInt(b);
  464.             frame.pushInt(a);
  465.          }
  466.             break;
  467.  
  468.          case Opcodes.SWAP:
  469.          {
  470.             int a = frame.popInt();
  471.             int b = frame.popInt();
  472.             frame.pushInt(b);
  473.             frame.pushInt(a);
  474.          }
  475.             break;
  476.  
  477.          // jumps
  478.  
  479.          case Opcodes.GOTO:
  480.             frame.$goto(s[ip3 + 1]);
  481.             break;
  482.  
  483.          case Opcodes.IFNULL:
  484.             if (frame.popReference() == 0)
  485.                frame.$goto(s[ip3 + 1]);
  486.             break;
  487.          case Opcodes.IFNONNULL:
  488.             if (frame.popReference() != 0)
  489.                frame.$goto(s[ip3 + 1]);
  490.             break;
  491.  
  492.          case Opcodes.IFEQ:
  493.             if (frame.popInt() == 0)
  494.                frame.$goto(s[ip3 + 1]);
  495.             break;
  496.          case Opcodes.IFNE:
  497.             if (frame.popInt() != 0)
  498.                frame.$goto(s[ip3 + 1]);
  499.             break;
  500.          case Opcodes.IFLT:
  501.             if (frame.popInt() < 0)
  502.                frame.$goto(s[ip3 + 1]);
  503.             break;
  504.          case Opcodes.IFLE:
  505.             if (frame.popInt() <= 0)
  506.                frame.$goto(s[ip3 + 1]);
  507.             break;
  508.          case Opcodes.IFGE:
  509.             if (frame.popInt() >= 0)
  510.                frame.$goto(s[ip3 + 1]);
  511.             break;
  512.          case Opcodes.IFGT:
  513.             if (frame.popInt() > 0)
  514.                frame.$goto(s[ip3 + 1]);
  515.             break;
  516.  
  517.          case Opcodes.IF_ICMPEQ:
  518.             i1 = frame.popInt();
  519.             i2 = frame.popInt();
  520.             if (i2 == i1)
  521.                frame.$goto(s[ip3 + 1]);
  522.             break;
  523.          case Opcodes.IF_ICMPNE:
  524.             i1 = frame.popInt();
  525.             i2 = frame.popInt();
  526.             if (i2 != i1)
  527.                frame.$goto(s[ip3 + 1]);
  528.             break;
  529.          case Opcodes.IF_ICMPLT:
  530.             i1 = frame.popInt();
  531.             i2 = frame.popInt();
  532.             if (i2 < i1)
  533.                frame.$goto(s[ip3 + 1]);
  534.             break;
  535.          case Opcodes.IF_ICMPLE:
  536.             i1 = frame.popInt();
  537.             i2 = frame.popInt();
  538.             if (i2 <= i1)
  539.                frame.$goto(s[ip3 + 1]);
  540.             break;
  541.          case Opcodes.IF_ICMPGE:
  542.             i1 = frame.popInt();
  543.             i2 = frame.popInt();
  544.             if (i2 >= i1)
  545.                frame.$goto(s[ip3 + 1]);
  546.             break;
  547.          case Opcodes.IF_ICMPGT:
  548.             i1 = frame.popInt();
  549.             i2 = frame.popInt();
  550.             if (i2 > i1)
  551.                frame.$goto(s[ip3 + 1]);
  552.             break;
  553.  
  554.          case Opcodes.LCMP:
  555.             l1 = frame.popLong();
  556.             l2 = frame.popLong();
  557.             frame.pushInt((l2 == l1) ? 0 : (l2 < l1 ? -1 : +1));
  558.             break;
  559.  
  560.          case Opcodes.FCMPG: // TODO: NaN
  561.          case Opcodes.FCMPL:
  562.             f1 = frame.popFloat();
  563.             f2 = frame.popFloat();
  564.             frame.pushInt((f2 == f1) ? 0 : (f2 < f1 ? -1 : +1));
  565.             break;
  566.  
  567.          case Opcodes.DCMPG: // TODO: NaN
  568.          case Opcodes.DCMPL:
  569.             d1 = frame.popDouble();
  570.             d2 = frame.popDouble();
  571.             frame.pushInt((d2 == d1) ? 0 : (d2 < d1 ? -1 : +1));
  572.             break;
  573.  
  574.          //
  575.  
  576.          case Opcodes.RETURN:
  577.             frame.thread.vreturn();
  578.             return false;
  579.          case Opcodes.IRETURN:
  580.             frame.thread.ireturn();
  581.             return false;
  582.          case Opcodes.LRETURN:
  583.             frame.thread.lreturn();
  584.             return false;
  585.          case Opcodes.FRETURN:
  586.             frame.thread.freturn();
  587.             return false;
  588.          case Opcodes.DRETURN:
  589.             frame.thread.dreturn();
  590.             return false;
  591.          case Opcodes.ARETURN:
  592.             frame.thread.areturn();
  593.             return false;
  594.  
  595.             //
  596.  
  597.          case Opcodes.INEG:
  598.             frame.pushInt(-frame.popInt());
  599.             break;
  600.          case Opcodes.LNEG:
  601.             frame.pushLong(-frame.popLong());
  602.             break;
  603.          case Opcodes.FNEG:
  604.             frame.pushFloat(-frame.popFloat());
  605.             break;
  606.          case Opcodes.DNEG:
  607.             frame.pushDouble(-frame.popDouble());
  608.             break;
  609.  
  610.          // int:pop,pop,push
  611.          case Opcodes.IOR:
  612.             i1 = frame.popInt();
  613.             i2 = frame.popInt();
  614.             frame.pushInt(i2 | i1);
  615.             break;
  616.          case Opcodes.IAND:
  617.             i1 = frame.popInt();
  618.             i2 = frame.popInt();
  619.             frame.pushInt(i2 & i1);
  620.             break;
  621.          case Opcodes.IXOR:
  622.             i1 = frame.popInt();
  623.             i2 = frame.popInt();
  624.             frame.pushInt(i2 ^ i1);
  625.             break;
  626.          case Opcodes.IADD:
  627.             i1 = frame.popInt();
  628.             i2 = frame.popInt();
  629.             frame.pushInt(i2 + i1);
  630.             break;
  631.          case Opcodes.ISUB:
  632.             i1 = frame.popInt();
  633.             i2 = frame.popInt();
  634.             frame.pushInt(i2 - i1);
  635.             break;
  636.          case Opcodes.IMUL:
  637.             i1 = frame.popInt();
  638.             i2 = frame.popInt();
  639.             frame.pushInt(i2 * i1);
  640.             break;
  641.          case Opcodes.IDIV:
  642.             i1 = frame.popInt();
  643.             i2 = frame.popInt();
  644.             frame.pushInt(i2 / i1);
  645.             break;
  646.          case Opcodes.IREM:
  647.             i1 = frame.popInt();
  648.             i2 = frame.popInt();
  649.             frame.pushInt(i2 % i1);
  650.             break;
  651.          case Opcodes.ISHL:
  652.             i1 = frame.popInt();
  653.             i2 = frame.popInt();
  654.             frame.pushInt(i2 << i1);
  655.             break;
  656.          case Opcodes.ISHR:
  657.             i1 = frame.popInt();
  658.             i2 = frame.popInt();
  659.             frame.pushInt(i2 >> i1);
  660.             break;
  661.          case Opcodes.IUSHR:
  662.             i1 = frame.popInt();
  663.             i2 = frame.popInt();
  664.             frame.pushInt(i2 >>> i1);
  665.             break;
  666.  
  667.          // long:pop,pop,push
  668.          case Opcodes.LOR:
  669.             l1 = frame.popLong();
  670.             l2 = frame.popLong();
  671.             frame.pushLong(l2 | l1);
  672.             break;
  673.          case Opcodes.LAND:
  674.             l1 = frame.popLong();
  675.             l2 = frame.popLong();
  676.             frame.pushLong(l2 & l1);
  677.             break;
  678.          case Opcodes.LXOR:
  679.             l1 = frame.popLong();
  680.             l2 = frame.popLong();
  681.             frame.pushLong(l2 ^ l1);
  682.             break;
  683.          case Opcodes.LADD:
  684.             l1 = frame.popLong();
  685.             l2 = frame.popLong();
  686.             frame.pushLong(l2 + l1);
  687.             break;
  688.          case Opcodes.LSUB:
  689.             l1 = frame.popLong();
  690.             l2 = frame.popLong();
  691.             frame.pushLong(l2 - l1);
  692.             break;
  693.          case Opcodes.LMUL:
  694.             l1 = frame.popLong();
  695.             l2 = frame.popLong();
  696.             frame.pushLong(l2 * l1);
  697.             break;
  698.          case Opcodes.LDIV:
  699.             l1 = frame.popLong();
  700.             l2 = frame.popLong();
  701.             frame.pushLong(l2 / l1);
  702.             break;
  703.          case Opcodes.LREM:
  704.             l1 = frame.popLong();
  705.             l2 = frame.popLong();
  706.             frame.pushLong(l2 % l1);
  707.             break;
  708.          case Opcodes.LSHL:
  709.             l1 = frame.popLong();
  710.             l2 = frame.popLong();
  711.             frame.pushLong(l2 << l1);
  712.             break;
  713.          case Opcodes.LSHR:
  714.             l1 = frame.popLong();
  715.             l2 = frame.popLong();
  716.             frame.pushLong(l2 >> l1);
  717.             break;
  718.          case Opcodes.LUSHR:
  719.             l1 = frame.popLong();
  720.             l2 = frame.popLong();
  721.             frame.pushLong(l2 >>> l1);
  722.             break;
  723.  
  724.          // float:pop,pop,push
  725.          case Opcodes.FADD:
  726.             f1 = frame.popFloat();
  727.             f2 = frame.popFloat();
  728.             frame.pushFloat(f2 + f1);
  729.             break;
  730.          case Opcodes.FSUB:
  731.             f1 = frame.popFloat();
  732.             f2 = frame.popFloat();
  733.             frame.pushFloat(f2 - f1);
  734.             break;
  735.          case Opcodes.FMUL:
  736.             f1 = frame.popFloat();
  737.             f2 = frame.popFloat();
  738.             frame.pushFloat(f2 * f1);
  739.             break;
  740.          case Opcodes.FDIV:
  741.             f1 = frame.popFloat();
  742.             f2 = frame.popFloat();
  743.             frame.pushFloat(f2 / f1);
  744.             break;
  745.          case Opcodes.FREM:
  746.             f1 = frame.popFloat();
  747.             f2 = frame.popFloat();
  748.             frame.pushFloat(f2 % f1);
  749.             break;
  750.  
  751.          // double,pop,pop,push
  752.          case Opcodes.DADD:
  753.             d1 = frame.popDouble();
  754.             d2 = frame.popDouble();
  755.             frame.pushDouble(d2 + d1);
  756.             break;
  757.          case Opcodes.DSUB:
  758.             d1 = frame.popDouble();
  759.             d2 = frame.popDouble();
  760.             frame.pushDouble(d2 - d1);
  761.             break;
  762.          case Opcodes.DMUL:
  763.             d1 = frame.popDouble();
  764.             d2 = frame.popDouble();
  765.             frame.pushDouble(d2 * d1);
  766.             break;
  767.          case Opcodes.DDIV:
  768.             d1 = frame.popDouble();
  769.             d2 = frame.popDouble();
  770.             frame.pushDouble(d2 / d1);
  771.             break;
  772.          case Opcodes.DREM:
  773.             d1 = frame.popDouble();
  774.             d2 = frame.popDouble();
  775.             frame.pushDouble(d2 % d1);
  776.             break;
  777.  
  778.          default:
  779.             throw new UnsupportedOperationException("bytecode=" + s[ip3]);
  780.       }
  781.  
  782.       return true;
  783.    }
  784. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement