On Mar 31, 2017, at 4:30 PM, fo...@univ-mlv.fr wrote: > > ----- Mail original ----- >> De: "John Rose" <john.r.r...@oracle.com> >> À: "Rémi Forax" <fo...@univ-mlv.fr> >> Cc: valhalla-spec-experts@openjdk.java.net >> Envoyé: Samedi 1 Avril 2017 01:06:07 >> Objet: Re: Value Type on stack in the interpreter > >> On Mar 31, 2017, at 8:57 AM, Remi Forax <fo...@univ-mlv.fr> wrote: >>> >>> I've some trouble to see how value types are laid on stack (conceptually, >>> not >>> necessary the real implementation). >>> >>> First, i may be wrong but it seems that vload do not reference the >>> corresponding >>> Q-type, so i wonder how the verifier knows that it can then access to >>> component >>> of the value type. >>> Then, it seems that value type use one slot on stack, so the components >>> (and the >>> boxed reference if it exists) has to be stored somewhere but there is no >>> corresponding max value type buffer size. >> >> In the interpreter value types all share a common _carrier type_ which >> includes >> metadata about the size and type of the value being stored, plus a pointer to >> the actual storage. The actual storage may be on the heap, or maybe not. >> We are prototyping with thread-local arenas for the non-heap case. >> There are also ways to store value payloads in the stack frame, but >> in that case there is a special handshake when you want to return a >> value from a method call. > > Ok, > why the type of the value is stored in the _carrier_type_ and not in the > vload/vstore instruction.
There are two choices: 1. store the type metadata in the carrier (on stack and in local), or 2. reaffirm the type metadata at every use site (not just vload/vstore). #1 allows simpler bytecodes which put less load on the verifier. A significant subset of #2 is needed, anyway, for telling the GC where to find object references. So #2 wins. > >> >> From the verifier's point of view, there isn't much difference between >> the various Q-types. We will probably track classes of Q-types, mainly >> to simplify vgetfield operations. > > pre-compute the offset of a component ? Yes, as with objects. The techniques are basically the same. Q-types behave like on-stack objects. (They are also copy-able hence identity-free, and they are also non-nullable.) — John