[cfe-dev] CompilationDatabase support added to libclang and python binding

Gregory Szorc gregory.szorc at gmail.com
Fri Jun 15 09:53:50 PDT 2012

On 6/15/12 6:47 AM, Arnaud de Grandmaison wrote:
> Hi Manuel & Gregory,
> If there are no more feedback, can someone commit those patches for me ?
> I do not have commit access.

Sorry about the delay.

I'm not qualified to review the C++. But, the style changes look very 
good! I'm more than satisfied with its state.

The Python is *extremely* close. The only major item left (and I didn't 
mention this in the initial feedback, sorry) is to store a reference to 
the associated CompilationDatabase in CompileCommands instances. Now, 
this may not be required (I haven't looked at the C++). If 
CompileCommands don't internally use a reference to their associated DB, 
we're fine. But if they do, then it is possible that a garbage 
collection could collect the DB instance and CompileCommands could blow 
up on next access. By stuffing a reference to the parent in the child, 
you prevent GC from prematurely collecting the parent. This manual 
reference tracking can be done in the from_result(). Just iterate over 
args until you find an instance of the appropriate type.

Even if there is no reference now, it may not always work. You should 
add a test that forces a GC to ensure things don't blow up in the 
future. Search for "gc" in the test code and you'll find an example.

Why does CompilationCommands.from_result raise a KeyError? KeyError 
would be appropriate if you were trying to access an attribute, etc. Its 
use on a function is IMO inappropriate. If you must raise, I think it 
should be a regular Exception. But, I think in this case the "Pythonic" 
thing to do is return None.

Other nits:

* I like CompilateDatabase.fromDirectory, not createFromDirectory.
* Don't import * in the test. Instead, import specific symbols.

More information about the cfe-dev mailing list