1 /*
2  * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.
8  *
9  * This code is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12  * version 2 for more details (a copy is included in the LICENSE file that
13  * accompanied this code).
14  *
15  * You should have received a copy of the GNU General Public License version
16  * 2 along with this work; if not, write to the Free Software Foundation,
17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18  *
19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20  * or visit www.oracle.com if you need additional information or have any
21  * questions.
22  */
23 
24 
25 package org.graalvm.compiler.bytecode;
26 
27 /**
28  * A utility for processing {@link Bytecodes#LOOKUPSWITCH} bytecodes.
29  */
30 public class BytecodeLookupSwitch extends BytecodeSwitch {
31 
32     private static final int OFFSET_TO_NUMBER_PAIRS = 4;
33     private static final int OFFSET_TO_FIRST_PAIR_MATCH = 8;
34     private static final int OFFSET_TO_FIRST_PAIR_OFFSET = 12;
35     private static final int PAIR_SIZE = 8;
36 
37     /**
38      * Constructor for a {@link BytecodeStream}.
39      *
40      * @param stream the {@code BytecodeStream} containing the switch instruction
41      * @param bci the index in the stream of the switch instruction
42      */
BytecodeLookupSwitch(BytecodeStream stream, int bci)43     public BytecodeLookupSwitch(BytecodeStream stream, int bci) {
44         super(stream, bci);
45     }
46 
47     @Override
offsetAt(int i)48     public int offsetAt(int i) {
49         return stream.readInt(alignedBci + OFFSET_TO_FIRST_PAIR_OFFSET + PAIR_SIZE * i);
50     }
51 
52     @Override
keyAt(int i)53     public int keyAt(int i) {
54         return stream.readInt(alignedBci + OFFSET_TO_FIRST_PAIR_MATCH + PAIR_SIZE * i);
55     }
56 
57     @Override
numberOfCases()58     public int numberOfCases() {
59         return stream.readInt(alignedBci + OFFSET_TO_NUMBER_PAIRS);
60     }
61 
62     @Override
size()63     public int size() {
64         return alignedBci + OFFSET_TO_FIRST_PAIR_MATCH + PAIR_SIZE * numberOfCases() - bci;
65     }
66 }
67