[llvm-commits] [llvm] r152422 - in /llvm/trunk/bindings/python/llvm: common.py core.py object.py

Gregory Szorc gregory.szorc at gmail.com
Fri Mar 9 10:56:33 PST 2012


Author: gps
Date: Fri Mar  9 12:56:33 2012
New Revision: 152422

URL: http://llvm.org/viewvc/llvm-project?rev=152422&view=rev
Log:
[llvm.py] Make ObjectFile destructor work

Previous code had a double free in MemoryBuffer. The tests now pass.

Modified:
    llvm/trunk/bindings/python/llvm/common.py
    llvm/trunk/bindings/python/llvm/core.py
    llvm/trunk/bindings/python/llvm/object.py

Modified: llvm/trunk/bindings/python/llvm/common.py
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/bindings/python/llvm/common.py?rev=152422&r1=152421&r2=152422&view=diff
==============================================================================
--- llvm/trunk/bindings/python/llvm/common.py (original)
+++ llvm/trunk/bindings/python/llvm/common.py Fri Mar  9 12:56:33 2012
@@ -7,20 +7,24 @@
 #
 #===------------------------------------------------------------------------===#
 
+from ctypes import POINTER
+from ctypes import c_void_p
 from ctypes import cdll
 
 import ctypes.util
-import platform
 
 __all__ = [
-    "find_library",
-    "get_library",
+    'LLVMObject',
+    'find_library',
+    'get_library',
 ]
 
+LLVMObject = POINTER(c_void_p)
+
 def find_library():
     # FIXME should probably have build system define absolute path of shared
     # library at install time.
-    for lib in ["LLVM-3.1svn", "LLVM"]:
+    for lib in ['LLVM-3.1svn', 'LLVM']:
         result = ctypes.util.find_library(lib)
         if result:
             return result
@@ -32,6 +36,6 @@
     """Obtain a reference to the llvm library."""
     lib = find_library()
     if not lib:
-        raise Exception("LLVM shared library not found!")
+        raise Exception('LLVM shared library not found!')
 
     return cdll.LoadLibrary(lib)

Modified: llvm/trunk/bindings/python/llvm/core.py
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/bindings/python/llvm/core.py?rev=152422&r1=152421&r2=152422&view=diff
==============================================================================
--- llvm/trunk/bindings/python/llvm/core.py (original)
+++ llvm/trunk/bindings/python/llvm/core.py Fri Mar  9 12:56:33 2012
@@ -7,6 +7,7 @@
 #
 #===------------------------------------------------------------------------===#
 
+from .common import LLVMObject
 from .common import get_library
 
 from ctypes import POINTER
@@ -33,7 +34,7 @@
         if filename is None:
             raise Exception("filename argument must be defined")
 
-        memory = c_void_p(None)
+        memory = LLVMObject()
         out = c_char_p(None)
 
         result = lib.LLVMCreateMemoryBufferWithContentsOfFile(filename,
@@ -43,17 +44,23 @@
             raise Exception("Could not create memory buffer: %s" % out.value)
 
         self._memory = memory
+        self._as_parameter_ = self._memory
+        self._owned = True
 
     def __del__(self):
-        lib.LLVMDisposeMemoryBuffer(self._memory)
+        if self._owned:
+            lib.LLVMDisposeMemoryBuffer(self._memory)
 
     def from_param(self):
-        return self._memory
+        return self._as_parameter_
+
+    def release_ownership(self):
+        self._owned = False
 
 
 def register_library(library):
     library.LLVMCreateMemoryBufferWithContentsOfFile.argtypes = [c_char_p,
-            POINTER(c_void_p), POINTER(c_char_p)]
+            POINTER(LLVMObject), POINTER(c_char_p)]
     library.LLVMCreateMemoryBufferWithContentsOfFile.restype = bool
 
     library.LLVMDisposeMemoryBuffer.argtypes = [c_void_p]

Modified: llvm/trunk/bindings/python/llvm/object.py
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/bindings/python/llvm/object.py?rev=152422&r1=152421&r2=152422&view=diff
==============================================================================
--- llvm/trunk/bindings/python/llvm/object.py (original)
+++ llvm/trunk/bindings/python/llvm/object.py Fri Mar  9 12:56:33 2012
@@ -11,6 +11,7 @@
 from ctypes import c_uint64
 from ctypes import c_void_p
 
+from .common import LLVMObject
 from .common import get_library
 from .core import MemoryBuffer
 
@@ -40,9 +41,14 @@
 
         self._memory = contents
         self._obj = lib.LLVMCreateObjectFile(contents)
+        contents.release_ownership()
+        self._as_parameter_ = self._obj
 
     def __del__(self):
-        lib.LLVMDisposeObjectFile(self._obj)
+        lib.LLVMDisposeObjectFile(self)
+
+    def from_param(self):
+        return self._as_parameter_
 
     def get_sections(self):
         """Obtain the sections in this object file.
@@ -143,7 +149,6 @@
     def value_string(self):
         pass
 
-ObjectFileRef = c_void_p
 SectionIteratorRef = c_void_p
 SymbolIteratorRef = c_void_p
 RelocationIteratorRef = c_void_p
@@ -153,16 +158,16 @@
 
     # Object.h functions
     library.LLVMCreateObjectFile.argtypes = [MemoryBuffer]
-    library.LLVMCreateObjectFile.restype = ObjectFileRef
+    library.LLVMCreateObjectFile.restype = LLVMObject
 
-    library.LLVMDisposeObjectFile.argtypes = [ObjectFileRef]
+    library.LLVMDisposeObjectFile.argtypes = [ObjectFile]
 
-    library.LLVMGetSections.argtypes = [ObjectFileRef]
+    library.LLVMGetSections.argtypes = [ObjectFile]
     library.LLVMGetSections.restype = SectionIteratorRef
 
     library.LLVMDisposeSectionIterator.argtypes = [SectionIteratorRef]
 
-    library.LLVMIsSectionIteratorAtEnd.argtypes = [ObjectFileRef,
+    library.LLVMIsSectionIteratorAtEnd.argtypes = [ObjectFile,
             SectionIteratorRef]
     library.LLVMIsSectionIteratorAtEnd.restype = bool
 
@@ -171,12 +176,12 @@
     library.LLVMMoveToContainingSection.argtypes = [SectionIteratorRef,
             SymbolIteratorRef]
 
-    library.LLVMGetSymbols.argtypes = [ObjectFileRef]
+    library.LLVMGetSymbols.argtypes = [ObjectFile]
     library.LLVMGetSymbols.restype = SymbolIteratorRef
 
     library.LLVMDisposeSymbolIterator.argtypes = [SymbolIteratorRef]
 
-    library.LLVMIsSymbolIteratorAtEnd.argtypes = [ObjectFileRef,
+    library.LLVMIsSymbolIteratorAtEnd.argtypes = [ObjectFile,
             SymbolIteratorRef]
     library.LLVMIsSymbolIteratorAtEnd.restype = bool
 





More information about the llvm-commits mailing list