hotspot/src/share/vm/ci/ciStreams.hpp
changeset 7913 dd096a83bdbb
parent 7397 5b173b4ca846
child 10506 575ad9bccff5
equal deleted inserted replaced
7901:ea3d83447861 7913:dd096a83bdbb
     1 /*
     1 /*
     2  * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
     2  * Copyright (c) 1999, 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.
    76     if (require_wide)
    76     if (require_wide)
    77          { assert(is_wide(),  "must be a wide instruction"); }
    77          { assert(is_wide(),  "must be a wide instruction"); }
    78     else { assert(!is_wide(), "must not be a wide instruction"); }
    78     else { assert(!is_wide(), "must not be a wide instruction"); }
    79   }
    79   }
    80 
    80 
    81   Bytecode* bytecode() const { return Bytecode_at(_bc_start); }
    81   Bytecode bytecode() const { return Bytecode(this, _bc_start); }
    82   Bytecode* next_bytecode() const { return Bytecode_at(_pc); }
    82   Bytecode next_bytecode() const { return Bytecode(this, _pc); }
    83 
    83 
    84 public:
    84 public:
    85   // End-Of-Bytecodes
    85   // End-Of-Bytecodes
    86   static Bytecodes::Code EOBC() {
    86   static Bytecodes::Code EOBC() {
    87     return Bytecodes::_illegal;
    87     return Bytecodes::_illegal;
   149 
   149 
   150   // Does this instruction contain an index which refes into the CP cache?
   150   // Does this instruction contain an index which refes into the CP cache?
   151   bool has_cache_index() const { return Bytecodes::uses_cp_cache(cur_bc_raw()); }
   151   bool has_cache_index() const { return Bytecodes::uses_cp_cache(cur_bc_raw()); }
   152 
   152 
   153   int get_index_u1() const {
   153   int get_index_u1() const {
   154     return bytecode()->get_index_u1(cur_bc_raw());
   154     return bytecode().get_index_u1(cur_bc_raw());
   155   }
   155   }
   156 
   156 
   157   int get_index_u1_cpcache() const {
   157   int get_index_u1_cpcache() const {
   158     return bytecode()->get_index_u1_cpcache(cur_bc_raw());
   158     return bytecode().get_index_u1_cpcache(cur_bc_raw());
   159   }
   159   }
   160 
   160 
   161   // Get a byte index following this bytecode.
   161   // Get a byte index following this bytecode.
   162   // If prefixed with a wide bytecode, get a wide index.
   162   // If prefixed with a wide bytecode, get a wide index.
   163   int get_index() const {
   163   int get_index() const {
   167       : get_index_u1();         // no, return narrow index
   167       : get_index_u1();         // no, return narrow index
   168   }
   168   }
   169 
   169 
   170   // Get 2-byte index (byte swapping depending on which bytecode)
   170   // Get 2-byte index (byte swapping depending on which bytecode)
   171   int get_index_u2(bool is_wide = false) const {
   171   int get_index_u2(bool is_wide = false) const {
   172     return bytecode()->get_index_u2(cur_bc_raw(), is_wide);
   172     return bytecode().get_index_u2(cur_bc_raw(), is_wide);
   173   }
   173   }
   174 
   174 
   175   // Get 2-byte index in native byte order.  (Rewriter::rewrite makes these.)
   175   // Get 2-byte index in native byte order.  (Rewriter::rewrite makes these.)
   176   int get_index_u2_cpcache() const {
   176   int get_index_u2_cpcache() const {
   177     return bytecode()->get_index_u2_cpcache(cur_bc_raw());
   177     return bytecode().get_index_u2_cpcache(cur_bc_raw());
   178   }
   178   }
   179 
   179 
   180   // Get 4-byte index, for invokedynamic.
   180   // Get 4-byte index, for invokedynamic.
   181   int get_index_u4() const {
   181   int get_index_u4() const {
   182     return bytecode()->get_index_u4(cur_bc_raw());
   182     return bytecode().get_index_u4(cur_bc_raw());
   183   }
   183   }
   184 
   184 
   185   bool has_index_u4() const {
   185   bool has_index_u4() const {
   186     return bytecode()->has_index_u4(cur_bc_raw());
   186     return bytecode().has_index_u4(cur_bc_raw());
   187   }
   187   }
   188 
   188 
   189   // Get dimensions byte (multinewarray)
   189   // Get dimensions byte (multinewarray)
   190   int get_dimensions() const { return *(unsigned char*)(_pc-1); }
   190   int get_dimensions() const { return *(unsigned char*)(_pc-1); }
   191 
   191 
   192   // Sign-extended index byte/short, no widening
   192   // Sign-extended index byte/short, no widening
   193   int get_constant_u1()                     const { return bytecode()->get_constant_u1(instruction_size()-1, cur_bc_raw()); }
   193   int get_constant_u1()                     const { return bytecode().get_constant_u1(instruction_size()-1, cur_bc_raw()); }
   194   int get_constant_u2(bool is_wide = false) const { return bytecode()->get_constant_u2(instruction_size()-2, cur_bc_raw(), is_wide); }
   194   int get_constant_u2(bool is_wide = false) const { return bytecode().get_constant_u2(instruction_size()-2, cur_bc_raw(), is_wide); }
   195 
   195 
   196   // Get a byte signed constant for "iinc".  Invalid for other bytecodes.
   196   // Get a byte signed constant for "iinc".  Invalid for other bytecodes.
   197   // If prefixed with a wide bytecode, get a wide constant
   197   // If prefixed with a wide bytecode, get a wide constant
   198   int get_iinc_con() const {return (_pc==_was_wide) ? (jshort) get_constant_u2(true) : (jbyte) get_constant_u1();}
   198   int get_iinc_con() const {return (_pc==_was_wide) ? (jshort) get_constant_u2(true) : (jbyte) get_constant_u1();}
   199 
   199 
   200   // 2-byte branch offset from current pc
   200   // 2-byte branch offset from current pc
   201   int get_dest() const {
   201   int get_dest() const {
   202     return cur_bci() + bytecode()->get_offset_s2(cur_bc_raw());
   202     return cur_bci() + bytecode().get_offset_s2(cur_bc_raw());
   203   }
   203   }
   204 
   204 
   205   // 2-byte branch offset from next pc
   205   // 2-byte branch offset from next pc
   206   int next_get_dest() const {
   206   int next_get_dest() const {
   207     assert(_pc < _end, "");
   207     assert(_pc < _end, "");
   208     return next_bci() + next_bytecode()->get_offset_s2(Bytecodes::_ifeq);
   208     return next_bci() + next_bytecode().get_offset_s2(Bytecodes::_ifeq);
   209   }
   209   }
   210 
   210 
   211   // 4-byte branch offset from current pc
   211   // 4-byte branch offset from current pc
   212   int get_far_dest() const {
   212   int get_far_dest() const {
   213     return cur_bci() + bytecode()->get_offset_s4(cur_bc_raw());
   213     return cur_bci() + bytecode().get_offset_s4(cur_bc_raw());
   214   }
   214   }
   215 
   215 
   216   // For a lookup or switch table, return target destination
   216   // For a lookup or switch table, return target destination
   217   int get_int_table( int index ) const {
   217   int get_int_table( int index ) const {
   218     return Bytes::get_Java_u4((address)&_table_base[index]); }
   218     return Bytes::get_Java_u4((address)&_table_base[index]); }
   405   ciExceptionHandler* handler() {
   405   ciExceptionHandler* handler() {
   406     return _method->_exception_handlers[_pos];
   406     return _method->_exception_handlers[_pos];
   407   }
   407   }
   408 };
   408 };
   409 
   409 
       
   410 
       
   411 
       
   412 // Implementation for declarations in bytecode.hpp
       
   413 Bytecode::Bytecode(const ciBytecodeStream* stream, address bcp): _bcp(bcp != NULL ? bcp : stream->cur_bcp()), _code(Bytecodes::code_at(NULL, addr_at(0))) {}
       
   414 Bytecode_lookupswitch::Bytecode_lookupswitch(const ciBytecodeStream* stream): Bytecode(stream) { verify(); }
       
   415 Bytecode_tableswitch::Bytecode_tableswitch(const ciBytecodeStream* stream): Bytecode(stream) { verify(); }
       
   416 
   410 #endif // SHARE_VM_CI_CISTREAMS_HPP
   417 #endif // SHARE_VM_CI_CISTREAMS_HPP