From 7c0f013d924a66c9cf55de761702b8de855e87fa Mon Sep 17 00:00:00 2001 From: Oli Gillespie Date: Mon, 9 Sep 2024 14:53:36 +0000 Subject: [PATCH] 8339488: Extended NPE message doesn't handle CONSTANT_Dynamic Reviewed-by: lmesnik, coleenp, simonis, liach --- .../share/interpreter/bytecodeUtils.cpp | 2 +- .../condy/CondyExtendedNullPointer.jasm | 53 +++++++++++++++++++ .../condy/CondyExtendedNullPointerTest.java | 45 ++++++++++++++++ 3 files changed, 99 insertions(+), 1 deletion(-) create mode 100644 test/hotspot/jtreg/runtime/condy/CondyExtendedNullPointer.jasm create mode 100644 test/hotspot/jtreg/runtime/condy/CondyExtendedNullPointerTest.java diff --git a/src/hotspot/share/interpreter/bytecodeUtils.cpp b/src/hotspot/share/interpreter/bytecodeUtils.cpp index 34fd2b8d566..d86eda0cbe9 100644 --- a/src/hotspot/share/interpreter/bytecodeUtils.cpp +++ b/src/hotspot/share/interpreter/bytecodeUtils.cpp @@ -643,7 +643,7 @@ int ExceptionMessageBuilder::do_instruction(int bci) { } } - constantTag tag = cp->tag_at(cp_index); + constantTag tag = cp->constant_tag_at(cp_index); if (tag.is_klass() || tag.is_unresolved_klass() || tag.is_method() || tag.is_interface_method() || tag.is_field() || tag.is_string()) { diff --git a/test/hotspot/jtreg/runtime/condy/CondyExtendedNullPointer.jasm b/test/hotspot/jtreg/runtime/condy/CondyExtendedNullPointer.jasm new file mode 100644 index 00000000000..7697b0c46da --- /dev/null +++ b/test/hotspot/jtreg/runtime/condy/CondyExtendedNullPointer.jasm @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * This test generates an extended NullPointerException inside a method with + * a condy ldc. We add two ldc instructions and a pop around the real null + * value to stress the stack handling of the NPE message generator. + */ +class CondyExtendedNullPointer + version 55:0 +{ + +static Field nullObject:"Ljava/lang/Object;"; + +public static Method condy:"(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/Class;)I" + stack 1 locals 3 +{ + bipush 123; + ireturn; +} + +public static Method main:"([Ljava/lang/String;)V" + stack 3 locals 1 +{ + ldc Dynamic REF_invokeStatic:CondyExtendedNullPointer.condy:"(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/Class;)I":I:"I"; + getstatic Field nullObject:"Ljava/lang/Object;"; + ldc Dynamic REF_invokeStatic:CondyExtendedNullPointer.condy:"(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/Class;)I":I:"I"; + pop; + invokevirtual Method java/lang/Object.notify:"()V"; + return; +} + +} // end Class CondyExtendedNullPointer diff --git a/test/hotspot/jtreg/runtime/condy/CondyExtendedNullPointerTest.java b/test/hotspot/jtreg/runtime/condy/CondyExtendedNullPointerTest.java new file mode 100644 index 00000000000..665633796f6 --- /dev/null +++ b/test/hotspot/jtreg/runtime/condy/CondyExtendedNullPointerTest.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8339488 + * @summary Test extended NullPointerException message in method with CONSTANT_Dynamic. + * @modules java.base/jdk.internal.misc + * @library /test/lib + * @compile CondyExtendedNullPointer.jasm + * @run driver CondyExtendedNullPointerTest + */ + +import jdk.test.lib.process.ProcessTools; +import jdk.test.lib.process.OutputAnalyzer; + +public class CondyExtendedNullPointerTest { + public static void main(String args[]) throws Throwable { + ProcessBuilder pb = ProcessTools.createTestJavaProcessBuilder("-Xverify:all", + "CondyExtendedNullPointer"); + OutputAnalyzer oa = new OutputAnalyzer(pb.start()); + oa.shouldContain("Cannot invoke \"Object.notify()\" because \"CondyExtendedNullPointer.nullObject\" is null"); + oa.shouldHaveExitValue(1); + } +}