Fix problem with caching llvm.core.Value objects.
This commit is contained in:
parent
cb00dcc52c
commit
bf121485ad
2 changed files with 18 additions and 8 deletions
|
|
@ -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):
|
||||||
|
|
|
||||||
17
llvm/core.py
17
llvm/core.py
|
|
@ -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):
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue