[llvm.py] Make ObjectFile destructor work
authorGregory Szorc <gregory.szorc@gmail.com>
Fri, 9 Mar 2012 18:56:33 +0000 (18:56 +0000)
committerGregory Szorc <gregory.szorc@gmail.com>
Fri, 9 Mar 2012 18:56:33 +0000 (18:56 +0000)
Previous code had a double free in MemoryBuffer. The tests now pass.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@152422 91177308-0d34-0410-b5e6-96231b3b80d8

bindings/python/llvm/common.py
bindings/python/llvm/core.py
bindings/python/llvm/object.py

index 7818ff41a4e43e986fd1cc1b341f2845e5e8af80..fe35bf124fe1f2175c75d32690732efedda44c6a 100644 (file)
@@ -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 @@ def get_library():
     """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)
index 5a3bd51cfa57288e48171c5d4f650440e8e16dde..bd9f8aaa2b7256906198a022ed4a7506b0ff76e1 100644 (file)
@@ -7,6 +7,7 @@
 #
 #===------------------------------------------------------------------------===#
 
+from .common import LLVMObject
 from .common import get_library
 
 from ctypes import POINTER
@@ -33,7 +34,7 @@ class MemoryBuffer(object):
         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 @@ class MemoryBuffer(object):
             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]
index a55a5cb64e19b0a7eaf51c4518fee3361d0d485e..f633f609536a35ef05c9ee653797edd9ada2c5e0 100644 (file)
@@ -11,6 +11,7 @@ from ctypes import c_char_p
 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 @@ class ObjectFile(object):
 
         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 @@ class Relocation(object):
     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 @@ def register_library(library):
 
     # 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 @@ def register_library(library):
     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