1 /*
  2  * Copyright (c) 2023, 2024, 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 #include "precompiled.hpp"
 26 #include "cds/archiveBuilder.hpp"
 27 #include "oops/method.hpp"
 28 #include "oops/resolvedMethodEntry.hpp"
 29 
 30 bool ResolvedMethodEntry::check_no_old_or_obsolete_entry() {
 31   // return false if m refers to a non-deleted old or obsolete method
 32   if (_method != nullptr) {
 33     assert(_method->is_valid() && _method->is_method(), "m is a valid method");
 34     return !_method->is_old() && !_method->is_obsolete(); // old is always set for old and obsolete
 35   } else {
 36     return true;
 37   }
 38 }
 39 
 40 void ResolvedMethodEntry::reset_entry() {
 41   if (has_resolved_references_index()) {
 42     u2 saved_resolved_references_index = _entry_specific._resolved_references_index;
 43     u2 saved_cpool_index = _cpool_index;
 44     memset(this, 0, sizeof(*this));
 45     set_resolved_references_index(saved_resolved_references_index);
 46     _cpool_index = saved_cpool_index;
 47   } else {
 48     u2 saved_cpool_index = _cpool_index;
 49     memset(this, 0, sizeof(*this));
 50     _cpool_index = saved_cpool_index;
 51   }
 52 }
 53 
 54 #if INCLUDE_CDS
 55 void ResolvedMethodEntry::remove_unshareable_info() {
 56   reset_entry();
 57 }
 58 
 59 void ResolvedMethodEntry::mark_and_relocate(ConstantPool* src_cp) {
 60   if (_method == nullptr) {
 61     assert(bytecode2() == Bytecodes::_invokevirtual, "");
 62   } else {
 63     ArchiveBuilder::current()->mark_and_relocate_to_buffered_addr(&_method);
 64   }
 65   if (bytecode1() == Bytecodes::_invokeinterface) {
 66     ArchiveBuilder::current()->mark_and_relocate_to_buffered_addr(&_entry_specific._interface_klass);
 67   }
 68 }
 69 #endif
 70 
 71 void ResolvedMethodEntry::print_on(outputStream* st) const {
 72   st->print_cr("Method Entry:");
 73 
 74   if (method() != nullptr) {
 75     st->print_cr(" - Method: " INTPTR_FORMAT " %s", p2i(method()), method()->external_name());
 76   } else {
 77     st->print_cr("- Method: null");
 78   }
 79   // Some fields are mutually exclusive and are only used by certain invoke codes
 80   if (bytecode1() == Bytecodes::_invokeinterface && interface_klass() != nullptr) {
 81     st->print_cr(" - Klass: " INTPTR_FORMAT " %s", p2i(interface_klass()), interface_klass()->external_name());
 82   } else {
 83     st->print_cr("- Klass: null");
 84   }
 85   if (bytecode1() == Bytecodes::_invokehandle) {
 86     st->print_cr(" - Resolved References Index: %d", resolved_references_index());
 87   } else {
 88     st->print_cr(" - Resolved References Index: none");
 89   }
 90   if (bytecode2() == Bytecodes::_invokevirtual) {
 91 #ifdef ASSERT
 92     if (_has_table_index) {
 93       st->print_cr(" - Table Index: %d", table_index());
 94     }
 95 #else
 96     st->print_cr(" - Table Index: %d", table_index());
 97 #endif
 98   } else {
 99     st->print_cr(" - Table Index: none");
100   }
101   st->print_cr(" - CP Index: %d", constant_pool_index());
102   st->print_cr(" - TOS: %s", type2name(as_BasicType((TosState)tos_state())));
103   st->print_cr(" - Number of Parameters: %d", number_of_parameters());
104   st->print_cr(" - Is Virtual Final: %d", is_vfinal());
105   st->print_cr(" - Is Final: %d", is_final());
106   st->print_cr(" - Is Forced Virtual: %d", is_forced_virtual());
107   st->print_cr(" - Has Appendix: %d", has_appendix());
108   st->print_cr(" - Has Local Signature: %d", has_local_signature());
109   st->print_cr(" - Bytecode 1: %s", Bytecodes::name((Bytecodes::Code)bytecode1()));
110   st->print_cr(" - Bytecode 2: %s", Bytecodes::name((Bytecodes::Code)bytecode2()));
111 }