[foreign] RFR 8215211: cleanup JType/TypeDIctionary
Maurizio Cimadamore
maurizio.cimadamore at oracle.com
Tue Dec 11 16:02:24 UTC 2018
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