src/share/vm/ci/ciStreams.cpp

Wed, 09 Jun 2010 18:50:45 -0700

author
jrose
date
Wed, 09 Jun 2010 18:50:45 -0700
changeset 1957
136b78722a08
parent 1934
e9ff18c4ace7
child 2314
f95d63e2154a
permissions
-rw-r--r--

6939203: JSR 292 needs method handle constants
Summary: Add new CP types CONSTANT_MethodHandle, CONSTANT_MethodType; extend 'ldc' bytecode.
Reviewed-by: twisti, never

     1 /*
     2  * Copyright (c) 1999, 2010, 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  */
    25 #include "incls/_precompiled.incl"
    26 #include "incls/_ciStreams.cpp.incl"
    28 // ciExceptionHandlerStream
    29 //
    30 // Walk over some selected set of a methods exception handlers.
    32 // ------------------------------------------------------------------
    33 // ciExceptionHandlerStream::count
    34 //
    35 // How many exception handlers are there in this stream?
    36 //
    37 // Implementation note: Compiler2 needs this functionality, so I had
    38 int ciExceptionHandlerStream::count() {
    39   int save_pos = _pos;
    40   int save_end = _end;
    42   int count = 0;
    44   _pos = -1;
    45   _end = _method->_handler_count;
    48   next();
    49   while (!is_done()) {
    50     count++;
    51     next();
    52   }
    54   _pos = save_pos;
    55   _end = save_end;
    57   return count;
    58 }
    60 int ciExceptionHandlerStream::count_remaining() {
    61   int save_pos = _pos;
    62   int save_end = _end;
    64   int count = 0;
    66   while (!is_done()) {
    67     count++;
    68     next();
    69   }
    71   _pos = save_pos;
    72   _end = save_end;
    74   return count;
    75 }
    77 // ciBytecodeStream
    78 //
    79 // The class is used to iterate over the bytecodes of a method.
    80 // It hides the details of constant pool structure/access by
    81 // providing accessors for constant pool items.
    83 // ------------------------------------------------------------------
    84 // ciBytecodeStream::next_wide_or_table
    85 //
    86 // Special handling for switch ops
    87 Bytecodes::Code ciBytecodeStream::next_wide_or_table(Bytecodes::Code bc) {
    88   switch (bc) {                // Check for special bytecode handling
    89   case Bytecodes::_wide:
    90     // Special handling for the wide bytcode
    91     // Get following bytecode; do not return wide
    92     assert(Bytecodes::Code(_pc[0]) == Bytecodes::_wide, "");
    93     bc = Bytecodes::java_code(_raw_bc = (Bytecodes::Code)_pc[1]);
    94     assert(Bytecodes::wide_length_for(bc) > 2, "must make progress");
    95     _pc += Bytecodes::wide_length_for(bc);
    96     _was_wide = _pc;              // Flag last wide bytecode found
    97     assert(is_wide(), "accessor works right");
    98     break;
   100   case Bytecodes::_lookupswitch:
   101     _pc++;                      // Skip wide bytecode
   102     _pc += (_start-_pc)&3;      // Word align
   103     _table_base = (jint*)_pc;   // Capture for later usage
   104                                 // table_base[0] is default far_dest
   105     // Table has 2 lead elements (default, length), then pairs of u4 values.
   106     // So load table length, and compute address at end of table
   107     _pc = (address)&_table_base[2+ 2*Bytes::get_Java_u4((address)&_table_base[1])];
   108     break;
   110   case Bytecodes::_tableswitch: {
   111     _pc++;                      // Skip wide bytecode
   112     _pc += (_start-_pc)&3;      // Word align
   113     _table_base = (jint*)_pc;   // Capture for later usage
   114                                 // table_base[0] is default far_dest
   115     int lo = Bytes::get_Java_u4((address)&_table_base[1]);// Low bound
   116     int hi = Bytes::get_Java_u4((address)&_table_base[2]);// High bound
   117     int len = hi - lo + 1;      // Dense table size
   118     _pc = (address)&_table_base[3+len]; // Skip past table
   119     break;
   120   }
   122   default:
   123     fatal("unhandled bytecode");
   124   }
   125   return bc;
   126 }
   128 // ------------------------------------------------------------------
   129 // ciBytecodeStream::reset_to_bci
   130 void ciBytecodeStream::reset_to_bci( int bci ) {
   131   _bc_start=_was_wide=0;
   132   _pc = _start+bci;
   133 }
   135 // ------------------------------------------------------------------
   136 // ciBytecodeStream::force_bci
   137 void ciBytecodeStream::force_bci(int bci) {
   138   if (bci < 0) {
   139     reset_to_bci(0);
   140     _bc_start = _start + bci;
   141     _bc = EOBC();
   142   } else {
   143     reset_to_bci(bci);
   144     next();
   145   }
   146 }
   149 // ------------------------------------------------------------------
   150 // Constant pool access
   151 // ------------------------------------------------------------------
   153 // ------------------------------------------------------------------
   154 // ciBytecodeStream::get_klass_index
   155 //
   156 // If this bytecodes references a klass, return the index of the
   157 // referenced klass.
   158 int ciBytecodeStream::get_klass_index() const {
   159   switch(cur_bc()) {
   160   case Bytecodes::_ldc:
   161     return get_index_u1();
   162   case Bytecodes::_ldc_w:
   163   case Bytecodes::_ldc2_w:
   164   case Bytecodes::_checkcast:
   165   case Bytecodes::_instanceof:
   166   case Bytecodes::_anewarray:
   167   case Bytecodes::_multianewarray:
   168   case Bytecodes::_new:
   169   case Bytecodes::_newarray:
   170     return get_index_u2();
   171   default:
   172     ShouldNotReachHere();
   173     return 0;
   174   }
   175 }
   177 // ------------------------------------------------------------------
   178 // ciBytecodeStream::get_klass
   179 //
   180 // If this bytecode is a new, newarray, multianewarray, instanceof,
   181 // or checkcast, get the referenced klass.
   182 ciKlass* ciBytecodeStream::get_klass(bool& will_link) {
   183   VM_ENTRY_MARK;
   184   constantPoolHandle cpool(_method->get_methodOop()->constants());
   185   return CURRENT_ENV->get_klass_by_index(cpool, get_klass_index(), will_link, _holder);
   186 }
   188 // ------------------------------------------------------------------
   189 // ciBytecodeStream::get_constant_raw_index
   190 //
   191 // If this bytecode is one of the ldc variants, get the index of the
   192 // referenced constant.
   193 int ciBytecodeStream::get_constant_raw_index() const {
   194   // work-alike for Bytecode_loadconstant::raw_index()
   195   switch (cur_bc()) {
   196   case Bytecodes::_ldc:
   197     return get_index_u1();
   198   case Bytecodes::_ldc_w:
   199   case Bytecodes::_ldc2_w:
   200     return get_index_u2();
   201   default:
   202     ShouldNotReachHere();
   203     return 0;
   204   }
   205 }
   207 // ------------------------------------------------------------------
   208 // ciBytecodeStream::get_constant_pool_index
   209 // Decode any CP cache index into a regular pool index.
   210 int ciBytecodeStream::get_constant_pool_index() const {
   211   // work-alike for Bytecode_loadconstant::pool_index()
   212   int index = get_constant_raw_index();
   213   if (has_cache_index()) {
   214     return get_cpcache()->get_pool_index(index);
   215   }
   216   return index;
   217 }
   219 // ------------------------------------------------------------------
   220 // ciBytecodeStream::get_constant_cache_index
   221 // Return the CP cache index, or -1 if there isn't any.
   222 int ciBytecodeStream::get_constant_cache_index() const {
   223   // work-alike for Bytecode_loadconstant::cache_index()
   224   return has_cache_index() ? get_constant_raw_index() : -1;
   225 }
   227 // ------------------------------------------------------------------
   228 // ciBytecodeStream::get_constant
   229 //
   230 // If this bytecode is one of the ldc variants, get the referenced
   231 // constant.
   232 ciConstant ciBytecodeStream::get_constant() {
   233   int pool_index = get_constant_raw_index();
   234   int cache_index = -1;
   235   if (has_cache_index()) {
   236     cache_index = pool_index;
   237     pool_index = -1;
   238   }
   239   VM_ENTRY_MARK;
   240   constantPoolHandle cpool(_method->get_methodOop()->constants());
   241   return CURRENT_ENV->get_constant_by_index(cpool, pool_index, cache_index, _holder);
   242 }
   244 // ------------------------------------------------------------------
   245 // ciBytecodeStream::get_constant_pool_tag
   246 //
   247 // If this bytecode is one of the ldc variants, get the referenced
   248 // constant.
   249 constantTag ciBytecodeStream::get_constant_pool_tag(int index) const {
   250   VM_ENTRY_MARK;
   251   return _method->get_methodOop()->constants()->tag_at(index);
   252 }
   254 // ------------------------------------------------------------------
   255 // ciBytecodeStream::get_field_index
   256 //
   257 // If this is a field access bytecode, get the constant pool
   258 // index of the referenced field.
   259 int ciBytecodeStream::get_field_index() {
   260   assert(cur_bc() == Bytecodes::_getfield ||
   261          cur_bc() == Bytecodes::_putfield ||
   262          cur_bc() == Bytecodes::_getstatic ||
   263          cur_bc() == Bytecodes::_putstatic, "wrong bc");
   264   return get_index_u2_cpcache();
   265 }
   268 // ------------------------------------------------------------------
   269 // ciBytecodeStream::get_field
   270 //
   271 // If this bytecode is one of get_field, get_static, put_field,
   272 // or put_static, get the referenced field.
   273 ciField* ciBytecodeStream::get_field(bool& will_link) {
   274   ciField* f = CURRENT_ENV->get_field_by_index(_holder, get_field_index());
   275   will_link = f->will_link(_holder, _bc);
   276   return f;
   277 }
   280 // ------------------------------------------------------------------
   281 // ciBytecodeStream::get_declared_field_holder
   282 //
   283 // Get the declared holder of the currently referenced field.
   284 //
   285 // Usage note: the holder() of a ciField class returns the canonical
   286 // holder of the field, rather than the holder declared in the
   287 // bytecodes.
   288 //
   289 // There is no "will_link" result passed back.  The user is responsible
   290 // for checking linkability when retrieving the associated field.
   291 ciInstanceKlass* ciBytecodeStream::get_declared_field_holder() {
   292   VM_ENTRY_MARK;
   293   constantPoolHandle cpool(_method->get_methodOop()->constants());
   294   int holder_index = get_field_holder_index();
   295   bool ignore;
   296   return CURRENT_ENV->get_klass_by_index(cpool, holder_index, ignore, _holder)
   297       ->as_instance_klass();
   298 }
   300 // ------------------------------------------------------------------
   301 // ciBytecodeStream::get_field_holder_index
   302 //
   303 // Get the constant pool index of the declared holder of the field
   304 // referenced by the current bytecode.  Used for generating
   305 // deoptimization information.
   306 int ciBytecodeStream::get_field_holder_index() {
   307   GUARDED_VM_ENTRY(
   308     constantPoolOop cpool = _holder->get_instanceKlass()->constants();
   309     return cpool->klass_ref_index_at(get_field_index());
   310   )
   311 }
   313 // ------------------------------------------------------------------
   314 // ciBytecodeStream::get_field_signature_index
   315 //
   316 // Get the constant pool index of the signature of the field
   317 // referenced by the current bytecode.  Used for generating
   318 // deoptimization information.
   319 int ciBytecodeStream::get_field_signature_index() {
   320   VM_ENTRY_MARK;
   321   constantPoolOop cpool = _holder->get_instanceKlass()->constants();
   322   int nt_index = cpool->name_and_type_ref_index_at(get_field_index());
   323   return cpool->signature_ref_index_at(nt_index);
   324 }
   326 // ------------------------------------------------------------------
   327 // ciBytecodeStream::get_method_index
   328 //
   329 // If this is a method invocation bytecode, get the constant pool
   330 // index of the invoked method.
   331 int ciBytecodeStream::get_method_index() {
   332 #ifdef ASSERT
   333   switch (cur_bc()) {
   334   case Bytecodes::_invokeinterface:
   335   case Bytecodes::_invokevirtual:
   336   case Bytecodes::_invokespecial:
   337   case Bytecodes::_invokestatic:
   338   case Bytecodes::_invokedynamic:
   339     break;
   340   default:
   341     ShouldNotReachHere();
   342   }
   343 #endif
   344   if (has_index_u4())
   345     return get_index_u4();  // invokedynamic
   346   return get_index_u2_cpcache();
   347 }
   349 // ------------------------------------------------------------------
   350 // ciBytecodeStream::get_method
   351 //
   352 // If this is a method invocation bytecode, get the invoked method.
   353 ciMethod* ciBytecodeStream::get_method(bool& will_link) {
   354   VM_ENTRY_MARK;
   355   constantPoolHandle cpool(_method->get_methodOop()->constants());
   356   ciMethod* m = CURRENT_ENV->get_method_by_index(cpool, get_method_index(), cur_bc(), _holder);
   357   will_link = m->is_loaded();
   358   return m;
   359 }
   361 // ------------------------------------------------------------------
   362 // ciBytecodeStream::get_declared_method_holder
   363 //
   364 // Get the declared holder of the currently referenced method.
   365 //
   366 // Usage note: the holder() of a ciMethod class returns the canonical
   367 // holder of the method, rather than the holder declared in the
   368 // bytecodes.
   369 //
   370 // There is no "will_link" result passed back.  The user is responsible
   371 // for checking linkability when retrieving the associated method.
   372 ciKlass* ciBytecodeStream::get_declared_method_holder() {
   373   VM_ENTRY_MARK;
   374   constantPoolHandle cpool(_method->get_methodOop()->constants());
   375   bool ignore;
   376   // report as InvokeDynamic for invokedynamic, which is syntactically classless
   377   if (cur_bc() == Bytecodes::_invokedynamic)
   378     return CURRENT_ENV->get_klass_by_name(_holder, ciSymbol::java_dyn_InvokeDynamic(), false);
   379   return CURRENT_ENV->get_klass_by_index(cpool, get_method_holder_index(), ignore, _holder);
   380 }
   382 // ------------------------------------------------------------------
   383 // ciBytecodeStream::get_method_holder_index
   384 //
   385 // Get the constant pool index of the declared holder of the method
   386 // referenced by the current bytecode.  Used for generating
   387 // deoptimization information.
   388 int ciBytecodeStream::get_method_holder_index() {
   389   constantPoolOop cpool = _method->get_methodOop()->constants();
   390   return cpool->klass_ref_index_at(get_method_index());
   391 }
   393 // ------------------------------------------------------------------
   394 // ciBytecodeStream::get_method_signature_index
   395 //
   396 // Get the constant pool index of the signature of the method
   397 // referenced by the current bytecode.  Used for generating
   398 // deoptimization information.
   399 int ciBytecodeStream::get_method_signature_index() {
   400   VM_ENTRY_MARK;
   401   constantPoolOop cpool = _holder->get_instanceKlass()->constants();
   402   int method_index = get_method_index();
   403   int name_and_type_index = cpool->name_and_type_ref_index_at(method_index);
   404   return cpool->signature_ref_index_at(name_and_type_index);
   405 }
   407 // ------------------------------------------------------------------
   408 // ciBytecodeStream::get_cpcache
   409 ciCPCache* ciBytecodeStream::get_cpcache() const {
   410   if (_cpcache == NULL) {
   411     VM_ENTRY_MARK;
   412     // Get the constant pool.
   413     constantPoolOop      cpool   = _holder->get_instanceKlass()->constants();
   414     constantPoolCacheOop cpcache = cpool->cache();
   416     *(ciCPCache**)&_cpcache = CURRENT_ENV->get_object(cpcache)->as_cpcache();
   417   }
   418   return _cpcache;
   419 }
   421 // ------------------------------------------------------------------
   422 // ciBytecodeStream::get_call_site
   423 ciCallSite* ciBytecodeStream::get_call_site() {
   424   VM_ENTRY_MARK;
   425   // Get the constant pool.
   426   constantPoolOop      cpool   = _holder->get_instanceKlass()->constants();
   427   constantPoolCacheOop cpcache = cpool->cache();
   429   // Get the CallSite from the constant pool cache.
   430   int method_index = get_method_index();
   431   ConstantPoolCacheEntry* cpcache_entry = cpcache->secondary_entry_at(method_index);
   432   oop call_site_oop = cpcache_entry->f1();
   434   // Create a CallSite object and return it.
   435   return CURRENT_ENV->get_object(call_site_oop)->as_call_site();
   436 }

mercurial