Question, why a value type can not loss identity inside a method ? Is it true for local variable access ? for field access ? for static access ?
V value = ... Object o = v; Object o2 = v; o == o2 ?? field.o = v; o == field.o ?? // what about the concurrent access Class.o = v; o == Class.o ?? I also wonder if it will not have an impact regarding OSR when part of the code is in the interpreter and part of the code is JITed. Rémi > De: "Karen Kinnear" <karen.kinn...@oracle.com> > À: "Bjorn B Vardal" <bjorn...@ca.ibm.com> > Cc: valhalla-spec-experts@openjdk.java.net > Envoyé: Mardi 28 Mars 2017 20:45:06 > Objet: Re: Initial feedback on Minimal Value Types 0.2 for discussion > Summary notes from meeting 3/15/17: > attendees: Brian, Doug Lea, Stas, Frederic, Bjorn, Tobias, Mr Simms, Vladimir > I, > Maurizio, Karen, John > 1. Identity Major decision: > Doug: It is ok if a value type box does NOT retain identity. > Do not be overly concerned with sync, ===, hashcode. Let’s see if the benefits > outweigh the problems. > We need to set clear expectations for customers. > ed. note: Maurizio clarified later that it is critical that a value type not > lose identity within > a given method, but it is ok to lose identity across methods. > It is ok if the vm throws an exception - e.g. IllegalMonitorStateException > when > attempting to lock a Value Type, > ok if we do that based on a command-line flag to not slow down normal > execution. > 2. Evolution approach > can evolve experimental annex to JVMS - optional to implement, with minor > change > to classfile, byte codes, etc. > no story for experimental JLS > Doug suggested: could have an experimental javac documentation > 3. vdefault/vwithfield > - constructor as static factory method > - vdefault - create 0-filled default value type > - only valid within constructor > - note a value type array - initial array allows default value to escape > - vwithfield - copy-on-write a new value type with one modified field > - allows final fields to be final (value type is immutable) > - JIT can optimized via escape analysis > - only within value class (which means both the value capable class and the > DVT) > 4. Requested Extensions: > - exploring adding references - both IBM and Oracle believe customers will > need > this for use cases > - support for VCC implementing interfaces - do users need this? > - propose: go to Early Access without this and see if it is required > - IBM and Oracle investigating > - note: VM would do no magic boxing, and for MVT, would require boxing to > invoke > default methods > 5. Packed Objects: > AI: IBM - Doug requested a summary of differences between PackedObjects and > MVT > John note: Packed Objects have identity, others see changes through the > reference > 6. JVMS changes: > AI: Oracle - need to propose a draft for the JVMS extensions > 7. early access timing: > Note: need to ensure that IBM and Oracle are in sync on Early Access timing > Meeting March 29th - need to discuss any other Shady Values version 0.2 > changes > and > timing. > *** will need a Shady Values update *** > thanks, > Karen >> On Mar 15, 2017, at 1:20 AM, Karen Kinnear < karen.kinn...@oracle.com > >> wrote: >> Summary notes from meeting 2/15/17 - embedded below, starting with #8 >> Meeting 3/16/17: >> — there are a few more already identified topics to discuss >> — welcome additional questions/suggestions >> — a couple of topics to revisit (or perhaps put on an open issues list until >> we >> have more information or feedback) >> thanks, >> Karen >>> On Feb 10, 2017, at 9:47 AM, Karen Kinnear < karen.kinn...@oracle.com > >>> wrote: >>> John - please correct >>> Bjorn, >>> Good question. This was news to us as well, so John will have the final >>> word. >>> My assumption is that he means that: >>> If you create an array of Value-Capable-Classes that you would not >>> automagically >>> also create an equivalent >>> array of the Derived Value Types. >>> That the MethodHandle APIs could explicitly, through new byte codes create >>> arrays of the DVTs by passing a >>> Derived Value Type as the “array ref” to anewarray or multianewarray. >>> I presume that any explicit byte code generation by power users to go with >>> this >>> code could use the same mechanism. >>> thanks, >>> Karen >>>> On Feb 9, 2017, at 10:56 PM, Bjorn B Vardal < bjorn...@ca.ibm.com > wrote: >>>> Karen / John: Can you clarify this? Do you mean that they will only be >>>> flattened >>>> when created using the reflection / MethodHandle API? >>>> > John: MVT 1.0 will only flatten arrays reflectively >>>> -- >>>> Bjørn Vårdal >>>> J9 Java Virtual Machine Developer >>>> IBM Runtimes >>>>> ----- Original message ----- >>>>> From: Karen Kinnear < karen.kinn...@oracle.com > >>>>> Sent by: "valhalla-spec-experts" < >>>>> valhalla-spec-experts-boun...@openjdk.java.net > >>>>> To: John Rose < john.r.r...@oracle.com > >>>>> Cc: valhalla-spec-experts@openjdk.java.net >>>>> Subject: Re: Initial feedback on Minimal Value Types 0.2 for discussion >>>>> Date: Thu, Feb 9, 2017 6:31 PM >>>>> Notes from discussion on Feb 01,2017. Feedback welcome. >>>>> John - one question extracted at the top from the embedded notes. >>>>>> 11. "interfaces (especially with default methods)" >>>>>> - please change p.6 to clarify that there are no value type interfaces >>>>>> period. >>>>> Ed note: There is a distinction here between >>>>> 11a) defining an interface as a VCC with a derived DVT and >>>>> 11b) whether the POJO which defines the VCC can implement interfaces. This >>>>> discussion was about whether >>>>> a POJO which defines the VCC can implement interfaces. >>>>> John: MVT 1.0 : No value capable interfaces for JVMT 1.0. >>>>> Ed note: was this the answer to 11a or 11b above please? >>>>>> On Feb 9, 2017, at 5:43 PM, Karen Kinnear < karen.kinn...@oracle.com > >>>>>> wrote: >>>>>> (This is a resend of an email I sent to valhalla-...@openjdk.java.net on >>>>>> January >>>>>> 23) >>>>>> Review of Minimal Value Types August 2016 Shady Edition (v 0.2) >>>>>> http://cr.openjdk.java.net/~jrose/values/shady-values.html >>>>>> Questions/Comments: >>>>>> abbreviations used: VCC: value-capable class, DVT: derived value type >>>>>> 1. Goals >>>>>> -- might be worth adding to the bullets: >>>>>> Allow use of existing toolchain where possible including IDEs and >>>>>> debuggers >>>>> John: this is just a review comment, no discussion required. >>>>>> 2. Features: >>>>>> "Three" bytecode instructions ->"A small set of” >>>>> John: just a text edit to encompass extensions in #12 below, not yet >>>>> discussed >>>>> as a group. >>>>>> 3. Typically, value-capable classes will not be exported. >>>>>> Is the reason for this to limit exposure since the expectation is that >>>>>> the >>>>>> initial APIs and mechanisms will change? >>>>> John: “yes”. This does not have to be enforced in the implementation. >>>>> ed. note: perhaps we could remove this from the MVT specification. >>>>>> 4. Value-capable classes: supporting methods >>>>>> p.3 "This design endows both boxes and pure values with a common set of >>>>>> methods; >>>>>> it "lifts" box methods >>>>>> onto the derived values." >>>>>> p.5 "The synthetic class has the given fields (unchanged) and has no >>>>>> methods" >>>>>> p.5 "Meanwhile, all methods (and other class features) stay on the >>>>>> value-capable >>>>>> class. The value type >>>>>> proper is just a "dumb struct" containing the extracted fields" >>>>>> - given that in the MVT model we are starting with a POJO box, and >>>>>> instance >>>>>> methods that clearly >>>>>> take an Object as a receiver, one proposal for the initial MVT approach >>>>>> would be >>>>>> to have >>>>>> all methods only supported by the box, and require boxing to invoke any >>>>>> methods >>>>>> - so I think the first quote would need either removal or modification >>>>> John: agreed. >>>>> Karen: See #9 below: Evolved proposal would keep the POJO, which we call >>>>> the >>>>> Value Capable Class (VCC) unchanged, >>>>> and derive a Derived Value Type (DVT) which would only contain a copy of >>>>> the >>>>> immutable instance fields, i.e. be >>>>> a “dumb struct”. >>>>> Bjorn: In this model, the source class would be the same as the box >>>>> class, if we >>>>> leave the instance fields in it. And we >>>>> would box to invoke methods for the MVT 1.0 timeframe. >>>>> John: Agreed. >>>>> John: Longer-term - will want to invoke methods on values as soon as we >>>>> can. We >>>>> will need source support for that. >>>>> John: Minimal Value Type (MVT) programming models: >>>>> 1) source — only works for boxes >>>>> 2) Method Handle reflection - for early adopters >>>>> 3) bytecodes >>>>> The MethodHandle/ValueFactory approach is clearly described. >>>>> The language and byte code we will use longterm are still uncertain. >>>>> Bjorn: What would be enabled by having all members in the value vs. just >>>>> the >>>>> [instance] fields in the value? >>>>> Karen: Challenge is instance methods, where the type of the receiver is >>>>> expected >>>>> to be a VCC, not a DVT. This same >>>>> expectation applies to any method called from the instance method, or any >>>>> field >>>>> in which the receiver is stored. >>>>> John: we are using existing javac support, therefore we need to define >>>>> value >>>>> types indirectly, box first. This is not the longterm plan. >>>>> MethodHandles will provide a direct way of speaking of the values. The >>>>> MethodHandle runtime will spin byte codes. >>>>> Maurizio: it is easy to just map the fields >>>>> Karen: Methods are coded on the box. Static fields we left on the box. So >>>>> we >>>>> just lift the instance fields. >>>>> John: We box the value to run methods. We want to preserve “vagueness”. >>>>> Legacy code could misuse identity e.g. equals, hashcode, sync >>>>> This only works for early adopters who are aware of value-capable-class >>>>> identitylessness and implications >>>>> Maurizio: If you pass the VCC to another method you are passing the box >>>>> and no >>>>> mechanical transformation is needed. >>>>> Karen: You could have a problem if you were to pass the DVT as an >>>>> argument when >>>>> an object is expected >>>>> John: clarify distinction between QType and LType >>>>> QType: no identity, not nullable, not shared visible state, no sync, no >>>>> reference equality >>>>> LType: identity, nullable, shared visible state for sync and reference >>>>> equality >>>>> semantic mismatch: nulls, if_acmp_eq/ne >>>>> MVT provides a short-term hack - which is ok for early adopters >>>>> in future expect explicit boxes for QTypes which are LTypes which >>>>> actually are >>>>> identityful unlike the temporary VCCs >>>>> Bjorn: differences between QTypes and LTypes like int and Integer, where >>>>> only >>>>> Integer provides methods? >>>>> John: short-term there will be no methods on a DVT. >>>>> longer-term value types will have methods >>>>> verifier will not accept LType for a QType byte code >>>>> Bjorn: if QType is a subset of an LType is it ok to convert? >>>>> John: want ability farther future to have different behaviors and >>>>> different >>>>> stack representation. >>>>> In progress, exploring possibly interpreter implementations, things like >>>>> allowing the vm to buffer QTypes off the java heap >>>>> presumes a universal type must declare whether it has identity or not >>>>> Bjorn: with boxing and unboxing, if you say you have “no identity” do you >>>>> still >>>>> have something? >>>>> John: must box to call a method, no one can rely on the identity so you >>>>> can >>>>> elide it. >>>>> Ed note: this is only possibly temporarily because the >>>>> value-capable-class is >>>>> defined as not being able to rely on identity. >>>>> This will not carry over to a more general value type approach if we wish >>>>> to >>>>> have value types box to identityful LTypes which >>>>> can be used by existing code that is expecting a subtype of Object or an >>>>> Interface as defined today. >>>>> John: after MVT 1.0, exploring a union type, “UType” which is a common >>>>> type that >>>>> could contain either a QType or its corresponding >>>>> LType >>>>>> 5. Value bytecodes >>>>>> p.11 "Method handles and invokedynamic will always allow bytecode to >>>>>> invoke >>>>>> methods on Q-types". >>>>>> - is this still accurate in the context above? I know the comment says >>>>>> that >>>>>> internally >>>>>> the MH might box the Qtype, but do we still want to support MH and indy >>>>>> to >>>>>> appear to invoke methods on Q-types? >>>>> Ed note: I don’t if we answered this question. >>>>>> 6. Restrictions on the POJO: >>>>>> A. It would help to have a bulleted list of restrictions >>>>>> B. Clarify error/exception to throw - perhaps ClassFormatError for all >>>>>> of these? >>>>>> C. Request to not support VCC on interfaces at all for MVT 1.0 >>>>>> I know the restrictions are intermixed in the text today. This is what I >>>>>> extracted: >>>>>> (p.3-4, 6) >>>>>> VCC (and probably going forward) >>>>>> 1. VCC superclass must be Object (and should be omitted) >>>>>> 2. the class must be final >>>>>> 3. all fields must be final >>>>>> - please clarify - all instance fields must be final >>>>> John: yes >>>>>> 4. all constructors private >>>>> Maurizio: why? >>>>> Note that there is NO constructor for the DVT. It can be created via a >>>>> vunbox or >>>>> vdefault + vwithfield >>>>> John: ok to change the spec so the VCC constructor is not limited to being >>>>> private. >>>>>> 5. must replace equals, hashcode, toString (with current Object syntax) >>>>>> 6. may not use any methods provided on Object >>>>>> specifically: may not use clone, finalize, wait, notify, notifyAll >>>>>> (directly) >>>>>> 7. may use getClass >>>>>> MVT 1.0 additional limitations >>>>>> 9. may contain primitive instance fields, but no reference instance >>>>>> fields >>>>>> - please update document to clarify this restriction is for instance >>>>>> fields only >>>>> Karen: both IBM and Oracle JVM engineers are interested in an optional >>>>> extension >>>>> to support >>>>> references instance fields. >>>>> Maurizio: If only primitives allowed, then no support for generics is >>>>> needed. >>>>> Clarification for Karen: statics can have generics with erasure today, >>>>> but can >>>>> not mention type variables. (thanks :-) >>>>> Bjorn: With today’s erased generics, this is not a problem >>>>> John: Ok to explore having references in instance fields, generics are >>>>> ok. No >>>>> type variables in instance fields >>>>> and no “any” generics. >> 2/15/17: rediscussed: >> Maurizio - higher perceived benefit to users to have reference fields in >> VCC/DVT >> - e.g. Strings >> John concern: hard to do embedded references in values >> Mr Simms: almost have it now >> — agreed: let’s give it a short >>>>>> 10. may not contain generic instance fields >>>>>> - please update document to clarify this restriction is for instance >>>>>> fields only >>>>>> - it is my understanding that you can’t have generic static fields at all >>>>>> 11. "interfaces (especially with default methods)" >>>>>> - please change p.6 to clarify that there are no value type interfaces >>>>>> period. >>>>> Ed note: There is a distinction here between >>>>> 11a) defining an interface as a VCC with a derived DVT and >>>>> 11b) whether the POJO which defines the VCC can implement interfaces. This >>>>> discussion was about whether >>>>> a POJO which defines the VCC can implement interfaces. >>>>> Karen: concern about setting expectations. Current interfaces assume >>>>> identity. >>>>> Maurizio: could always box to call interface methods. >>>>> John: Question: do early adopters need interfaces? >>>>> Vladimir Ivanov: Yes >>>>> note: Vector API has no benefits using MVT 1.0. >>>>> Ed note: later email clarification from Vlad: >>>>> Interface-based Vector API version [1] does not benefit from MVT 1.0. All >>>>> operations are expressed as interface >>>>> calls and require vector boxes. >>>>> That is out of scope for MVT 1.0. >>>>> Vectors exploring an alternative API, exposing operations as >>>>> MethodHandles. This >>>>> is less convenient to use, but >>>>> allows experimenting to find performance benefits. >>>>> John: MVT: box to get to methods. Longterm get to call I.defaultmethod >>>>> without >>>>> boxing >>>>> Ed. note: Interface default method will need restrictions. >>>>> John: MVT 1.0 : No value capable interfaces for JVMT 1.0. >>>>> Ed note: was this the answer to 11a or 11b above please? >> I believe John agreed that we can not use a VCC/DVT to define an interface >> Open Question: >> Do we need VCC/DVT to support interfaces and require boxing to invoke default >> methods? >> Perhaps try early access without support for interfaces and get feedback? >> Concerns: existing interfaces with default methods - assume identity >> Longer-term interfaces that can be implemented by valhalla value types will >> need >> to be >> special interfaces which support UTypes - union of LType and QType - so that >> they >> can be implemented by references or by value types. >> UType - must not assume identity, must retain identity if it has it >> QType - not assume identity >> LType - must preserve identity >> John/Brian - outline of road ahead - post MVT 1.0 - looking at a potential >> carrier or wrapper for >> an “any” type >> Dan: If a local is a UType - will enforce single type through program? >> John: simple answer - not fixed type slots >> Dan: verification issues >> John: like a cast - must be explicit in byte codes and it might fail >> LType-> UType always valid, UType-> LType might fail >>>>> John: longer-term: >>>>> L-Type: always identity >>>>> Q- Type: never identity >>>>> U-Type: do not assume identity, must preserve identity >>>>>> 12. 0.2 version states: may not contain a value class as an instance >>>>>> field >>>>>> - see below for further discussion >>>>>> 7. potential extensions: >>>>>> 12. 0.2 version states: value class may not contain a value class as an >>>>>> instance >>>>>> field >>>>>> - we would like to propose supporting this - perhaps as an optional >>>>>> extension? >>>>>> - we would need to add an exception for handling circularity >>>>>> - note: no way to express this in java, but you could express in a >>>>>> classfile >>>>> John: NO for MVT 1.0. Potential ambiguity whether the field contains a >>>>> value >>>>> capable class or a derived value type >>>>> javac just deals with boxes, so no flattening here. Wants same layouts >>>>> whether >>>>> boxed or not. >>>>> John: MVT 1.0 will only flatten arrays reflectively >>>>> End of discussion >>>>> thanks, >>>>> Karen >>>>> ======= >>>>>> 8. Splitting the value type from the object type >>>>>> Propose not using the nested class approach, to not tie us into this >>>>>> relationship longer term >>>>>> - so remove example and the "looks like an inner class" >>>>>> - note: a key point here is how the user generating bytecodes would know >>>>>> the >>>>>> generated name of the DVT >>>>>> This will need further discussion. >>>>>> In the constant pool, references can use Qpackage.Class; rather than >>>>>> Lpackage.Class; >>>>>> Are there requirements for java sources to be able to refer to the >>>>>> derived value >>>>>> type by name? >>>>>> e.g. Class.forName()? If not, then perhaps the temporary naming >>>>>> convention could >>>>>> be kept internal? >> #8: not use nested class relationship between VCC and DVT: >> Bjorn: not an issue either way >> *** remove from spec: Does not belong in the spec - this is an implementation >> detail >> We don’t want to expose this as a nested class >> - reflection might expose differently >> - private static member access needs special handling, but not via javac >> trampolines >> - Minimal Value Types will to have nest mate support >> Note: box must be in the same package & module >> Need a way to mark the DVT - e.g. ACC_VALUE (other options ok) >> Note : DVT name should not be exposed. Ok to use unsafe.defineAnonymousClass >> to generate the DVT. The VM generates the DVT. >> API ValueType.valueclass() returns, but doesn’t need to know how generated >> Goal: VM’s problem to resolve QPoint descriptor reference to DVT for Point >> *** add to spec: requirement: not want byte code to resolve LPoint$12345 >> (i.e. >> a temporary name) - want ClassNotFound here >>>>>> 9. Splitting the value type from the object type >>>>>> p.5 "The original class is given a new synthetic field of the new value >>>>>> type, to >>>>>> hold the state for the original class". >>>>>> - to simplify implementation, and allow experiments which go beyond the >>>>>> initial >>>>>> MVT plans, we propose >>>>>> * that the VCC is left untouched >>>>>> * the DVT has a copy of the immutable instance fields >>>>>> - We think this qualifies as "any equivalent technique" on p.5 >>>>>> - the quote above would need modifying or removing >> Agreed. >>>>>> 10. Scoping of these features >>>>>> - exploring adding class file capability bits for experimental features, >>>>>> as a >>>>>> versioning approach >>>>>> - we will want to pin this down later in the cycle >> Brainstormed possibility of adding capability bits in minor version. Would >> need >> to go through JCP. >> editor’s note: may need to revisit this - turns out minor version 45.3 was >> already used and set a precedent >> that changes in a minor version would all be present in follow-on major >> versions. So probably not in scope for MVT. >>>>>> 11. JVM changes to support Q-types >>>>>> - "So when the class loader loads an object whose fields are Q_types, it >>>>>> must >>>>>> resolve (and perhaps load) >>>>>> the classes of those Q_types, ..." >>>>>> - for instance fields that are Q-types, I believe we need to explicitly >>>>>> specify >>>>>> temporary JVMS load/link/init rules >>>>>> (I will propose an early draft in a later email). >>>>>> - e.g. Specifically, for instance fields that are Q-types, we would >>>>>> propose >>>>>> requiring eager loading of the Q-types, >>>>>> modifying JVMS 5.3.5 Deriving a Class from a class File Representation. >>>>>> Bullets >>>>>> 3 and 4 described eager resolution >>>>>> of the direct superclass and direct superinterfaces. The expectation is >>>>>> that an >>>>>> additional bullet would be added >>>>>> for direct instance fields that are Q-types. >>>>>> - note that this change would make it the JVM's responsibility, not the >>>>>> class >>>>>> loaders' responsibility, >>>>>> to resolve the classes of those Q-types. >>>>>> Note: in the JVMS load/link/init rules I will also propose VCC/DVT >>>>>> load/link/init requirements. >> Note: there are two discussions here relative to load/link/init rules. >> One is for the DVT/VCC relationship. >> Karen: always load VCC first >> Bjorn: if MH API: always create VCC first >> AI: Karen - send load/link/init proposal for MVT >> Another is for flattening. Note VCC and DVT have the same field reference >> types, >> which means no >> QType fields, so no flattened fields in a DVT. >> Note: VCC can not mention QTypes in source, since javac can not translate. >> Bjorn: Can we use QTypes in descriptors of methods and fields if we spin byte >> codes? >> John: MethodHandles work with QTypes, therefore need an internal translation, >> therefore need to >> handle QTypes in descriptors, therefore ok to spin byte codes like >> MethodHandles >> can. >> This is not a gating goal for MVT, but is not forbidden. >> Is it ok to flatten a QType field? >> Maurizio: >> VCC->DVT can NOT change descriptor, therefore can not contain a QType. >> John: For MethodHandles and classes spun from byte codes with QType fields, >> it is ok to flatten the QType. >> - implementation choice. >> - not required, but ok if not hard >> (ed. note: I have other notes on flattening which I can not translate - if >> others have notes >> on non-array flattening please let me know) >> We will however support flattening for arrays. >> Ed note: thanks to Mr. Simms - he realized we need to initialize (and >> therefore >> link) any value type that >> is the element type for anewarray/multianewarray. >> Array flattening: >> this will not be done automagically >> flatten array only if explicitly an array of value types, i.e. >> anewarray/multianewarray with a DVT as the >> objectref >> TODO: open questions - need to investigate: >> - Need to check how core reflection would deal with seeing an object that is >> a >> DVTarray >> - What does core reflection do if handed the j.l.Class for a DVT? >> - Class.forName should not be able to find a j.l.Class for a DVT >>>>>> 12. value bytecodes >>>>>> - the following are useful in the MethodHandle implementation, and >>>>>> likely to be >>>>>> useful for direct bytecode access >>>>>> - we would like to propose the following as the minimal bytecode set: >>>>>> in addition to vload, vstore, vreturn (and slot-specific variants) >>>>>> - vdefault/vwithfield >> open issue >> Maurizio: nice on paper >> In practice: challenges - vwithfield write to final field >> note: all fields in DVT are final >> If we do not provide vdefault/vwithfield, but only provide vbox/vunbox >> MethodHandles will use unsafe to set fields and then unbox >> ed. note - need to revisit >>>>>> - vbox/vunbox >> YES >> Dan: what about a2b vs. vbox/vunbox? >> ed note: we initially investigated a general a2b and we don’t yet have a good >> way to define a CONSTANT_Type >> or equivalent which we would need, so we found it easier to explicitly do >> vbox/vunbox. (need to bring up in next meeting) >>>>>> - vaload/vastore >> YES >>>>>> - vgetfield (fetch a field from a value type) >> YES >>>>>> - NOT vcmp_eq/ne (equality can be implemented as component-wise >>>>>> comparison) >>>>>> clarify that for MVT 1.0, statics are only available through the box. >>>>>> (TODO: >>>>>> where does this go in shady?) >>>>>> 13. value bytecodes >>>>>> - open issue >>>>>> - typed prefix vs. vbytecodes for initial prototype >>>>>> 14. Value bytecodes >>>>>> use of Qtype as class component: >>>>>> "Initially the only valid use of a Q-type [is] as the class component of >>>>>> a >>>>>> CONSTANT_Methodref or CONSTANT_Fieldref >>>>>> is as a CONSTANT_MethodHandle constant." >>>>>> - if we extend the bytecodes as above, and we disallow anyone >>>>>> (MethodHandles, >>>>>> bytecodes) from invoking methods on Qtypes, we >>>>>> could modify this to disallow Q-types for CONSTANT_Methodref or >>>>>> CONSTANT_InterfaceMethodRef completely. >>>>>> - but perhaps you want the MethodHandles to be able to invoke methods on >>>>>> DVTs by >>>>>> dynamically boxing them. This works as long >>>>>> as the methods don't assume identity. >>>>>> 15. Q-types and bytecodes >>>>>> We propose modifying anewarray and multianewarray to allow operands that >>>>>> are >>>>>> Q-types. >>>>>> 16. Value Type Reflection >>>>>> With the proposed modifications in #8 above: i.e. leaving the VCC >>>>>> untouched and >>>>>> copying the >>>>>> instance fields to the DVT, the VCC now matches the source file. >>>>>> So Class.forName() would return the VCC which is the original POJO which >>>>>> fits >>>>>> the backward compatibility model. >>>>>> So we don't need a separate SourceClass, but leaving it in the proposal >>>>>> provides >>>>>> implementation flexibility. >>>>>> 17. Q-type method handles & behaviors "possible bytecode" >>>>>> might want to change vnew to vdefault >>>>>> these are samples and evolving, so maybe not worth changing >>>>>> I did not do this level of detailed review for the Future Work yet. >>>>>> thanks, >>>>>> Karen >>>>>>> On Sep 1, 2016, at 8:08 PM, John Rose < john.r.r...@oracle.com > wrote: >>>>>>> On Aug 31, 2016, at 11:59 PM, John Rose < john.r.r...@oracle.com > >>>>>>> wrote: >>>>>>>> I have updated of this document to reflect comments so far. >>>>>>>> It is stored to CR (in place) and enclosed here. >>>>>>>> — John >>>>>>>> Link: http://cr.openjdk.java.net/~jrose/values/shady-values.html >>>>>>>> <shady-values.html> >>>>>>> I have updated the document again with small corrections and >>>>>>> clarifications.