RFR JDK-8181425: Reflection API defend against issues with internal VM derived value type

Tobias Hartmann tobias.hartmann at oracle.com
Fri Jun 23 09:32:24 UTC 2017


Hi Mandy,

as I mentioned off-thread, this change breaks the ValueTypeTestBench.java because we rely on MyValue1.class.getDeclaredMethods() [1] to be able to access the declared methods of a value type and set compilation and inlining rules via the Whitebox API. This is crucial for the tests to work. In this case the value type is not derived but it's an VVT declared with "__ByValue".

This change also breaks the ValueTypeArray.java test with:
  Caused by: java.lang.ClassNotFoundException: [Qruntime.valhalla.valuetypes.Point; is a derived value class
	  at java.base/java.lang.Class.forName(Class.java:293)
          at runtime.valhalla.valuetypes.ValueTypeArray.testClassForName(ValueTypeArray.java:62)
Because the test does Class.forName("[Qruntime.valhalla.valuetypes.Point;").

And DeriveValueTypeCreation.java and VboxUnbox.java fail with:
  java.lang.InternalError: runtime.valhalla.valuetypes.ValueCapableClass$Value not a value type
	at java.base/java.lang.System$2.loadValueTypeClass(System.java:2174)
	at java.base/valhalla.shady.MinimalValueTypes_1_0.loadValueTypeClass(MinimalValueTypes_1_0.java:110)
	at java.base/valhalla.shady.MinimalValueTypes_1_0.getValueTypeClass(MinimalValueTypes_1_0.java:103)
	at java.base/jdk.experimental.value.ValueType.forClass(ValueType.java:152)
	at runtime.valhalla.valuetypes.VboxUnbox.testCorrectBoxing(VboxUnbox.java:47)
	at runtime.valhalla.valuetypes.VboxUnbox.main(VboxUnbox.java:41)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:563)
	at com.sun.javatest.regtest.agent.MainWrapper$MainThread.run(MainWrapper.java:115)
	at java.base/java.lang.Thread.run(Thread.java:844)

This is a problem with the C2 intrinsic for java.lang.Class::isAssignableFrom which does not work properly with value types. I'll work on a fix. As temporary workaround you can use -XX:DisableIntrinsic=_isAssignableFrom.

Best regards,
Tobias

[1] http://hg.openjdk.java.net/valhalla/valhalla/hotspot/file/2552e5001a5d/test/compiler/valhalla/valuetypes/ValueTypeTestBench.java#l2650

On 20.06.2017 22:31, Mandy Chung wrote:
> http://cr.openjdk.java.net/~mchung/valhalla/webrevs/8181425/webrev.00/index.html
> 
> This patch changes Class::forName to not to return DVT classes
> and also disallows reflection API get members of a DVT class.
> ClassLoader::loadClass should probably be changed and I can
> fix that separately.
> 
> I added a couple of new tests and also fix the MVT tests with
> GPL header rather than GPL+CP header.
> 
> Mandy
> 


More information about the valhalla-dev mailing list