From f3d4f23afdab2879f9f1389c15993aa45fbea026 Mon Sep 17 00:00:00 2001 From: Matias Saavedra Silva Date: Fri, 30 Aug 2024 17:08:59 +0000 Subject: [PATCH 1/4] 8338471: Refactor Method::get_new_method() for better NoSuchMethodError handling --- src/hotspot/share/classfile/javaClasses.cpp | 3 +-- src/hotspot/share/oops/method.hpp | 8 +++----- src/hotspot/share/prims/resolvedMethodTable.cpp | 4 +--- 3 files changed, 5 insertions(+), 10 deletions(-) diff --git a/src/hotspot/share/classfile/javaClasses.cpp b/src/hotspot/share/classfile/javaClasses.cpp index b6ef682ae0965..8567feaef1a36 100644 --- a/src/hotspot/share/classfile/javaClasses.cpp +++ b/src/hotspot/share/classfile/javaClasses.cpp @@ -4417,8 +4417,7 @@ oop java_lang_invoke_ResolvedMethodName::find_resolved_method(const methodHandle NoSafepointVerifier nsv; if (method->is_old()) { - method = (method->is_deleted()) ? Universe::throw_no_such_method_error() : - method->get_new_method(); + method = method->get_new_method(); } InstanceKlass* holder = method->method_holder(); diff --git a/src/hotspot/share/oops/method.hpp b/src/hotspot/share/oops/method.hpp index 905c53a4ea38b..cb720086c870e 100644 --- a/src/hotspot/share/oops/method.hpp +++ b/src/hotspot/share/oops/method.hpp @@ -27,6 +27,7 @@ #include "code/compressedStream.hpp" #include "compiler/compilerDefinitions.hpp" +#include "memory/universe.hpp" #include "oops/annotations.hpp" #include "oops/constantPool.hpp" #include "oops/methodFlags.hpp" @@ -847,12 +848,9 @@ class Method : public Metadata { void release_C_heap_structures(); Method* get_new_method() const { - InstanceKlass* holder = method_holder(); - Method* new_method = holder->method_with_idnum(orig_method_idnum()); - - assert(new_method != nullptr, "method_with_idnum() should not be null"); + Method* new_method = method_holder()->method_with_idnum(orig_method_idnum()); assert(this != new_method, "sanity check"); - return new_method; + return new_method == nullptr ? Universe::throw_no_such_method_error() : new_method; } // Printing diff --git a/src/hotspot/share/prims/resolvedMethodTable.cpp b/src/hotspot/share/prims/resolvedMethodTable.cpp index 0dd96357506f6..8c29281b24847 100644 --- a/src/hotspot/share/prims/resolvedMethodTable.cpp +++ b/src/hotspot/share/prims/resolvedMethodTable.cpp @@ -353,9 +353,7 @@ class AdjustMethodEntries : public StackObj { if (old_method->is_old()) { - Method* new_method = (old_method->is_deleted()) ? - Universe::throw_no_such_method_error() : - old_method->get_new_method(); + Method* new_method = old_method->get_new_method(); java_lang_invoke_ResolvedMethodName::set_vmtarget(mem_name, new_method); ResourceMark rm; From ba1cb1b80d9e9b29a060ddbe4a59f7ac60737d79 Mon Sep 17 00:00:00 2001 From: Matias Saavedra Silva Date: Fri, 6 Sep 2024 19:47:54 +0000 Subject: [PATCH 2/4] Fixed conditional to check for is_deleted() --- src/hotspot/share/oops/method.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hotspot/share/oops/method.hpp b/src/hotspot/share/oops/method.hpp index cb720086c870e..a4960e9dc2854 100644 --- a/src/hotspot/share/oops/method.hpp +++ b/src/hotspot/share/oops/method.hpp @@ -850,7 +850,7 @@ class Method : public Metadata { Method* get_new_method() const { Method* new_method = method_holder()->method_with_idnum(orig_method_idnum()); assert(this != new_method, "sanity check"); - return new_method == nullptr ? Universe::throw_no_such_method_error() : new_method; + return (new_method == nullptr || is_deleted()) ? Universe::throw_no_such_method_error() : new_method; } // Printing From bd1cc1e8d3f07d4ab8a14aacdf9f3c46269a798e Mon Sep 17 00:00:00 2001 From: Matias Saavedra Silva Date: Mon, 9 Sep 2024 21:08:36 +0000 Subject: [PATCH 3/4] Added assert --- src/hotspot/share/oops/method.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/hotspot/share/oops/method.hpp b/src/hotspot/share/oops/method.hpp index a4960e9dc2854..06ee85d661996 100644 --- a/src/hotspot/share/oops/method.hpp +++ b/src/hotspot/share/oops/method.hpp @@ -848,6 +848,7 @@ class Method : public Metadata { void release_C_heap_structures(); Method* get_new_method() const { + assert(is_old(), "must be"); Method* new_method = method_holder()->method_with_idnum(orig_method_idnum()); assert(this != new_method, "sanity check"); return (new_method == nullptr || is_deleted()) ? Universe::throw_no_such_method_error() : new_method; From e95d2bd17c4869dbc46cbb2236d192e82dcd24d3 Mon Sep 17 00:00:00 2001 From: Matias Saavedra Silva Date: Wed, 11 Sep 2024 20:58:31 +0000 Subject: [PATCH 4/4] Coleen suggestion --- src/hotspot/share/oops/method.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/hotspot/share/oops/method.hpp b/src/hotspot/share/oops/method.hpp index 06ee85d661996..3649b19c3b8b6 100644 --- a/src/hotspot/share/oops/method.hpp +++ b/src/hotspot/share/oops/method.hpp @@ -851,6 +851,7 @@ class Method : public Metadata { assert(is_old(), "must be"); Method* new_method = method_holder()->method_with_idnum(orig_method_idnum()); assert(this != new_method, "sanity check"); + assert(new_method != nullptr || is_deleted(), "must be"); return (new_method == nullptr || is_deleted()) ? Universe::throw_no_such_method_error() : new_method; }