withfield semantics

Srikanth srikanth.adayapalam at oracle.com
Mon Feb 19 13:22:47 UTC 2018


I am working on https://bugs.openjdk.java.net/browse/JDK-8197792 (Allow 
updates to instance fields of value types via withfield by any method in 
the same nest) and have run into some interesting situations/questions.

As a part of this exercise, I am getting rid of the static value factory 
mechanism that is presently in place. Once this  highly restricted 
environment/semantics for updates to instance fields of value classes is 
removed, some new cases pop up. (also because the present work considers 
some scenarios which may have been overlooked by javac in the earlier 

May I request that the code fragment below be checked for correctness of 
the compiler behavior ?
Basically, when a final instance field of a value class is updated, the 
code generator will emit
a withfield operation, but this operation needs a mutable owner of the 
field in order to be able to write back the copy that was produced by 

In a more complex scenario the owner of the field that is being updated 
can itself be an instance field that is a value type which would have to 
be updated via withfield again - which would require successive outer 
owners to be mutable etc.

class P {
     A[] ca = new A[1];
     A foo() {
         return __MakeDefault A();
__ByValue final class A {
     final int y = i();
     final int x = 10;

     int i() {
         return 10;
     void foo() {
         x = 10; // Error, can't write back copy to `this`
         this.x = 20; // Error, can't write back copy to `this`
         A.this.x = 30; // Error, can't write back copy to `this`

     __ByValue final class B {
         final A a = __MakeDefault A();

     __ByValue final class C {
         final B b = __MakeDefault B();

     __ByValue final class D {
         final C c = __MakeDefault C();

         void withfield(D d, final D fd) {
             P p = new P();
             p.ca[0].x = 40; // OK, array element can always be written to.
             p.foo().x = 50; // Error: can't write back to constant 
             d.c.b.a.x = 11; // OK.
             fd.c.b.a.x = 11; // oops, can't write back to final parameter.

So is my understanding correct ??

I am also assuming that there is no distinction between final and blank 
final fields when it comes to withfield - Is this a valid assumption ?


More information about the valhalla-dev mailing list