Author: Armin Rigo <[email protected]>
Branch: stmgc-c7
Changeset: r70190:c2aa0c41cac7
Date: 2014-03-23 10:15 +0100
http://bitbucket.org/pypy/pypy/changeset/c2aa0c41cac7/
Log: Test and fix
diff --git a/rpython/translator/c/funcgen.py b/rpython/translator/c/funcgen.py
--- a/rpython/translator/c/funcgen.py
+++ b/rpython/translator/c/funcgen.py
@@ -699,25 +699,31 @@
#address operations
def OP_RAW_STORE(self, op):
+ tlprefix, char = '', 'char'
+ if (self._is_stm() and isinstance(op.args[0].concretetype, Ptr)
+ and op.args[0].concretetype.TO._gckind == 'gc'):
+ tlprefix, char = ' TLPREFIX ', 'rpygcchar_t'
addr = self.expr(op.args[0])
offset = self.expr(op.args[1])
value = self.expr(op.args[2])
TYPE = op.args[2].concretetype
- typename = cdecl(self.db.gettype(TYPE).replace('@', '*@'), '')
- return (
- '((%(typename)s) (((char *)%(addr)s) + %(offset)s))[0] = %(value)s;'
- % locals())
+ typename = cdecl(self.db.gettype(TYPE).replace('@', tlprefix+'*@'), '')
+ return ('((%(typename)s) (((%(char)s *)%(addr)s)'
+ ' + %(offset)s))[0] = %(value)s;' % locals())
OP_BARE_RAW_STORE = OP_RAW_STORE
def OP_RAW_LOAD(self, op):
+ tlprefix, char = '', 'char'
+ if (self._is_stm() and isinstance(op.args[0].concretetype, Ptr)
+ and op.args[0].concretetype.TO._gckind == 'gc'):
+ tlprefix, char = ' TLPREFIX ', 'rpygcchar_t'
addr = self.expr(op.args[0])
offset = self.expr(op.args[1])
result = self.expr(op.result)
TYPE = op.result.concretetype
- typename = cdecl(self.db.gettype(TYPE).replace('@', '*@'), '')
- return (
- "%(result)s = ((%(typename)s) (((char *)%(addr)s) + %(offset)s))[0];"
- % locals())
+ typename = cdecl(self.db.gettype(TYPE).replace('@', tlprefix+'*@'), '')
+ return ('%(result)s = ((%(typename)s)'
+ ' (((%(char)s *)%(addr)s) + %(offset)s))[0];' % locals())
def OP_CAST_PRIMITIVE(self, op):
TYPE = self.lltypemap(op.result)
diff --git a/rpython/translator/stm/test/test_ztranslated.py
b/rpython/translator/stm/test/test_ztranslated.py
--- a/rpython/translator/stm/test/test_ztranslated.py
+++ b/rpython/translator/stm/test/test_ztranslated.py
@@ -473,3 +473,22 @@
t, cbuilder = self.compile(main)
data = cbuilder.cmdexec('')
assert '< 42 >\n< 84 >\n' in data
+
+ def test_raw_load_store_on_gc(self):
+ X = lltype.GcStruct('X', ('foo', lltype.Signed))
+ prebuilt = lltype.malloc(X, immortal=True)
+ prebuilt.foo = 42
+ ofs_foo = llmemory.offsetof(X, 'foo')
+
+ def main(argv):
+ p = lltype.cast_opaque_ptr(llmemory.GCREF, prebuilt)
+ llop.raw_store(lltype.Void, p, ofs_foo, -84)
+ print prebuilt.foo
+ prebuilt.foo = -1298
+ print llop.raw_load(lltype.Signed, p, ofs_foo)
+ return 0
+
+ t, cbuilder = self.compile(main)
+ data = cbuilder.cmdexec('')
+ assert '-84\n' in data
+ assert '-1298\n' in data
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit