Fix problem with caching llvm.core.Value objects.

This commit is contained in:
Siu Kwan Lam 2013-02-15 11:18:51 -06:00
commit bf121485ad
2 changed files with 18 additions and 8 deletions

View file

@ -14,7 +14,14 @@ class Wrapper(object):
@property
def _ptr(self):
return self.__ptr
try:
return self.__ptr
except AttributeError:
raise AttributeError("_ptr resource has been removed")
@_ptr.deleter
def _ptr(self):
del self.__ptr
def _extract_ptrs(objs):

View file

@ -926,7 +926,6 @@ class VectorType(Type):
class Value(llvm.Wrapper):
_type_ = api.llvm.Value
def __init__(self, builder, ptr):
assert builder is _ValueFactory
@ -1596,6 +1595,7 @@ class NamedMetaData(llvm.Wrapper):
return mod.get_named_metadata(name)
def delete(self):
_ValueFactory.delete(self._ptr)
self._ptr.eraseFromParent()
@property
@ -1822,13 +1822,14 @@ class _ValueFactory(object):
def build(cls, ptr):
# try to look in the cache
addr = ptr._capsule.pointer
id = ptr.getValueID()
key = id, addr
try:
obj = cls.cache[addr]
obj = cls.cache[key]
return obj
except KeyError:
pass
# find class by value id
id = ptr.getValueID()
ctorcls = cls.class_for_valueid.get(id)
if not ctorcls:
if id > VALUE_INSTRUCTION: # "generic" instruction
@ -1837,12 +1838,12 @@ class _ValueFactory(object):
ctorcls = Value
# cache the obj
obj = ctorcls(_ValueFactory, ptr)
cls.cache[addr] = obj
cls.cache[key] = obj
return obj
@classmethod
def delete(cls, ptr):
del cls.cache[ptr._capsule.pointer]
del cls.cache[(ptr.getValueID(), ptr._capsule.pointer)]
def _make_value(ptr):
return _ValueFactory.build(ptr)
@ -1851,12 +1852,14 @@ def _make_value(ptr):
# Builder
#===----------------------------------------------------------------------===
_atomic_orderings = { 'unordered' : api.llvm.AtomicOrdering.Unordered,
_atomic_orderings = {
'unordered' : api.llvm.AtomicOrdering.Unordered,
'monotonic' : api.llvm.AtomicOrdering.Monotonic,
'acquire' : api.llvm.AtomicOrdering.Acquire,
'release' : api.llvm.AtomicOrdering.Release,
'acq_rel' : api.llvm.AtomicOrdering.AcquireRelease,
'seq_cst' : api.llvm.AtomicOrdering.SequentiallyConsistent}
'seq_cst' : api.llvm.AtomicOrdering.SequentiallyConsistent
}
class Builder(llvm.Wrapper):