From 70e1c92a7f1b5450058a2dd7dbdf9d88eb85e970 Mon Sep 17 00:00:00 2001 From: Coleen Phillimore Date: Wed, 21 Jun 2023 11:45:37 +0000 Subject: [PATCH] 8310297: assert(static_cast(result) == thing) with ctw Reviewed-by: iklam, dholmes --- src/hotspot/share/classfile/javaClasses.cpp | 8 +-- .../ConstantPool/ByteFieldInitTest.java | 55 +++++++++++++++++++ .../ConstantPool/CompatByteFieldInit.jasm | 38 +++++++++++++ 3 files changed, 97 insertions(+), 4 deletions(-) create mode 100644 test/hotspot/jtreg/runtime/ConstantPool/ByteFieldInitTest.java create mode 100644 test/hotspot/jtreg/runtime/ConstantPool/CompatByteFieldInit.jasm diff --git a/src/hotspot/share/classfile/javaClasses.cpp b/src/hotspot/share/classfile/javaClasses.cpp index 8068d784b00..4a595435bca 100644 --- a/src/hotspot/share/classfile/javaClasses.cpp +++ b/src/hotspot/share/classfile/javaClasses.cpp @@ -817,16 +817,16 @@ static void initialize_static_primitive_field(fieldDescriptor* fd, Handle mirror BasicType t = fd->field_type(); switch (t) { case T_BYTE: - mirror()->byte_field_put(fd->offset(), checked_cast(fd->int_initial_value())); + mirror()->byte_field_put(fd->offset(), (jbyte)(fd->int_initial_value())); break; case T_BOOLEAN: - mirror()->bool_field_put(fd->offset(), checked_cast(fd->int_initial_value())); + mirror()->bool_field_put(fd->offset(), (jboolean)(fd->int_initial_value())); break; case T_CHAR: - mirror()->char_field_put(fd->offset(), checked_cast(fd->int_initial_value())); + mirror()->char_field_put(fd->offset(), (jchar)(fd->int_initial_value())); break; case T_SHORT: - mirror()->short_field_put(fd->offset(), checked_cast(fd->int_initial_value())); + mirror()->short_field_put(fd->offset(), (jshort)(fd->int_initial_value())); break; case T_INT: mirror()->int_field_put(fd->offset(), fd->int_initial_value()); diff --git a/test/hotspot/jtreg/runtime/ConstantPool/ByteFieldInitTest.java b/test/hotspot/jtreg/runtime/ConstantPool/ByteFieldInitTest.java new file mode 100644 index 00000000000..59f48342213 --- /dev/null +++ b/test/hotspot/jtreg/runtime/ConstantPool/ByteFieldInitTest.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2023, 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 8310297 + * @summary Negative fields shorter than an int may not be sign extended in cpool + * but should in static field initializers. javac gives an error for this but + * not other sources of bytecodes. With checked_cast<> this crashes. + * @compile CompatByteFieldInit.jasm + * @run main ByteFieldInitTest + */ + +import java.lang.reflect.Field; + +public class ByteFieldInitTest { + + final static byte b = -128; // compare with 0x80 + final static short s = -32768; // compare with 0x8000 + + public static void main(java.lang.String[] unused) throws Exception { + // javac is smart enough to complain about the other class's byte and short values when referred + // to directly. With checked_cast<> loading this class should fail. + Class c = Class.forName("CompatByteFieldInit"); + Field cb = c.getDeclaredField("b"); + Field cs = c.getDeclaredField("s"); + if (b != cb.getByte(null) || s != cs.getShort(null)) { + throw new RuntimeException("constant pool init not compatible " + cb.getByte(null) + " " + cs.getShort(null)); + } else { + System.out.println("Fields are same test passed"); + } + } +} + + diff --git a/test/hotspot/jtreg/runtime/ConstantPool/CompatByteFieldInit.jasm b/test/hotspot/jtreg/runtime/ConstantPool/CompatByteFieldInit.jasm new file mode 100644 index 00000000000..b2420a9ecc3 --- /dev/null +++ b/test/hotspot/jtreg/runtime/ConstantPool/CompatByteFieldInit.jasm @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2023, 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. + */ + + +super class CompatByteFieldInit + version 65:0 +{ + public static final Field b:B = int 0x80; + public static final Field s:S = int 0x8000; + + Method "":"()V" + stack 1 locals 1 + { + aload_0; + invokespecial Method java/lang/Object."":"()V"; + return; + } +} // end Class CompatByteFieldInit