add invariant variable
This commit is contained in:
parent
b941ae5f1f
commit
1e4633c44d
1 changed files with 19 additions and 3 deletions
22
builder.py
22
builder.py
|
|
@ -1000,6 +1000,17 @@ class CValue(object):
|
||||||
errmsg = "Cast from %s to %s is not possible."
|
errmsg = "Cast from %s to %s is not possible."
|
||||||
raise TypeError(errmsg % (self.type, ty))
|
raise TypeError(errmsg % (self.type, ty))
|
||||||
|
|
||||||
|
def ptrtoint(self):
|
||||||
|
self._ensure_is_pointer()
|
||||||
|
builder = self.parent.builder
|
||||||
|
return CTemp(self.parent, builder.ptrtoint(self.value, types.intp))
|
||||||
|
|
||||||
|
def inttoptr(self, ty):
|
||||||
|
if not self.is_int:
|
||||||
|
raise TypeError("Must be an integer")
|
||||||
|
builder = self.parent.builder
|
||||||
|
return CTemp(self.parent, builder.inttoptr(self.value, ty))
|
||||||
|
|
||||||
def _cmp_op(self, name):
|
def _cmp_op(self, name):
|
||||||
'''implements comparison operations
|
'''implements comparison operations
|
||||||
'''
|
'''
|
||||||
|
|
@ -1095,11 +1106,12 @@ class CValue(object):
|
||||||
else:
|
else:
|
||||||
raise TypeError("Must be a pointer or vector; got %s" % self.type)
|
raise TypeError("Must be a pointer or vector; got %s" % self.type)
|
||||||
|
|
||||||
def load(self, volatile=False):
|
def load(self, volatile=False, invariant=False):
|
||||||
'''memory load for pointer types
|
'''memory load for pointer types
|
||||||
'''
|
'''
|
||||||
self._ensure_is_pointer()
|
self._ensure_is_pointer()
|
||||||
loaded = self.parent.builder.load(self.value, volatile=volatile)
|
loaded = self.parent.builder.load(self.value, volatile=volatile,
|
||||||
|
invariant=invariant)
|
||||||
return CTemp(self.parent, loaded)
|
return CTemp(self.parent, loaded)
|
||||||
|
|
||||||
def store(self, val, volatile=False, nontemporal=False):
|
def store(self, val, volatile=False, nontemporal=False):
|
||||||
|
|
@ -1209,6 +1221,7 @@ class CVar(CValue):
|
||||||
def __init__(self, parent, ptr):
|
def __init__(self, parent, ptr):
|
||||||
super(CVar, self).__init__(parent)
|
super(CVar, self).__init__(parent)
|
||||||
self.ptr = ptr
|
self.ptr = ptr
|
||||||
|
self.invariant = False
|
||||||
|
|
||||||
def _inplace_binop(self, op):
|
def _inplace_binop(self, op):
|
||||||
def wrapped(rhs):
|
def wrapped(rhs):
|
||||||
|
|
@ -1256,11 +1269,12 @@ class CVar(CValue):
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def value(self):
|
def value(self):
|
||||||
return self.parent.builder.load(self.ptr)
|
return self.parent.builder.load(self.ptr, invariant=self.invariant)
|
||||||
|
|
||||||
def assign(self, val, nontemporal=False):
|
def assign(self, val, nontemporal=False):
|
||||||
'''assign new value to the variable
|
'''assign new value to the variable
|
||||||
'''
|
'''
|
||||||
|
if self.invariant: raise TypeError("Assignment to invariant variable")
|
||||||
self._ensure_same_type(val)
|
self._ensure_same_type(val)
|
||||||
inst = self.parent.builder.store(val.value, self.ptr)
|
inst = self.parent.builder.store(val.value, self.ptr)
|
||||||
if nontemporal:
|
if nontemporal:
|
||||||
|
|
@ -1354,6 +1368,7 @@ class CStruct(CValue):
|
||||||
def reference(self):
|
def reference(self):
|
||||||
return CTemp(self.parent, self.ptr)
|
return CTemp(self.parent, self.ptr)
|
||||||
|
|
||||||
|
|
||||||
class CExternal(object):
|
class CExternal(object):
|
||||||
'''subclass to define external interface
|
'''subclass to define external interface
|
||||||
|
|
||||||
|
|
@ -1385,3 +1400,4 @@ class CExternal(object):
|
||||||
% (func.type, ftype) )
|
% (func.type, ftype) )
|
||||||
setattr(self, fname, CFunc(cbuilder, func))
|
setattr(self, fname, CFunc(cbuilder, func))
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue