hotspot/src/share/vm/interpreter/bytecodeStream.hpp
changeset 7913 dd096a83bdbb
parent 7397 5b173b4ca846
child 8107 78e5bd944384
equal deleted inserted replaced
7901:ea3d83447861 7913:dd096a83bdbb
     1 /*
     1 /*
     2  * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
     2  * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     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
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.
     7  * published by the Free Software Foundation.
   103   bool            is_wide() const                { return _is_wide; }
   103   bool            is_wide() const                { return _is_wide; }
   104   int             instruction_size() const       { return (_next_bci - _bci); }
   104   int             instruction_size() const       { return (_next_bci - _bci); }
   105   bool            is_last_bytecode() const       { return _next_bci >= _end_bci; }
   105   bool            is_last_bytecode() const       { return _next_bci >= _end_bci; }
   106 
   106 
   107   address         bcp() const                    { return method()->code_base() + _bci; }
   107   address         bcp() const                    { return method()->code_base() + _bci; }
   108   Bytecode*       bytecode() const               { return Bytecode_at(bcp()); }
   108   Bytecode        bytecode() const               { return Bytecode(_method(), bcp()); }
   109 
   109 
   110   // State changes
   110   // State changes
   111   void            set_next_bci(int bci)          { assert(0 <= bci && bci <= method()->code_size(), "illegal bci"); _next_bci = bci; }
   111   void            set_next_bci(int bci)          { assert(0 <= bci && bci <= method()->code_size(), "illegal bci"); _next_bci = bci; }
   112 
   112 
   113   // Bytecode-specific attributes
   113   // Bytecode-specific attributes
   114   int             dest() const                   { return bci() + bytecode()->get_offset_s2(raw_code()); }
   114   int             dest() const                   { return bci() + bytecode().get_offset_s2(raw_code()); }
   115   int             dest_w() const                 { return bci() + bytecode()->get_offset_s4(raw_code()); }
   115   int             dest_w() const                 { return bci() + bytecode().get_offset_s4(raw_code()); }
   116 
   116 
   117   // One-byte indices.
   117   // One-byte indices.
   118   int             get_index_u1() const           { assert_raw_index_size(1); return *(jubyte*)(bcp()+1); }
   118   int             get_index_u1() const           { assert_raw_index_size(1); return *(jubyte*)(bcp()+1); }
   119 
   119 
   120  protected:
   120  protected:
   187       // indicate end of bytecode stream
   187       // indicate end of bytecode stream
   188       raw_code = code = Bytecodes::_illegal;
   188       raw_code = code = Bytecodes::_illegal;
   189     } else {
   189     } else {
   190       // get bytecode
   190       // get bytecode
   191       address bcp = this->bcp();
   191       address bcp = this->bcp();
   192       raw_code = Bytecodes::code_at(bcp);
   192       raw_code = Bytecodes::code_at(_method(), bcp);
   193       code = Bytecodes::java_code(raw_code);
   193       code = Bytecodes::java_code(raw_code);
   194       // set next bytecode position
   194       // set next bytecode position
   195       //
   195       //
   196       // note that we cannot advance before having the
   196       // note that we cannot advance before having the
   197       // tty bytecode otherwise the stepping is wrong!
   197       // tty bytecode otherwise the stepping is wrong!
   198       // (carefull: length_for(...) must be used first!)
   198       // (carefull: length_for(...) must be used first!)
   199       int l = Bytecodes::length_for(code);
   199       int l = Bytecodes::length_for(code);
   200       if (l == 0) l = Bytecodes::length_at(bcp);
   200       if (l == 0) l = Bytecodes::length_at(_method(), bcp);
   201       _next_bci  += l;
   201       _next_bci  += l;
   202       assert(_bci < _next_bci, "length must be > 0");
   202       assert(_bci < _next_bci, "length must be > 0");
   203       // set attributes
   203       // set attributes
   204       _is_wide      = false;
   204       _is_wide      = false;
   205       // check for special (uncommon) cases
   205       // check for special (uncommon) cases
   217 
   217 
   218   bool            is_active_breakpoint() const   { return Bytecodes::is_active_breakpoint_at(bcp()); }
   218   bool            is_active_breakpoint() const   { return Bytecodes::is_active_breakpoint_at(bcp()); }
   219   Bytecodes::Code code() const                   { return _code; }
   219   Bytecodes::Code code() const                   { return _code; }
   220 
   220 
   221   // Unsigned indices, widening
   221   // Unsigned indices, widening
   222   int             get_index() const              { return is_wide() ? bytecode()->get_index_u2(raw_code(), true) : get_index_u1(); }
   222   int             get_index() const              { return is_wide() ? bytecode().get_index_u2(raw_code(), true) : get_index_u1(); }
   223   // Get an unsigned 2-byte index, swapping the bytes if necessary.
   223   // Get an unsigned 2-byte index, swapping the bytes if necessary.
   224   int             get_index_u2() const           { assert_raw_stream(false);
   224   int             get_index_u2() const           { assert_raw_stream(false);
   225                                                    return bytecode()->get_index_u2(raw_code(), false); }
   225                                                    return bytecode().get_index_u2(raw_code(), false); }
   226   // Get an unsigned 2-byte index in native order.
   226   // Get an unsigned 2-byte index in native order.
   227   int             get_index_u2_cpcache() const   { assert_raw_stream(false);
   227   int             get_index_u2_cpcache() const   { assert_raw_stream(false);
   228                                                    return bytecode()->get_index_u2_cpcache(raw_code()); }
   228                                                    return bytecode().get_index_u2_cpcache(raw_code()); }
   229   int             get_index_u4() const           { assert_raw_stream(false);
   229   int             get_index_u4() const           { assert_raw_stream(false);
   230                                                    return bytecode()->get_index_u4(raw_code()); }
   230                                                    return bytecode().get_index_u4(raw_code()); }
   231   bool            has_index_u4() const           { return bytecode()->has_index_u4(raw_code()); }
   231   bool            has_index_u4() const           { return bytecode().has_index_u4(raw_code()); }
   232 };
   232 };
   233 
   233 
   234 #endif // SHARE_VM_INTERPRETER_BYTECODESTREAM_HPP
   234 #endif // SHARE_VM_INTERPRETER_BYTECODESTREAM_HPP