src/share/vm/interpreter/bytecode.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) 1997, 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/_bytecode.cpp.incl"
    28 // Implementation of Bytecode
    30 bool Bytecode::check_must_rewrite(Bytecodes::Code code) const {
    31   assert(Bytecodes::can_rewrite(code), "post-check only");
    33   // Some codes are conditionally rewriting.  Look closely at them.
    34   switch (code) {
    35   case Bytecodes::_aload_0:
    36     // Even if RewriteFrequentPairs is turned on,
    37     // the _aload_0 code might delay its rewrite until
    38     // a following _getfield rewrites itself.
    39     return false;
    41   case Bytecodes::_lookupswitch:
    42     return false;  // the rewrite is not done by the interpreter
    44   case Bytecodes::_new:
    45     // (Could actually look at the class here, but the profit would be small.)
    46     return false;  // the rewrite is not always done
    47   }
    49   // No other special cases.
    50   return true;
    51 }
    54 #ifdef ASSERT
    56 void Bytecode::assert_same_format_as(Bytecodes::Code testbc, bool is_wide) const {
    57   Bytecodes::Code thisbc = Bytecodes::cast(byte_at(0));
    58   if (thisbc == Bytecodes::_breakpoint)  return;  // let the assertion fail silently
    59   if (is_wide) {
    60     assert(thisbc == Bytecodes::_wide, "expected a wide instruction");
    61     thisbc = Bytecodes::cast(byte_at(1));
    62     if (thisbc == Bytecodes::_breakpoint)  return;
    63   }
    64   int thisflags = Bytecodes::flags(testbc, is_wide) & Bytecodes::_all_fmt_bits;
    65   int testflags = Bytecodes::flags(thisbc, is_wide) & Bytecodes::_all_fmt_bits;
    66   if (thisflags != testflags)
    67     tty->print_cr("assert_same_format_as(%d) failed on bc=%d%s; %d != %d",
    68                   (int)testbc, (int)thisbc, (is_wide?"/wide":""), testflags, thisflags);
    69   assert(thisflags == testflags, "expected format");
    70 }
    72 void Bytecode::assert_index_size(int size, Bytecodes::Code bc, bool is_wide) {
    73   int have_fmt = (Bytecodes::flags(bc, is_wide)
    74                   & (Bytecodes::_fmt_has_u2 | Bytecodes::_fmt_has_u4 |
    75                      Bytecodes::_fmt_not_simple |
    76                      // Not an offset field:
    77                      Bytecodes::_fmt_has_o));
    78   int need_fmt = -1;
    79   switch (size) {
    80   case 1: need_fmt = 0;                      break;
    81   case 2: need_fmt = Bytecodes::_fmt_has_u2; break;
    82   case 4: need_fmt = Bytecodes::_fmt_has_u4; break;
    83   }
    84   if (is_wide)  need_fmt |= Bytecodes::_fmt_not_simple;
    85   if (have_fmt != need_fmt) {
    86     tty->print_cr("assert_index_size %d: bc=%d%s %d != %d", size, bc, (is_wide?"/wide":""), have_fmt, need_fmt);
    87     assert(have_fmt == need_fmt, "assert_index_size");
    88   }
    89 }
    91 void Bytecode::assert_offset_size(int size, Bytecodes::Code bc, bool is_wide) {
    92   int have_fmt = Bytecodes::flags(bc, is_wide) & Bytecodes::_all_fmt_bits;
    93   int need_fmt = -1;
    94   switch (size) {
    95   case 2: need_fmt = Bytecodes::_fmt_bo2; break;
    96   case 4: need_fmt = Bytecodes::_fmt_bo4; break;
    97   }
    98   if (is_wide)  need_fmt |= Bytecodes::_fmt_not_simple;
    99   if (have_fmt != need_fmt) {
   100     tty->print_cr("assert_offset_size %d: bc=%d%s %d != %d", size, bc, (is_wide?"/wide":""), have_fmt, need_fmt);
   101     assert(have_fmt == need_fmt, "assert_offset_size");
   102   }
   103 }
   105 void Bytecode::assert_constant_size(int size, int where, Bytecodes::Code bc, bool is_wide) {
   106   int have_fmt = Bytecodes::flags(bc, is_wide) & (Bytecodes::_all_fmt_bits
   107                                                   // Ignore any 'i' field (for iinc):
   108                                                   & ~Bytecodes::_fmt_has_i);
   109   int need_fmt = -1;
   110   switch (size) {
   111   case 1: need_fmt = Bytecodes::_fmt_bc;                          break;
   112   case 2: need_fmt = Bytecodes::_fmt_bc | Bytecodes::_fmt_has_u2; break;
   113   }
   114   if (is_wide)  need_fmt |= Bytecodes::_fmt_not_simple;
   115   int length = is_wide ? Bytecodes::wide_length_for(bc) : Bytecodes::length_for(bc);
   116   if (have_fmt != need_fmt || where + size != length) {
   117     tty->print_cr("assert_constant_size %d @%d: bc=%d%s %d != %d", size, where, bc, (is_wide?"/wide":""), have_fmt, need_fmt);
   118   }
   119   assert(have_fmt == need_fmt, "assert_constant_size");
   120   assert(where + size == length, "assert_constant_size oob");
   121 }
   123 void Bytecode::assert_native_index(Bytecodes::Code bc, bool is_wide) {
   124   assert((Bytecodes::flags(bc, is_wide) & Bytecodes::_fmt_has_nbo) != 0, "native index");
   125 }
   127 #endif //ASSERT
   129 // Implementation of Bytecode_tableupswitch
   131 int Bytecode_tableswitch::dest_offset_at(int i) const {
   132   return get_Java_u4_at(aligned_offset(1 + (3 + i)*jintSize));
   133 }
   136 // Implementation of Bytecode_invoke
   138 void Bytecode_invoke::verify() const {
   139   assert(is_valid(), "check invoke");
   140   assert(method()->constants()->cache() != NULL, "do not call this from verifier or rewriter");
   141 }
   144 symbolOop Bytecode_member_ref::signature() const {
   145   constantPoolOop constants = method()->constants();
   146   return constants->signature_ref_at(index());
   147 }
   150 symbolOop Bytecode_member_ref::name() const {
   151   constantPoolOop constants = method()->constants();
   152   return constants->name_ref_at(index());
   153 }
   156 BasicType Bytecode_member_ref::result_type(Thread *thread) const {
   157   symbolHandle sh(thread, signature());
   158   ResultTypeFinder rts(sh);
   159   rts.iterate();
   160   return rts.type();
   161 }
   164 methodHandle Bytecode_invoke::static_target(TRAPS) {
   165   methodHandle m;
   166   KlassHandle resolved_klass;
   167   constantPoolHandle constants(THREAD, _method->constants());
   169   if (java_code() == Bytecodes::_invokedynamic) {
   170     LinkResolver::resolve_dynamic_method(m, resolved_klass, constants, index(), CHECK_(methodHandle()));
   171   } else if (java_code() != Bytecodes::_invokeinterface) {
   172     LinkResolver::resolve_method(m, resolved_klass, constants, index(), CHECK_(methodHandle()));
   173   } else {
   174     LinkResolver::resolve_interface_method(m, resolved_klass, constants, index(), CHECK_(methodHandle()));
   175   }
   176   return m;
   177 }
   180 int Bytecode_member_ref::index() const {
   181   // Note:  Rewriter::rewrite changes the Java_u2 of an invokedynamic to a native_u4,
   182   // at the same time it allocates per-call-site CP cache entries.
   183   Bytecodes::Code rawc = code();
   184   Bytecode* invoke = bytecode();
   185   if (invoke->has_index_u4(rawc))
   186     return invoke->get_index_u4(rawc);
   187   else
   188     return invoke->get_index_u2_cpcache(rawc);
   189 }
   191 int Bytecode_member_ref::pool_index() const {
   192   int index = this->index();
   193   DEBUG_ONLY({
   194       if (!bytecode()->has_index_u4(code()))
   195         index -= constantPoolOopDesc::CPCACHE_INDEX_TAG;
   196     });
   197   return _method->constants()->cache()->entry_at(index)->constant_pool_index();
   198 }
   200 // Implementation of Bytecode_field
   202 void Bytecode_field::verify() const {
   203   assert(is_valid(), "check field");
   204 }
   207 // Implementation of Bytecode_loadconstant
   209 int Bytecode_loadconstant::raw_index() const {
   210   Bytecode* bcp = bytecode();
   211   Bytecodes::Code rawc = bcp->code();
   212   assert(rawc != Bytecodes::_wide, "verifier prevents this");
   213   if (Bytecodes::java_code(rawc) == Bytecodes::_ldc)
   214     return bcp->get_index_u1(rawc);
   215   else
   216     return bcp->get_index_u2(rawc, false);
   217 }
   219 int Bytecode_loadconstant::pool_index() const {
   220   int index = raw_index();
   221   if (has_cache_index()) {
   222     return _method->constants()->cache()->entry_at(index)->constant_pool_index();
   223   }
   224   return index;
   225 }
   227 BasicType Bytecode_loadconstant::result_type() const {
   228   int index = pool_index();
   229   constantTag tag = _method->constants()->tag_at(index);
   230   return tag.basic_type();
   231 }
   233 oop Bytecode_loadconstant::resolve_constant(TRAPS) const {
   234   assert(_method.not_null(), "must supply method to resolve constant");
   235   int index = raw_index();
   236   constantPoolOop constants = _method->constants();
   237   if (has_cache_index()) {
   238     return constants->resolve_cached_constant_at(index, THREAD);
   239   } else {
   240     return constants->resolve_constant_at(index, THREAD);
   241   }
   242 }
   244 //------------------------------------------------------------------------------
   245 // Non-product code
   247 #ifndef PRODUCT
   249 void Bytecode_lookupswitch::verify() const {
   250   switch (Bytecodes::java_code(code())) {
   251     case Bytecodes::_lookupswitch:
   252       { int i = number_of_pairs() - 1;
   253         while (i-- > 0) {
   254           assert(pair_at(i)->match() < pair_at(i+1)->match(), "unsorted table entries");
   255         }
   256       }
   257       break;
   258     default:
   259       fatal("not a lookupswitch bytecode");
   260   }
   261 }
   263 void Bytecode_tableswitch::verify() const {
   264   switch (Bytecodes::java_code(code())) {
   265     case Bytecodes::_tableswitch:
   266       { int lo = low_key();
   267         int hi = high_key();
   268         assert (hi >= lo, "incorrect hi/lo values in tableswitch");
   269         int i  = hi - lo - 1 ;
   270         while (i-- > 0) {
   271           // no special check needed
   272         }
   273       }
   274       break;
   275     default:
   276       fatal("not a tableswitch bytecode");
   277   }
   278 }
   280 #endif

mercurial