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

Reply via email to