1 /*
2  * Copyright (c) 2001, 2004, 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 sun.jvm.hotspot.interpreter;
26 
27 import sun.jvm.hotspot.oops.*;
28 import sun.jvm.hotspot.utilities.*;
29 import sun.jvm.hotspot.runtime.VM;
30 
31 public class Bytecode {
32   Method method;
33   int bci;
34   static final int jintSize = 4;
35   static final String spaces = " ";
36   static final String comma  = ", ";
37 
Bytecode(Method method, int bci)38   Bytecode(Method method, int bci) {
39     this.method = method;
40     this.bci    = bci;
41   }
42 
43   // Address computation
44   // NOTE: assumes that the start of the method's bytecodes is 4-byte aligned
alignedOffset(int offset)45   int alignedOffset(int offset) {
46     return Bits.roundTo(bci + offset, jintSize) - bci;
47   }
48 
getIndexU1()49   public int     getIndexU1()               { return method.getBytecodeOrBPAt(bci() + 1) & 0xFF; }
getIndexU2(int bc, boolean isWide)50   public int     getIndexU2(int bc, boolean isWide) {
51     if (can_use_native_byte_order(bc, isWide)) {
52       return method.getNativeShortArg(bci() + (isWide ? 2 : 1)) & 0xFFFF;
53     }
54     return method.getBytecodeShortArg(bci() + (isWide ? 2 : 1)) & 0xFFFF;
55   }
getIndexU4()56   public int     getIndexU4()               { return method.getNativeIntArg(bci() + 1); }
hasIndexU4()57   public boolean hasIndexU4()               { return code() == Bytecodes._invokedynamic; }
58 
getIndexU1Cpcache()59   public int     getIndexU1Cpcache()        { return method.getBytecodeOrBPAt(bci() + 1) & 0xFF; }
getIndexU2Cpcache()60   public int     getIndexU2Cpcache()        { return method.getNativeShortArg(bci() + 1) & 0xFFFF; }
61 
can_use_native_byte_order(int bc, boolean is_wide)62   static boolean can_use_native_byte_order(int bc, boolean is_wide) {
63     return (VM.getVM().isBigEndian() || Bytecodes.native_byte_order(bc /*, is_wide*/));
64   }
65 
javaSignedWordAt(int offset)66   int javaSignedWordAt(int offset) {
67     return method.getBytecodeIntArg(bci + offset);
68   }
69 
javaShortAt(int offset)70   short javaShortAt(int offset) {
71     return method.getBytecodeShortArg(bci + offset);
72   }
73 
javaByteAt(int offset)74   byte javaByteAt(int offset) {
75     return method.getBytecodeByteArg(bci + offset);
76   }
77 
method()78   public Method method() { return method; }
bci()79   public int    bci()    { return bci;    }
80 
81   // hotspot byte code
code()82   public int code() {
83     return Bytecodes.codeAt(method(), bci());
84   }
85 
86   // jvm byte code
javaCode()87   public int javaCode() {
88     return Bytecodes.javaCode(code());
89   }
90 
getBytecodeName()91   public String getBytecodeName() {
92     return Bytecodes.name(code());
93   }
94 
getJavaBytecodeName()95   public String getJavaBytecodeName() {
96     return Bytecodes.name(javaCode());
97   }
98 
getLength()99   public int getLength() {
100     return Bytecodes.lengthAt(method(), bci());
101   }
102 
getJavaLength()103   public int getJavaLength() {
104     return Bytecodes.javaLengthAt(method(), bci());
105   }
106 
toString()107   public String toString() {
108     StringBuffer buf = new StringBuffer(getJavaBytecodeName());
109     if (code() != javaCode()) {
110        buf.append(spaces);
111        buf.append('[');
112        buf.append(getBytecodeName());
113        buf.append(']');
114     }
115     return buf.toString();
116   }
117 }
118