View Javadoc
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  
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
45    int alignedOffset(int offset) {
46      return Bits.roundTo(bci + offset, jintSize) - bci;
47    }
48  
49    public int     getIndexU1()               { return method.getBytecodeOrBPAt(bci() + 1) & 0xFF; }
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    }
56    public int     getIndexU4()               { return method.getNativeIntArg(bci() + 1); }
57    public boolean hasIndexU4()               { return code() == Bytecodes._invokedynamic; }
58  
59    public int     getIndexU1Cpcache()        { return method.getBytecodeOrBPAt(bci() + 1) & 0xFF; }
60    public int     getIndexU2Cpcache()        { return method.getNativeShortArg(bci() + 1) & 0xFFFF; }
61  
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  
66    int javaSignedWordAt(int offset) {
67      return method.getBytecodeIntArg(bci + offset);
68    }
69  
70    short javaShortAt(int offset) {
71      return method.getBytecodeShortArg(bci + offset);
72    }
73  
74    byte javaByteAt(int offset) {
75      return method.getBytecodeByteArg(bci + offset);
76    }
77  
78    public Method method() { return method; }
79    public int    bci()    { return bci;    }
80  
81    // hotspot byte code
82    public int code() {
83      return Bytecodes.codeAt(method(), bci());
84    }
85  
86    // jvm byte code
87    public int javaCode() {
88      return Bytecodes.javaCode(code());
89    }
90  
91    public String getBytecodeName() {
92      return Bytecodes.name(code());
93    }
94  
95    public String getJavaBytecodeName() {
96      return Bytecodes.name(javaCode());
97    }
98  
99    public int getLength() {
100     return Bytecodes.lengthAt(method(), bci());
101   }
102 
103   public int getJavaLength() {
104     return Bytecodes.javaLengthAt(method(), bci());
105   }
106 
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 }