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 @property
def _ptr(self): 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): def _extract_ptrs(objs):

View file

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