JEP 303 and ConstantDynamic
Hontvári Attila
attila at hontvari.net
Tue Aug 8 09:21:23 UTC 2017
2017-08-07 19:56 keltezéssel, Paul Sandoz írta:
> On 6 Aug 2017, at 07:01, Hontvári Attila <attila at hontvari.net
> <mailto:attila at hontvari.net>> wrote:
>> On 2017. 08. 04. 4:14, John Rose wrote:
>>> On Aug 3, 2017, at 5:57 AM, Hontvári Attila <attila at hontvari.net
>>> <mailto:attila at hontvari.net> <mailto:attila at hontvari.net>> wrote:
>>>
>>>> But as I understand this, the data of the instances of the
>>>> intrinsic types don't have to be known at compile-time; they only
>>>> have to be known and constant at run-time.
>>>
>>> That's not true. We need to be able to fold true constant
>>> expressions into
>>> bootstrap method arguments and similar class file structures.
>> I originally thought that almost anything that references any CP
>> entry can refer to a CONSTANT_Dynamic, but according to JDK-8177279
>> only an ldc or a BootstrapMethods table can refer to a condy item.
>
> Condy is about dynamic linking of *constant values*, they bubble up
> onto the stack. It does not make sense for a say a putfield
> instruction to refer to anything other than a symbolic reference to a
> field.
Sure, I confused its (intentional) limits with CP-patching in the
"Isolated Methods" JEP, which can patch any constant item.
>> Would it be possible to make the invokedynamic instruction to handle
>> a CONSTANT_Dynamic (with type=BootstrapSpecifier) in place of a
>> CONSTANT_InvokeDynamic? Or would it still not solve all the use cases
>> of the JEP?
>
> IIUC your question (an invokedynamic referring to a CONSTANT_Dynamic
> entry?) I don’t see how that would help.
It would enable using Intrinsics.invokedynamic without compile-time
constants. The user specifies an expression that creates the
BootstrapSpecifier, the compiler extracts that expression to a condy
BSM, and emits an invokedynamic that refers to a CONSTANT_Dynamic with
the BootstrapSpecifier-producing expression as its BSM.
So the user could write something like this:
Intrinsics.invokedynamic(
__CONDY(l->new BootstrapSpecifier(l.findStatic(X.class, "y",
methodType(etc.)))),
args);
>
> Paul.
>
>>> (Remi uses bytecode transforms to approximate the real thing more
>>> closely.)
>>>
>>> — John
>>
>
More information about the valhalla-dev
mailing list