[cfe-commits] [PATCH 1/4] [clang.py] Store reference to TranslationUnit in Cursor and Type
Gregory Szorc
gregory.szorc at gmail.com
Tue May 15 10:50:00 PDT 2012
Let's see if the mail systems don't reject this one...
On Sun, May 13, 2012 at 8:51 PM, Gregory Szorc <gregory.szorc at gmail.com> wrote:
> Fresh patch attached.
>
>
> On 5/13/12 8:46 PM, Gregory Szorc wrote:
>>
>> On 5/13/12 1:00 AM, Manuel Klimek wrote:
>>>
>>> + @property
>>> + def translation_unit(self):
>>> + """Returns the TranslationUnit to which this Cursor belongs."""
>>> + return getattr(self, '_tu', None)
>>>
>>> What's the reason for the default value? Do we expect that people
>>> create cursers via the lowlevel calls? Why would just return tu_ not
>>> work?
>>
>> Just defensive programming. If you return self._tu, that may raise an
>> AttributeError if _tu is not set. Theoretically, the API should ensure
>> that a TU is defined on all Cursor instances, so maybe an AttributeError
>> would be acceptable.
>>
>>> + # Store a reference to the TU in the Python object so it
>>> won't get GC'd
>>> + # before the Cursor.
>>> + tu = None
>>> + for arg in args:
>>> + if isinstance(arg, TranslationUnit):
>>> + tu = arg
>>> + break
>>> +
>>> + if hasattr(arg, 'translation_unit'):
>>> + tu = arg.translation_unit
>>> + break
>>> +
>>> + assert tu is not None
>>> +
>>> + res._tu = tu
>>>
>>> That seems - odd. I can't find docs what from_result is supposed to
>>> do, or what "args" are provided. But having to search through them for
>>> a TU seems wrong - shouldn't they all have a TU?
>>
>> from_result is the errcheck function for the ctypes functions that
>> return a Cursor. The 3rd argument to an errcheck function are the
>> original arguments passed into the called function. For many of the
>> functions, the original argument is a Cursor. However,
>> clang_getTypeDeclaration takes a Type and clang_getTranslationUnitCursor
>> receives a TranslationUnit.
>>
>> It is true that all of the functions today receive a single argument, so
>> the iteration isn't required. However, that may change with the addition
>> of new APIs in the future (this is how I coded it in my nearly
>> feature-complete branch, so I'm guessing it is actually required from a
>> future patch).
>>>
>>>
>>> Also, regarding the test - would it be possible to create a test that
>>> drops the reference, triggers the gc and then makes sure the cursor is
>>> still valid (as that is what we really care about)?
>>>
>> Sure!
>>
>
>
More information about the cfe-commits
mailing list