Valhalla EG notes Jan 16, 2019

Karen Kinnear karen.kinnear at oracle.com
Wed Jan 30 15:46:52 UTC 2019


I see two options proposed:

Option 1: RefObject, ValObject - classes
   VM at class definition time replaces superclass of all existing classes from Object -> RefObject
   VM translates:
         new Object -> treated as Object.new() { returns RefObject.new() } // assume old code only wants references here
   risk: existing getClass.getSuper() assumptions

Questions:
   How would the VM translate new Object[] ?
     - we might want existing code to be able to handle all subtypes of the top type in the existing arrays
     - or erased generics will break

   If I wanted to instantiate a new top type which could hold either RefObject or ValObject, how would I do that?
   Object.new()? Object.newObject()

 Option 2: RefObject, ValObject - interfaces
   VM at class definition adds RefObject to all existing classes
   value classes required to declare ValObject as superinterface

   ackwardness: VM needs special behaviors for Object.wait, Object.notify - if dynamically a ValObject, throw IMSE
     instead of having that obvious from the implementation in a superclass.

Are there other concerns here?
This seems cleaner to me - especially since I also believe that synchronization on ValObjects will also require
special handling - which will be vm implementations rather than visible in java sources (exact plan is TBD).


Remi - L/Q signatures are orthogonal to the type hierarchy - they declare null-free or null-tolerant
   so Point.val and Point.box are both subclasses of ValObject

thanks,
Karen

> On Jan 30, 2019, at 10:21 AM, forax at univ-mlv.fr wrote:
> 
> 
> 
> De: "John Rose" <john.r.rose at oracle.com>
> À: "Remi Forax" <forax at univ-mlv.fr>
> Cc: "Karen Kinnear" <karen.kinnear at oracle.com>, "valhalla-spec-experts" <valhalla-spec-experts at openjdk.java.net>
> Envoyé: Mercredi 30 Janvier 2019 00:29:01
> Objet: Re: Valhalla EG notes Jan 16, 2019
> On Jan 29, 2019, at 11:10 AM, Remi Forax <forax at univ-mlv.fr <mailto:forax at univ-mlv.fr>> wrote:
> 
> currently the result of the expression "new Object()" is a reference type, so it should be a RefObject, but we have created an Object not a RefObject,
> so it's at best weird.
> 
> I'd like to rationalize this in two steps.
> 
> First, allow `new I(x…)` where `I` is an interface,
> to be treated as shorthand for `I.F(x…)` where
> the method `F` is somehow declared by `I` as
> its canonical factory.  I'm thinking `List.of` is
> a good one.  (Maybe also extend this rule to classes
> with non-public constructors.)
> 
> Second, since `Object` is an honorary interface,
> change the meaning of `new Object()` to be
> `Object.newReference()` (or some such), by
> having `Object` declare `newReference` (of
> no arguments) as its canonical factory.
> 
> Moving `new` statements to factories is coherent,
> also, with changing the translation strategy for Java
> to deprecate the new/init dance outside of the class
> being constructed, and eventually make it illegal in
> bytecode outside of the nest of the class being made.
> In other words, if I could go back in a time machine
> and rewrite the translation strategy, I'd insist that
> each class (or the JVM itself) would define a canonical
> factory for each constructor of that class, and require
> all other classes to allocate via the canonical factory.
> The new/init dance would be legal inside the class
> but nowhere else.  That attack surface has been a
> painful one.  And value types have to use factories
> from the get-go, so we've got to figure it out sooner
> or later.  The name of the canonical factory can be,
> in fact, fixed as '<init>'.
> 
> so new Object() <==> Object.new() and
> class Object {
>   ...
>   public static Object new() { return ReferenceObject.new(); }
> }
> and the translation new Object() to Object.new() has to be done by the VM because there is already a lot of code that do a new Object().
> 
> 
> — John
> 
> 
> I think i still prefer having interfaces Val/Ref instead of classes, these interfaces can be injected by the VM, at least the Ref interface can be injected, for the Val interface, we can requires all value types to implement that interface.
> 
> Another question, we have two representations of a value class, the real value class and the nullable value class, the Q and the L classes, Point.val and Point.box, does Point.box a subtype of Val/ValObject ?
> 
> Rémi



More information about the valhalla-spec-observers mailing list