From: "Brian Goetz" <brian.go...@oracle.com> 
To: "Remi Forax" <fo...@univ-mlv.fr> 
Cc: "Jim Laskey" <james.las...@oracle.com>, "amber-spec-experts" 
<amber-spec-experts@openjdk.java.net> 
Sent: Monday, March 7, 2022 4:08:00 PM 
Subject: Re: [External] : Re: Proposal: java.lang.runtime.Carrier 




BQ_BEGIN


BQ_BEGIN

Adding more information, 
we want the carrier to be a primitive type (to be able to optimize it away), 
which means that we can not use null to represent "do_not_match", 
we have to have a flag inside the carrier for that. 

BQ_END

The alternate approach is to use a .ref class for partial patterns (using null 
for "no match") and a B3 class for total patterns (since it needs no failure 
channel.) 
BQ_END


yes, 
we still need an int to indicate which case of the switch match and using B3 in 
Valhalla already give us the performance we want. 
Anyway changing from one representation to the other is not a big deal. 


BQ_BEGIN


I think its pretty important that the static name of the carrier class not 
appear in generated bytecode. 
BQ_END


Yes, that why i'm using java.lang.Object in the bytecode visible code. 


BQ_BEGIN
As a result, we will have to use a reference type (object or interface), which 
means we get the null channel "for free". 
BQ_END

Not necessarily, while java.lang.Object appears in the bytecode a JIT like c2 
propagates the real type of the constants (here empty() is typed with the type 
of the carrier not with java.lang.Object at runtime) so introducing null may 
introduce some stupid nullchecks. 

Rémi 

Reply via email to