[pypy-commit] pypy cleanup-llgraph-backend: (fijal, arigo) progress

fijal noreply at buildbot.pypy.org
Wed Oct 17 10:50:19 CEST 2012


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: cleanup-llgraph-backend
Changeset: r58154:716b88c56d65
Date: 2012-10-17 10:50 +0200
http://bitbucket.org/pypy/pypy/changeset/716b88c56d65/

Log:	(fijal, arigo) progress

diff --git a/pypy/jit/backend/llgraph/runner.py b/pypy/jit/backend/llgraph/runner.py
--- a/pypy/jit/backend/llgraph/runner.py
+++ b/pypy/jit/backend/llgraph/runner.py
@@ -7,7 +7,7 @@
 from pypy.jit.metainterp.resoperation import rop
 
 from pypy.rpython.llinterp import LLInterpreter
-from pypy.rpython.lltypesystem import lltype, llmemory, rclass
+from pypy.rpython.lltypesystem import lltype, llmemory, rclass, rstr
 
 from pypy.rlib.rarithmetic import ovfcheck
 
@@ -52,6 +52,12 @@
     def is_array_of_pointers(self):
         return getkind(self.A.OF) == 'ref'
 
+class InteriorFieldDescr(AbstractDescr):
+    def __init__(self, A, fieldname):
+        self.A = A
+        self.fieldname = fieldname
+        self.FIELD = getattr(A.OF, fieldname)
+
 class LLGraphCPU(model.AbstractCPU):
     def __init__(self, rtyper):
         self.rtyper = rtyper
@@ -131,6 +137,15 @@
             self.descrs[key] = descr
             return descr
 
+    def interiorfielddescrof(self, A, fieldname):
+        key = ('interiorfield', A, fieldname)
+        try:
+            return self.descrs[key]
+        except KeyError:
+            descr = InteriorFieldDescr(A, fieldname)
+            self.descrs[key] = descr
+            return descr        
+
     def _calldescr_dynamic_for_tests(self, atypes, rtype,
                                      abiname='FFI_DEFAULT_ABI'):
         # XXX WTF is that and why it breaks all abstractions?
@@ -170,12 +185,36 @@
         res = func(*args)
         return support.cast_result(RESULT, res)
 
-    def do_call(self, func, calldescr, args_i, args_r, args_f):
+    def _do_call(self, func, calldescr, args_i, args_r, args_f):
         TP = llmemory.cast_int_to_adr(func).ptr._obj._TYPE
         args = support.cast_call_args(TP.ARGS, args_i, args_r, args_f)
         return self.call(func, calldescr, args)
 
-    bh_call_i = do_call
+    bh_call_i = _do_call
+
+    def do_getinteriorfield_gc(self, a, index, descr):
+        array = a._obj.container
+        return support.cast_result(descr.FIELD,
+                          getattr(array.getitem(index), descr.fieldname))
+
+    bh_getinteriorfield_gc_f = do_getinteriorfield_gc
+    bh_getinteriorfield_gc_i = do_getinteriorfield_gc
+    bh_getinteriorfield_gc_r = do_getinteriorfield_gc
+
+    def do_setinteriorfield_gc(self, a, index, item, descr):
+        array = a._obj.container
+        setattr(array.getitem(index), descr.fieldname,
+                support.cast_arg(descr.FIELD, item))
+
+    bh_setinteriorfield_gc_f = do_setinteriorfield_gc
+    bh_setinteriorfield_gc_r = do_setinteriorfield_gc
+    bh_setinteriorfield_gc_i = do_setinteriorfield_gc
+
+    def do_newunicode(self, length):
+        return lltype.cast_opaque_ptr(llmemory.GCREF,
+                                      lltype.malloc(rstr.UNICODE, length))
+
+    bh_newunicode = do_newunicode
 
 class LLFrame(object):
     def __init__(self, cpu, argboxes, args):
@@ -351,6 +390,29 @@
         array = a._obj.container
         return support.cast_result(descr.A.OF, array.getitem(index))
 
+    def execute_strlen(self, descr, s):
+        return s._obj.container.chars.getlength()
+
+    def execute_strgetitem(self, descr, s, item):
+        return ord(s._obj.container.chars.getitem(item))
+
+    def execute_strsetitem(self, descr, s, item, v):
+        s._obj.container.chars.setitem(item, chr(v))
+
+    def execute_copystrcontent(self, _, src, dst, srcstart, dststart, length):
+        src = lltype.cast_opaque_ptr(lltype.Ptr(rstr.STR), src)
+        dst = lltype.cast_opaque_ptr(lltype.Ptr(rstr.STR), dst)
+        assert 0 <= srcstart <= srcstart + length <= len(src.chars)
+        assert 0 <= dststart <= dststart + length <= len(dst.chars)
+        rstr.copy_string_contents(src, dst, srcstart, dststart, length)
+
+    def execute_copyunicodecontent(self, _, src, dst, srcstart, dststart, length):
+        src = lltype.cast_opaque_ptr(lltype.Ptr(rstr.UNICODE), src)
+        dst = lltype.cast_opaque_ptr(lltype.Ptr(rstr.UNICODE), dst)
+        assert 0 <= srcstart <= srcstart + length <= len(src.chars)
+        assert 0 <= dststart <= dststart + length <= len(dst.chars)
+        rstr.copy_unicode_contents(src, dst, srcstart, dststart, length)
+
 def _setup():
     def _make_impl_from_blackhole_interp(opname):
         from pypy.jit.metainterp.blackhole import BlackholeInterpreter
@@ -370,11 +432,20 @@
         _op_default_implementation.func_name = 'execute_' + opname
         return _op_default_implementation
 
+    def _new_execute(opname):
+        def execute(self, descr, *args):
+            new_args = args + (descr,)
+            return getattr(self.cpu, 'do_' + opname)(*new_args)
+        execute.func_name = 'execute_' + opname
+        return execute
+
     for k, v in rop.__dict__.iteritems():
         if not k.startswith("_"):
             func = _make_impl_from_blackhole_interp(k)
             fname = 'execute_' + k.lower()
             if func is not None and not hasattr(LLFrame, fname):
                 setattr(LLFrame, fname, func)
+            elif hasattr(LLGraphCPU, 'do_' + k.lower()):
+                setattr(LLFrame, fname, _new_execute(k.lower()))
 
 _setup()
diff --git a/pypy/jit/backend/test/runner_test.py b/pypy/jit/backend/test/runner_test.py
--- a/pypy/jit/backend/test/runner_test.py
+++ b/pypy/jit/backend/test/runner_test.py
@@ -1002,7 +1002,7 @@
                                'void', descr=kdescr)
         f = self.cpu.bh_getinteriorfield_gc_f(a_box.getref_base(), 3, kdescr)
         assert longlong.getrealfloat(f) == 1.5
-        self.cpu.bh_setinteriorfield_gc_f(a_box.getref_base(), 3, kdescr, longlong.getfloatstorage(2.5))
+        self.cpu.bh_setinteriorfield_gc_f(a_box.getref_base(), 3, longlong.getfloatstorage(2.5), kdescr)
         r = self.execute_operation(rop.GETINTERIORFIELD_GC, [a_box, BoxInt(3)],
                                    'float', descr=kdescr)
         assert r.getfloat() == 2.5
@@ -1028,7 +1028,7 @@
         for name, TYPE in NUMBER_FIELDS[::-1]:
             vdescr = self.cpu.interiorfielddescrof(A, name)
             self.cpu.bh_setinteriorfield_gc_i(a_box.getref_base(), 3,
-                                              vdescr, -25)
+                                              -25, vdescr)
         for name, TYPE in NUMBER_FIELDS:
             vdescr = self.cpu.interiorfielddescrof(A, name)
             r = self.execute_operation(rop.GETINTERIORFIELD_GC,
@@ -1041,8 +1041,8 @@
                                'void', descr=pdescr)
         r = self.cpu.bh_getinteriorfield_gc_r(a_box.getref_base(), 4, pdescr)
         assert r == s_box.getref_base()
-        self.cpu.bh_setinteriorfield_gc_r(a_box.getref_base(), 3, pdescr,
-                                          s_box.getref_base())
+        self.cpu.bh_setinteriorfield_gc_r(a_box.getref_base(), 3,
+                                          s_box.getref_base(), pdescr)
         r = self.execute_operation(rop.GETINTERIORFIELD_GC, [a_box, BoxInt(3)],
                                    'ref', descr=pdescr)
         assert r.getref_base() == s_box.getref_base()
diff --git a/pypy/jit/metainterp/blackhole.py b/pypy/jit/metainterp/blackhole.py
--- a/pypy/jit/metainterp/blackhole.py
+++ b/pypy/jit/metainterp/blackhole.py
@@ -1208,13 +1208,13 @@
 
     @arguments("cpu", "r", "i", "i", "d")
     def bhimpl_setinteriorfield_gc_i(cpu, array, index, value, descr):
-        cpu.bh_setinteriorfield_gc_i(array, index, descr, value)
+        cpu.bh_setinteriorfield_gc_i(array, index, value, descr)
     @arguments("cpu", "r", "i", "r", "d")
     def bhimpl_setinteriorfield_gc_r(cpu, array, index, value, descr):
-        cpu.bh_setinteriorfield_gc_r(array, index, descr, value)
+        cpu.bh_setinteriorfield_gc_r(array, index, value, descr)
     @arguments("cpu", "r", "i", "f", "d")
     def bhimpl_setinteriorfield_gc_f(cpu, array, index, value, descr):
-        cpu.bh_setinteriorfield_gc_f(array, index, descr, value)
+        cpu.bh_setinteriorfield_gc_f(array, index, value, descr)
 
     @arguments("cpu", "r", "d", returns="i")
     def bhimpl_getfield_gc_i(cpu, struct, fielddescr):


More information about the pypy-commit mailing list