On Thu, 16 Mar 2023 09:40:30 GMT, Maurizio Cimadamore <mcimadam...@openjdk.org> 
wrote:

>> src/java.base/share/classes/jdk/internal/foreign/abi/CallingSequenceBuilder.java
>>  line 219:
>> 
>>> 217:             case Binding.Cast unused-> true;
>>> 218:         };
>>> 219:     }
>> 
>> I'd go a bit further here and visually organize the cases as well. Also, 
>> using a static import for `Binding.*`:
>> 
>> Suggestion:
>> 
>>     static boolean isUnbox(Binding binding) {
>>         return switch (binding) {
>>             case VMStore       unused -> true;
>>             case BufferLoad    unused -> true;
>>             case Copy          unused -> true;
>>             case UnboxAddress  unused -> true;
>>             case Dup           unused -> true;
>>             case Cast          unused -> true;
>>             
>>             case VMLoad       unused -> false;
>>             case BufferStore  unused -> false;
>>             case Allocate     unused -> false;
>>             case BoxAddress   unused -> false;
>>         };
>>     }
>> 
>> 
>> It's a bit unfortunate that we need variable names as well.
>
> While I agree that some "visitor" methods would be better dealt with using 
> patterns, I remain unconvinced about the box/unbox classification being 
> modeled as an "operation". That's because it's a static property of the 
> binding - e.g. given a binding you know whether it can be used for 
> box/unbox/both/none. If this was an enum, I would encode it as a boolean 
> field and never look back. Also note how the javadoc for Binding itself makes 
> quite a lot of comments on box/unbox nature of bindings, and how they can 
> have different semantics depending on the direction. To me it feels like that 
> distinction is a first class citizen in Binding.
> 
> Perhaps, pulling together the various strings, it would maybe possible to 
> define very simple records for the various bindings, with no verification and 
> interpretation code (e.g. leave that to some pattern-based visitor somewhere 
> else). But I think I would still expect a binding class to know whether it's 
> used for unbox or not w/o having to run a complex operation all the time 
> (given that the property is a constant of the binding class). The fact that 
> we're using records for bindings and we can't have an abstract class also 
> biases the decision a bit (otherwise we could simply use a bunch of 
> constructor parameters to encode the box/unbox properties).
> 
> That said, this is all subjective. I don't have super strong opinion on this. 
> The code above looks a tad odd to me, but I can live with it.

I've spoken to the Amber persons and soon we will be able to do:


static boolean isBox(Binding binding) {
    return switch (binding) {
        case VMLoad _, 
            Copy _,
            Allocate _,
            BoxAddress _,
            BufferStore _,
            Dup _,
            Cast _-> true;

        case VMStore _, 
            BufferLoad _,
            UnboxAddress _ -> false;
        
    };
}

-------------

PR: https://git.openjdk.org/jdk/pull/13047

Reply via email to