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