JDK-8230501: Class data support for hidden classes

forax at univ-mlv.fr forax at univ-mlv.fr
Fri Nov 13 23:25:53 UTC 2020


----- Mail original -----
> De: "John Rose" <john.r.rose at oracle.com>
> À: "Remi Forax" <forax at univ-mlv.fr>
> Cc: "mandy chung" <mandy.chung at oracle.com>, "valhalla-dev" <valhalla-dev at openjdk.java.net>
> Envoyé: Vendredi 13 Novembre 2020 23:46:24
> Objet: Re: JDK-8230501: Class data support for hidden classes

> On Nov 13, 2020, at 2:02 PM, forax at univ-mlv.fr wrote:
>> 
>> I want it, null is easy to check in term of bytecode and is aggressively
>> propagated by c1 and c2 so you can write the equivalent IFDEF at runtine by
>> putting nulls in the right holes.
>> It's also pretty useful when you have object that have a double representation,
>> i.e. a value that can be a primitive value or a box, again testing if the box
>> is null is a common operation.
> 
> Null as a static constant can be created easily by other means,
> so in most use cases, there’s no need to plumb a null through
> a ClassData.  Just use aconst_null or ili.CBs::nullConstant.

yes,
but i was thinking about using it to define things like a capability, being null meaning the capability doesn't exist,
so you still also need to be able to pass a real object if the capability exists.

something like
  if (ldc condy != null) {
    ldc condy
    invokevirtual ...
  }

> 
> Maybe what you are hoping for is statically generated bytecodes
> which are invariant across nullable “holes”, where the holes
> are filled by a ClassData. 

yes,
it's the same bytecode specialized using holes, so you don't have to generate it at runtime, only to specialize it at runtime.

> Fine, in that case use a nullable container, such as Stuart Marks’ Stream::asList.

First, you can not using the result of toList() if it's a null friendly List because Mandy propose to use a List.copyOf() in between that will choke is there is a null inside the List.
Moreover if Stuart still want to use ListN to both this kind of List and List.of(...) then the result of ListN.get() will not be a constant if the value is null (because of the semantics of @Stable).
Which means that classData() will be useless, the only way will be to use classDataAt().

To summarize, if the only thing you can inject is a List which will be copy into an immutable list, passing null will not be easy, I can still wrap it and then unwrap it with you own condy BSM, it makes classData() useless as a BSM and makes passing only one object far more complex than the previous proposal.

> 
> — John

Rémi


More information about the valhalla-dev mailing list