[foreign] RFR 8215211: cleanup JType/TypeDIctionary

Sundararajan Athijegannathan sundararajan.athijegannathan at oracle.com
Wed Dec 12 10:53:26 UTC 2018


+1


inline comments below..

On 12/12/18, 3:59 PM, Maurizio Cimadamore wrote:
>
> Thanks for the review, comment below:
>
> On 12/12/2018 08:43, Sundararajan Athijegannathan wrote:
>> Very nice! I built & tested the patch on Mac and also ran our 
>> platform specific samples (on mac). All fine.
>>
>> One question: why is the EnumTree part in typedef handler is removed?
>
> The new code is this:
>
>   else if (defTree.name().equals(tt.name())) {
>   189                 /*
>   190                  * Remove redundant typedef like:
>   191                  *
>   192                  * typedef struct Point { int x; int y; } Point
>   193                  * typedef enum Color { R, G, B} Color
>   194                  * typedef struct Undef Undef
>   195                  */
>   196                 return null;
>   197             }

Ah.. right! Missed the proper diff :)

>
> That is, if the typedef name matches the name of the entity being 
> typedef'ed, then the typedef should always be considered redundant, 
> regardless of it being an enum, struct, ...
>
> The old code was doing something similar, but had two different paths 
> for structs and enums - the new code unifies the 'redundant check' 
> logic. It think it should be functionally equivalent to what we had.
>
> Question: this visitor really does two things:
>
> 1) removes redundant type def, as in 'typedef struct Foo { } Foo'
>
> 2) move name from typedef to anon entity 'typedef struct { } Foo'
>
> We discussed about (1). Now, about (2), the code only does the name 
> injection if we have an anon struct - can we also have an anon enum? 
> E.g. might it make sense to apply both (1) and (2) regardless of the 
> entity being typedef'ed?
>

We don't have any explicit "enum" type mapped to Java -bunch of getters 
for "enum constants" in the containing header interface. typedef name 
propagation for enum may not help much - except perhaps for the 
annotation for enum.  That seems to happen already.

I tried the following:

typedef enum {
    R, G, B
} Color;

Color annotation is generated in this case...

Thanks,
-Sundar

> Maurizio
>
>
>> Other than that +1
>>
>> -Sundar
>>
>> On 11/12/18, 9:32 PM, Maurizio Cimadamore wrote:
>>> Hi,
>>> please review this jextract patch:
>>>
>>> http://cr.openjdk.java.net/~mcimadamore/panama/8215211_v2/
>>>
>>> The goal is to simplify the JType hierarchy and the TypeDictionary 
>>> class. JType is currently a very rich hierarchy that is capable of 
>>> modeling basically any clang type/cursor. In a way, JType is 
>>> overlapping a lot with the recently added jextract tree 
>>> representation; it feels like JType can be greatly simplified, and 
>>> we can just rely on trees for structural info.
>>>
>>> Simplifying the JType hierarchy has many benefits - in the patch you 
>>> will notice that we no longer need a lot of instance tests and casts.
>>>
>>> The second issue is with TypeDictionary, whose lookup/define logic 
>>> is scattered across TypeDictionary and HeaderFile::define. There's 
>>> also a very complex lookup scheme which starts from 
>>> TypeDictionary::lookup and then ends up in Context then back to 
>>> HeaderFile::define. This is all very hard to follow.
>>>
>>> I've now centralized all type resolution logic in TypeDictionary, 
>>> which now features two functions: lookup and enterIfAbsent, which 
>>> internally share the same 'getInternal'. TypeDictionary will simply 
>>> create a JType from a clang Type, and the only thing a 
>>> TypeDictionary has to keep track of, is the use of the anonymous 
>>> function types created during the 'enter' phase. Note that such 
>>> enter phase has now been moved into a proper tree visitor.
>>>
>>> This simplify things quite a bit, to the point that 
>>> AsmCodeFactory::addType becomes a simple visitor call. I think more 
>>> rounds of cleanup are possible, but, to get there, we need to 
>>> simplify the logic of Context/HeaderFile::processTree, which 
>>> requires having a more precise mapping between clang compilation 
>>> units and jextract trees. For instance, we currently parse 
>>> everything into the same 'header tree', even if we end up generating 
>>> multiple classes; secondly, we sorely miss a CallbackTree, so we 
>>> have to do a lot of gymnastic in order to understand which 
>>> classfiles need to be generated for functional interfaces.
>>>
>>> Note: I seem to recall that function pointer typedef should emit, a 
>>> named functional interface matching the name of the typedef. But the 
>>> I noted that this is not the way things work in the current impl, so 
>>> I did not bother too much with that (but I can address that if 
>>> required, although doing so will cause breakages in tests, so I'd 
>>> prefer to do that separately).
>>>
>>> Cheers
>>> Maurizio
>>>


More information about the panama-dev mailing list