Author: Remi Meier <remi.me...@gmail.com> Branch: stmgc-c8 Changeset: r82526:36a2560a3194 Date: 2016-02-26 12:08 +0100 http://bitbucket.org/pypy/pypy/changeset/36a2560a3194/
Log: fix llop.gc_load_indexed for STM 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 @@ -725,15 +725,19 @@ ' (((%(char)s *)%(addr)s) + %(offset)s))[0];' % locals()) def OP_GC_LOAD_INDEXED(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]) index = self.expr(op.args[1]) scale = self.expr(op.args[2]) base_ofs = self.expr(op.args[3]) result = self.expr(op.result) TYPE = op.result.concretetype - typename = cdecl(self.db.gettype(TYPE).replace('@', '*@'), '') + typename = cdecl(self.db.gettype(TYPE).replace('@', tlprefix+'*@'), '') return ( - "%(result)s = ((%(typename)s) (((char *)%(addr)s) + " + "%(result)s = ((%(typename)s) (((%(char)s *)%(addr)s) + " "%(base_ofs)s + %(scale)s * %(index)s))[0];" % locals()) 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 @@ -13,6 +13,20 @@ class TestSTMTranslated(CompiledSTMTests): + def test_math(self): + from rpython.rtyper.lltypesystem.module.ll_math import sqrt_nonneg + def entry_point(argv): + lst = [] + for i in range(int(argv[1])): + lst.append(sqrt_nonneg(99)) + print '<', len(lst), '>' + return 0 + # + t, cbuilder = self.compile(entry_point, backendopt=True) + data = cbuilder.cmdexec('5') + assert '< 5 >' in data, "got: %r" % (data,) + + def test_malloc(self): class Foo: pass @@ -431,6 +445,25 @@ data = cbuilder.cmdexec('') assert '< 42 >\n< 84 >\n' in data + def test_gc_load_indexed(self): + from rpython.rtyper.annlowlevel import llstr + from rpython.rtyper.lltypesystem.rstr import STR + from rpython.rtyper.lltypesystem import lltype, llmemory, rffi, lloperation + + s = "hillo world" + lls = llstr(s) + base_ofs = (llmemory.offsetof(STR, 'chars') + + llmemory.itemoffsetof(STR.chars, 0)) + scale_factor = llmemory.sizeof(lltype.Char) + + def main(argv): + print int(llop.gc_load_indexed(rffi.SHORT, lls, int(argv[1]), + scale_factor, base_ofs)) + return 0 + t, cbuilder = self.compile(main) + data = cbuilder.cmdexec('1') + assert '105\n' + def test_raw_load_store_on_gc(self): X = lltype.GcStruct('X', ('foo', lltype.Signed)) prebuilt = lltype.malloc(X, immortal=True) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit