[foreign] RFR: improved macro parser

Maurizio Cimadamore maurizio.cimadamore at oracle.com
Mon Jun 11 10:42:53 UTC 2018


I believe it's ok to share the file manager - we do this in several 
compiler regression tests to reduce some of the overhead associated when 
creating a file manager. Since we're not really using any file manager 
related option in the various tasks (e.g. -d etc.), there should be no 
leaking at all - e.g. all javac tasks should share same input/output 
paths, etc.

Maurizio


On 11/06/18 03:59, Sundararajan Athijegannathan wrote:
> * Will the static JavaFileManager in MacroParser leak stuff? or is it 
> okay to share it?
> * constants.h misses copyright.
>
> +1 other than that.
>
> Thanks
> -Sundar
>
> On 07/06/18, 6:53 PM, Maurizio Cimadamore wrote:
>> 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