> From: "Brian Goetz" <brian.go...@oracle.com>
> To: "daniel smith" <daniel.sm...@oracle.com>, "John Rose"
> <john.r.r...@oracle.com>
> Cc: "Remi Forax" <fo...@univ-mlv.fr>, "valhalla-spec-experts"
> <valhalla-spec-experts@openjdk.java.net>
> Sent: Saturday, January 29, 2022 6:40:13 PM
> Subject: Re: VM model and aconst_init

> I think we're kind of stuck with a model like this, whether we admit it or 
> not,
> because we have to allow for pervasive erasure and be able to fall back to
> looser linkage conventions. SO the type restriction was always optimistic; we
> might say "Object restricted to QPoint", but someone could show up and say
> "what's a restriction?" and then we have to respond "I said Object, sir".
yes, because of raw types/erasure or wildcard types ! 

Rémi 

> On 1/28/2022 1:00 PM, Dan Smith wrote:

>> But I think we can hold on to this property and still support disjoint Q/L. 
>> How?
>> By not allowing type restrictions to literally claim that values have Q 
>> types.
>> Instead, they claim that a value with some L type is *freely convertible to* 
>> a
>> particular Q type. (This may be the same thing as John saying the type
>> restriction involves projections and embeddings, although I'm not sure I 
>> would
>> make it the type restriction's responsibility to encapsulate those
>> conversions.)

>> So, for example: a type restriction that we might spell as 'QPoint' (and 
>> maybe
>> that notation is a mistake) is an assertion that a particular L-typed 
>> variable
>> always stores non-null objects for which 'instanceof Point' is true. *But
>> they're still objects*, as far as the abstract JVM is concerned. Then the JVM
>> implementation is free to recognize that it can use the same encoding it uses
>> for the actual type 'QPoint' to store things in the variable.

>> There are a couple places where reality intrudes on this simple model:
>> - The initial value of a field/array with a type restriction is determined by
>> that type restriction (because, e.g., 'null' can't satisfy the 'QPoint'
>> restriction)
>> - Type restrictions may introduce tearing risks, which would have to be
>> explained by specifying the possibility that a JVM implementation may use 
>> type
>> restrictions to optimize storage of value object instances of primitive
>> classes, encoding them as primitive values

>> I'm left feeling somewhat uneasy that we end up with a world in which
>> directly-typed code has Q types, while specialized generic code has <non-null
>> instances of primitive classes> as its "types"—two different ways to explain
>> the exact same thing, in some sense duplicating efforts—but I think we can 
>> live
>> with that. On the other hand, it's a nice win that the language runtime model
>> is more closely aligned with the JVM's runtime model (where value objects and
>> primitive values are two distinct things).

Reply via email to