[lworld] RFR: JDK-8247795 allow factory methods for inline types to return j.l.Obje…

Harold Seigel hseigel at openjdk.java.net
Tue Jun 23 19:57:39 UTC 2020


On Fri, 19 Jun 2020 20:08:04 GMT, Mandy Chung <mchung at openjdk.org> wrote:

>> Expect the return type for the <init> factory methods of hidden inline classes to return type java.lang.Object.  Also,
>> fix issue so that Reflection::new_constructor(), not new_method(), is called for <init> factory methods.
>
> src/hotspot/share/classfile/classFileParser.cpp line 2482:
> 
>> 2481:         const Symbol* required = class_name();
>> 2482:         if (is_hidden() || is_unsafe_anonymous()) {
>> 2483:           // The original class name in hidden classes and in the UAC byte stream gets
> 
> JDK no longer uses VM anonymous class.   This check (when parsing the static factory method of an inline type) should
> be updated to `if (is_hidden())` and drop `is_unsafe_anonymous()`.

VM anonymous classes need to be supported until they are obsoleted.  Removing this call to is_unsafe_anonymous() can
easily be done once that happens.

> src/hotspot/share/runtime/reflection.cpp line 1226:
> 
>> 1225:     BasicType rtype;
>> 1226:     if (klass->is_hidden() || klass->is_unsafe_anonymous()) {
>> 1227:       rtype = T_OBJECT;
> 
> Drop `is_unsafe_anonymous` check.   We should not support VM anonymous class be an inline type.
> 
> I suggest to add a comment to explain this workarounds the JVM spec issue for hidden classes.

See above comment about is_unsafe_anonymous().  I can add a comment about the JVM Spec issue in a follow-on fix.

> test/hotspot/jtreg/runtime/valhalla/valuetypes/HiddenInlineClassTest.java line 48:
> 
>> 47:     static byte[] readClassFile(String classFileName) throws Exception {
>> 48:         File classFile = new File(CLASSES_DIR + File.separator + classFileName);
>> 49:         try (FileInputStream in = new FileInputStream(classFile);
> 
> A simpler implementation is to use NIO:
>     static final Path CLASSES_DIR = Paths.get(System.getProperty("test.classes", "."));
> 
>     static byte[] readClassFile(String cn) throws IOException {
>         Path path = CLASSES_DIR.resolve(cn.replace('.', File.separatorChar) + ".class");
>         return Files.readAllBytes(path);
>     }

Multiple tests could benefit by using the NIO change that you suggest.  I'll enter an RFE for that.

> test/hotspot/jtreg/runtime/valhalla/valuetypes/HiddenInlineClassTest.java line 65:
> 
>> 64:         Class<?> c = lookup.defineHiddenClass(bytes, true, NESTMATE).lookupClass();
>> 65:         Object hp = c.newInstance();
>> 66:         String s = (String)c.getMethod("getValue").invoke(hp);
> 
> Nit: No need to be a nestmate.

Is it a problem that it's a nestmate?

-------------

PR: https://git.openjdk.java.net/valhalla/pull/94


More information about the valhalla-dev mailing list