[foreign] RFR: improved macro parser
Maurizio Cimadamore
maurizio.cimadamore at oracle.com
Thu Jun 7 13:23:34 UTC 2018
Hi,
please find a second revision of the parser. This has a quite different
design, and I've ditched use of jshell API in favor of a more direct
approach using compiler API. The reason is that jshell API doesn't
expose ASTs, so it is hard to filter out stuff we don't want - which
means we can accidentally pull in Java constants (e.g. Integer.MAX_VALUE).
The new approach is much more straightforward (and faster too, since
bits are not executed). It leans heavily on javac's constant folding -
so macro are expanded, and given to the compiler which type-checks them;
if all is a constant, javac will set the constant value on the variable
- which is then accessible through the VariableElement API. If it's not
constant, we should not bother with it in the first place.
A small visitor makes sure that we can only accept the right kind of
trees - e.g. unary/binary expessions, parenthesis, literals.
The parser is using an internal API point - namely JavacTaskPool, which
is used to share compilation context among multiple runs, and greatly
speed up the type-checking machinery (otherwise we have to init the
symbol tables at every macro evaluation, which is very costly). This is
a standard trick we do in both compiler combo tests and jshell.
Webrev:
http://cr.openjdk.java.net/~mcimadamore/panama/macro_parser_v2/
Cheers
Maurizio
On 01/06/18 22:21, Maurizio Cimadamore wrote:
> Hi,
> this webrev adds a new way of parsing object-like macros which relies
> on the jshell API; defined macros are turned into jshell var
> declaration - e.g.
>
> #define FOO 12
>
> is turned into
>
> 'var FOO = 12;'
>
> All macros are entered into a jshell context, and this allows to
> 'resolve' macro names so that we can handle common cases like:
>
> #define MAX 43
> #define MIN (-MAX)
>
> Thanks to the jshell API the new code is not too complex, and it
> handles the vast majority of constant-like macros. Of course we need a
> more general fallback for macros (esp. function-like), e.g. I'm under
> no illusion that this will work in all cases, but this looks like a
> good improvement over the current strategy that blows up as soon as
> there are more than two tokens in the macro.
>
> I tested with a bunch of system headers and results seemed
> significantly better than before.
>
> Webrev:
>
> http://cr.openjdk.java.net/~mcimadamore/panama/macro_parser/
>
> Maurizio
>
>
>
More information about the panama-dev
mailing list