RFR: 8230912 [lworld] InterpreterRuntime::uninitialized_static_value_field fails with fatal error: An exception should have been thrown above

David Simms david.simms at oracle.com
Wed Sep 18 09:05:36 UTC 2019


Looks good Frederic.

Thanks for the further testing, took a while to grok, even with comments :-)

It's worth opening a "JVMS enhancement" bug to track the spec changes.

Thanks Frederic

/David Simms

On 2019-09-17 18:48, Frederic Parain wrote:
> Please review this fix for JDK-8230912
>
> CR:
> https://bugs.openjdk.java.net/browse/JDK-8230912
>
> Webrev:
> http://cr.openjdk.java.net/~fparain/8230912/webrev.00/index.html
>
> The issue comes from the attempt to relax constraints on circularity for
> static inline fields. In JDK-8229372, static inline fields where initialized
> to their default value, by the JVM, in step 8 of the class initialization
> process.
>
> The problem is the access to the static inline fields of a class when this
> class is being initialized.
>
> For instance:
>
>      class A {
>          static B b;
>          static C c;
>      }
>
>      inline class B {
>          static {
>              C c = A.c;
>          }
>      }
>
>      inline class C { }
>
>
> During the initialization of A, the JVM will try to initialized its static field b,
> which will trigger the initialization of class B. But the initialization of B requires
> the execution of its static initializer which accesses the field A.c which might not
> be initialized yet.
>
> The proposed solution is to allow the initialization thread of class to access the static
> inline fields of the class being initialized even if they are not initialized yet, the JVM
> will perform an on-demand initialization on these cases.
>
> Access to these uninitialized static inline fields will still be forbidden for threads that
> are not the initialization thread, which can only happen when the class failed to initialized
> properly.
>
> Another issue with static initializer addressed in this fix is when a static inline field is
> initialized by another class static initializer before the JVM initializes it:
>
>     class D {
>         static E e;
>         static F f;
>     }
>
>     inline class E {
>         static {
>              D.f = new F(5);
>         }
>     }
>
>     inline class F { … }
>
>
> In this case, the JVM must detect that the field has already been initialized, and must not
> initialize it again to the default value.
>
> All these aspects will have to be specified more formally in the JVMS.
>
> The new unit test tries to check all the semantic above, and also covers more error cases.
>
> Thank you,
>
> Fred
>
>
>
>   


More information about the valhalla-dev mailing list