python bindings: Use python Diagnostics as function arguments

This improves the readability of the code and fixes one testsuite bug.

The bug happend, because we only stored the pointer to the diagnostic in the
FixIt iterator, but not the python Diagnostic object. So it could happen that
the FixIt iterator still exists, but the python Diagnostic object is freed.
However, as the python Diagnostic is freed the pointer to the diagnostic is also
freed and the FixIt iterator is referencing a freed pointer.

llvm-svn: 124952
This commit is contained in:
Tobias Grosser 2011-02-05 17:53:48 +00:00
parent 2128823e74
commit 82c18a502f
1 changed files with 17 additions and 14 deletions

View File

@ -191,19 +191,19 @@ class Diagnostic(object):
self.ptr = ptr self.ptr = ptr
def __del__(self): def __del__(self):
_clang_disposeDiagnostic(self.ptr) _clang_disposeDiagnostic(self)
@property @property
def severity(self): def severity(self):
return _clang_getDiagnosticSeverity(self.ptr) return _clang_getDiagnosticSeverity(self)
@property @property
def location(self): def location(self):
return _clang_getDiagnosticLocation(self.ptr) return _clang_getDiagnosticLocation(self)
@property @property
def spelling(self): def spelling(self):
return _clang_getDiagnosticSpelling(self.ptr) return _clang_getDiagnosticSpelling(self)
@property @property
def ranges(self): def ranges(self):
@ -217,7 +217,7 @@ class Diagnostic(object):
def __getitem__(self, key): def __getitem__(self, key):
return _clang_getDiagnosticRange(self.diag, key) return _clang_getDiagnosticRange(self.diag, key)
return RangeIterator(self.ptr) return RangeIterator(self)
@property @property
def fixits(self): def fixits(self):
@ -236,12 +236,15 @@ class Diagnostic(object):
return FixIt(range, value) return FixIt(range, value)
return FixItIterator(self.ptr) return FixItIterator(self)
def __repr__(self): def __repr__(self):
return "<Diagnostic severity %r, location %r, spelling %r>" % ( return "<Diagnostic severity %r, location %r, spelling %r>" % (
self.severity, self.location, self.spelling) self.severity, self.location, self.spelling)
def from_param(self):
return self.ptr
class FixIt(object): class FixIt(object):
""" """
A FixIt represents a transformation to be applied to the source to A FixIt represents a transformation to be applied to the source to
@ -681,35 +684,35 @@ _clang_getDiagnostic.argtypes = [c_object_p, c_uint]
_clang_getDiagnostic.restype = c_object_p _clang_getDiagnostic.restype = c_object_p
_clang_disposeDiagnostic = lib.clang_disposeDiagnostic _clang_disposeDiagnostic = lib.clang_disposeDiagnostic
_clang_disposeDiagnostic.argtypes = [c_object_p] _clang_disposeDiagnostic.argtypes = [Diagnostic]
_clang_getDiagnosticSeverity = lib.clang_getDiagnosticSeverity _clang_getDiagnosticSeverity = lib.clang_getDiagnosticSeverity
_clang_getDiagnosticSeverity.argtypes = [c_object_p] _clang_getDiagnosticSeverity.argtypes = [Diagnostic]
_clang_getDiagnosticSeverity.restype = c_int _clang_getDiagnosticSeverity.restype = c_int
_clang_getDiagnosticLocation = lib.clang_getDiagnosticLocation _clang_getDiagnosticLocation = lib.clang_getDiagnosticLocation
_clang_getDiagnosticLocation.argtypes = [c_object_p] _clang_getDiagnosticLocation.argtypes = [Diagnostic]
_clang_getDiagnosticLocation.restype = SourceLocation _clang_getDiagnosticLocation.restype = SourceLocation
_clang_getDiagnosticSpelling = lib.clang_getDiagnosticSpelling _clang_getDiagnosticSpelling = lib.clang_getDiagnosticSpelling
_clang_getDiagnosticSpelling.argtypes = [c_object_p] _clang_getDiagnosticSpelling.argtypes = [Diagnostic]
_clang_getDiagnosticSpelling.restype = _CXString _clang_getDiagnosticSpelling.restype = _CXString
_clang_getDiagnosticSpelling.errcheck = _CXString.from_result _clang_getDiagnosticSpelling.errcheck = _CXString.from_result
_clang_getDiagnosticNumRanges = lib.clang_getDiagnosticNumRanges _clang_getDiagnosticNumRanges = lib.clang_getDiagnosticNumRanges
_clang_getDiagnosticNumRanges.argtypes = [c_object_p] _clang_getDiagnosticNumRanges.argtypes = [Diagnostic]
_clang_getDiagnosticNumRanges.restype = c_uint _clang_getDiagnosticNumRanges.restype = c_uint
_clang_getDiagnosticRange = lib.clang_getDiagnosticRange _clang_getDiagnosticRange = lib.clang_getDiagnosticRange
_clang_getDiagnosticRange.argtypes = [c_object_p, c_uint] _clang_getDiagnosticRange.argtypes = [Diagnostic, c_uint]
_clang_getDiagnosticRange.restype = SourceRange _clang_getDiagnosticRange.restype = SourceRange
_clang_getDiagnosticNumFixIts = lib.clang_getDiagnosticNumFixIts _clang_getDiagnosticNumFixIts = lib.clang_getDiagnosticNumFixIts
_clang_getDiagnosticNumFixIts.argtypes = [c_object_p] _clang_getDiagnosticNumFixIts.argtypes = [Diagnostic]
_clang_getDiagnosticNumFixIts.restype = c_uint _clang_getDiagnosticNumFixIts.restype = c_uint
_clang_getDiagnosticFixIt = lib.clang_getDiagnosticFixIt _clang_getDiagnosticFixIt = lib.clang_getDiagnosticFixIt
_clang_getDiagnosticFixIt.argtypes = [c_object_p, c_uint, POINTER(SourceRange)] _clang_getDiagnosticFixIt.argtypes = [Diagnostic, c_uint, POINTER(SourceRange)]
_clang_getDiagnosticFixIt.restype = _CXString _clang_getDiagnosticFixIt.restype = _CXString
_clang_getDiagnosticFixIt.errcheck = _CXString.from_result _clang_getDiagnosticFixIt.errcheck = _CXString.from_result