[pypy-svn] r64111 - in pypy/branch/pyjitpl5-simplify/pypy/jit: backend backend/llgraph backend/minimal backend/test backend/x86 metainterp metainterp/test

antocuni at codespeak.net antocuni at codespeak.net
Wed Apr 15 18:53:05 CEST 2009


Author: antocuni
Date: Wed Apr 15 18:53:04 2009
New Revision: 64111

Modified:
   pypy/branch/pyjitpl5-simplify/pypy/jit/backend/llgraph/runner.py
   pypy/branch/pyjitpl5-simplify/pypy/jit/backend/minimal/runner.py
   pypy/branch/pyjitpl5-simplify/pypy/jit/backend/model.py
   pypy/branch/pyjitpl5-simplify/pypy/jit/backend/test/runner.py
   pypy/branch/pyjitpl5-simplify/pypy/jit/backend/x86/runner.py
   pypy/branch/pyjitpl5-simplify/pypy/jit/metainterp/codewriter.py
   pypy/branch/pyjitpl5-simplify/pypy/jit/metainterp/pyjitpl.py
   pypy/branch/pyjitpl5-simplify/pypy/jit/metainterp/resoperation.py
   pypy/branch/pyjitpl5-simplify/pypy/jit/metainterp/test/test_basic.py
   pypy/branch/pyjitpl5-simplify/pypy/jit/metainterp/warmspot.py
Log:
the result of my travel to leysin:

- specialize oostring and oounicode based on the type of their first arg; as a
  result, a bunch of tests now pass

- implement calls to static methods: test_residual_call now passes

- really use ootypesystem when calling meta_interp; a bunch of tests now fail
  and are skipped



Modified: pypy/branch/pyjitpl5-simplify/pypy/jit/backend/llgraph/runner.py
==============================================================================
--- pypy/branch/pyjitpl5-simplify/pypy/jit/backend/llgraph/runner.py	(original)
+++ pypy/branch/pyjitpl5-simplify/pypy/jit/backend/llgraph/runner.py	Wed Apr 15 18:53:04 2009
@@ -228,12 +228,6 @@
         token = history.getkind(A.OF)
         return Descr(size, token[0])
 
-    @staticmethod
-    def calldescrof(ARGS, RESULT):
-        token = history.getkind(RESULT)
-        return Descr(0, token[0])
-
-
     def cast_adr_to_int(self, adr):
         return llimpl.cast_adr_to_int(self.memo_cast, adr)
 
@@ -244,6 +238,11 @@
 
 class LLtypeCPU(BaseCPU):
 
+    @staticmethod
+    def calldescrof(FUNC, ARGS, RESULT):
+        token = history.getkind(RESULT)
+        return Descr(0, token[0])
+
     # ---------- the backend-dependent operations ----------
 
     def do_arraylen_gc(self, args, arraydescr):
@@ -389,9 +388,25 @@
 class OOtypeCPU(BaseCPU):
 
     @staticmethod
+    def calldescrof(FUNC, ARGS, RESULT):
+        return StaticMethDescr(FUNC, ARGS, RESULT)
+
+    @staticmethod
     def methdescrof(METH, methname):
         return MethDescr(METH, methname)
 
+    @staticmethod
+    def typedescrof(TYPE):
+        return TypeDescr(TYPE)
+
+    def do_call(self, args, descr):
+        assert isinstance(descr, StaticMethDescr)
+        funcbox = args[0]
+        argboxes = args[1:]
+        x = descr.callfunc(funcbox, argboxes)
+        # XXX: return None if RESULT is Void
+        return x
+
     def do_oosend(self, args, descr=None):
         assert isinstance(descr, MethDescr)
         selfbox = args[0]
@@ -400,48 +415,73 @@
         # XXX: return None if METH.RESULT is Void
         return x
 
-    def do_oostring(self, args, descr=None):
-        obj = args[0].getint() # XXX what about other types?
+    def do_oostring_char(self, args, descr=None):
+        char = chr(args[0].getint())
         base = args[1].getint()
-        res = ootype.cast_to_object(ootype.oostring(obj, base))
+        res = ootype.cast_to_object(ootype.oostring(char, base))
         return history.ConstObj(res)
 
-    def do_oounicode(self, args, descr=None):
-        obj = args[0].getint() # XXX what about other types?
+    def do_oounicode_unichar(self, args, descr=None):
+        unichar = unichr(args[0].getint())
         base = args[1].getint()
-        res = ootype.cast_to_object(ootype.oounicode(obj, base))
+        res = ootype.cast_to_object(ootype.oounicode(unichar, base))
         return history.ConstObj(res)
 
 
+def make_getargs_boxres(ARGS, RESULT):
+    argsiter = unrolling_iterable(ARGS)
+    args_n = len(ARGS)
+    def getargs(argboxes):
+        funcargs = ()
+        assert len(argboxes) == args_n
+        i = 0
+        for ARG in argsiter:
+            box = argboxes[i]
+            i+=1
+            if isinstance(ARG, ootype.OOType):
+                arg = ootype.cast_from_object(ARG, box.getobj())
+            else:
+                arg = box.getint()
+            funcargs += (arg,)
+        return funcargs
+
+    def boxresult(result):
+        if isinstance(RESULT, ootype.OOType):
+            return history.BoxObj(ootype.cast_to_object(result))
+        else:
+            return history.BoxInt(lltype.cast_primitive(ootype.Signed, result))
+
+    return getargs, boxresult
+
+class StaticMethDescr(history.AbstractDescr):
+
+    def __init__(self, FUNC, ARGS, RESULT):
+        getargs, boxresult = make_getargs_boxres(ARGS, RESULT)
+        def callfunc(funcbox, argboxes):
+            funcobj = ootype.cast_from_object(FUNC, funcbox.getobj())
+            funcargs = getargs(argboxes)
+            res = funcobj(*funcargs)
+            return boxresult(res)
+        self.callfunc = callfunc
+
 class MethDescr(history.AbstractDescr):
 
     def __init__(self, METH, methname):
         SELFTYPE = METH.SELFTYPE
-        RESULT = METH.RESULT
-        argsiter = unrolling_iterable(METH.ARGS)
-        args_n = len(METH.ARGS)
+        getargs, boxresult = make_getargs_boxres(METH.ARGS, METH.RESULT)
         def callmeth(selfbox, argboxes):
             selfobj = ootype.cast_from_object(SELFTYPE, selfbox.getobj())
-            methargs = ()
-            assert len(argboxes) == args_n
-            i = 0
-            for ARG in argsiter:
-                box = argboxes[i]
-                i+=1
-                if isinstance(ARG, ootype.OOType):
-                    arg = ootype.cast_from_object(ARG, box.getobj())
-                else:
-                    arg = box.getint()
-                methargs += (arg,)
             meth = getattr(selfobj, methname)
-            result = meth(*methargs)
-            if isinstance(RESULT, ootype.OOType):
-                return history.BoxObj(ootype.cast_to_object(result))
-            else:
-                return history.BoxInt(lltype.cast_primitive(ootype.Signed, result))
-
+            methargs = getargs(argboxes)
+            res = meth(*methargs)
+            return boxresult(res)
         self.callmeth = callmeth
 
+class TypeDescr(history.AbstractDescr):
+
+    def __init__(self, TYPE):
+        self.TYPE = TYPE
+
 # ____________________________________________________________
 
 import pypy.jit.metainterp.executor

Modified: pypy/branch/pyjitpl5-simplify/pypy/jit/backend/minimal/runner.py
==============================================================================
--- pypy/branch/pyjitpl5-simplify/pypy/jit/backend/minimal/runner.py	(original)
+++ pypy/branch/pyjitpl5-simplify/pypy/jit/backend/minimal/runner.py	Wed Apr 15 18:53:04 2009
@@ -203,7 +203,7 @@
                           dict2['setarrayitem'])
 
     @cached_method('_callcache')
-    def calldescrof(self, ARGS, RESULT):
+    def calldescrof(self, FUNC, ARGS, RESULT):
         dict2 = base_dict.copy()
         args = []
         for i, ARG in enumerate(ARGS):

Modified: pypy/branch/pyjitpl5-simplify/pypy/jit/backend/model.py
==============================================================================
--- pypy/branch/pyjitpl5-simplify/pypy/jit/backend/model.py	(original)
+++ pypy/branch/pyjitpl5-simplify/pypy/jit/backend/model.py	Wed Apr 15 18:53:04 2009
@@ -39,7 +39,15 @@
         raise NotImplementedError
 
     @staticmethod
-    def calldescrof(ARGS, RESULT):
+    def calldescrof(FUNC, ARGS, RESULT):
+        raise NotImplementedError
+
+    @staticmethod
+    def methdescrof(METH, methname):
+        raise NotImplementedError
+
+    @staticmethod
+    def typedescrof(TYPE):
         raise NotImplementedError
 
     def cast_adr_to_int(self, adr):
@@ -122,8 +130,8 @@
     def do_oosend(cpu, args, descr=None):
         raise NotImplementedError
 
-    def do_oostring(cpu, args, descr=None):
+    def do_oostring_char(cpu, args, descr=None):
         raise NotImplementedError
 
-    def do_oounicode(cpu, args, descr=None):
+    def do_oounicode_unichar(cpu, args, descr=None):
         raise NotImplementedError

Modified: pypy/branch/pyjitpl5-simplify/pypy/jit/backend/test/runner.py
==============================================================================
--- pypy/branch/pyjitpl5-simplify/pypy/jit/backend/test/runner.py	(original)
+++ pypy/branch/pyjitpl5-simplify/pypy/jit/backend/test/runner.py	Wed Apr 15 18:53:04 2009
@@ -64,7 +64,7 @@
             return chr(ord(c) + 1)
         FPTR = lltype.Ptr(lltype.FuncType([lltype.Char], lltype.Char))
         func_ptr = llhelper(FPTR, func)
-        calldescr = cpu.calldescrof((lltype.Char,), lltype.Char)
+        calldescr = cpu.calldescrof(FPTR.TO, (lltype.Char,), lltype.Char)
         x = cpu.do_call(
             [BoxInt(cpu.cast_adr_to_int(llmemory.cast_ptr_to_adr(func_ptr))),
              BoxInt(ord('A'))],

Modified: pypy/branch/pyjitpl5-simplify/pypy/jit/backend/x86/runner.py
==============================================================================
--- pypy/branch/pyjitpl5-simplify/pypy/jit/backend/x86/runner.py	(original)
+++ pypy/branch/pyjitpl5-simplify/pypy/jit/backend/x86/runner.py	Wed Apr 15 18:53:04 2009
@@ -607,7 +607,7 @@
             counter += 1
         return counter, basesize, ptr
 
-    def calldescrof(self, argtypes, resulttype):
+    def calldescrof(self, functype, argtypes, resulttype):
         if resulttype is lltype.Void:
             size = 0
         else:

Modified: pypy/branch/pyjitpl5-simplify/pypy/jit/metainterp/codewriter.py
==============================================================================
--- pypy/branch/pyjitpl5-simplify/pypy/jit/metainterp/codewriter.py	(original)
+++ pypy/branch/pyjitpl5-simplify/pypy/jit/metainterp/codewriter.py	Wed Apr 15 18:53:04 2009
@@ -135,7 +135,7 @@
             return ()
         # </hack>
         NON_VOID_ARGS = [ARG for ARG in FUNC.ARGS if ARG is not lltype.Void]
-        calldescr = self.cpu.calldescrof(tuple(NON_VOID_ARGS), FUNC.RESULT)
+        calldescr = self.cpu.calldescrof(FUNC, tuple(NON_VOID_ARGS), FUNC.RESULT)
         return (cfnptr, calldescr)
 
     def get_indirectcallset(self, graphs):
@@ -157,7 +157,7 @@
         assert NON_VOID_ARGS == [T for T in ARGS if T is not lltype.Void]
         assert RESULT == FUNC.RESULT
         # ok
-        calldescr = self.cpu.calldescrof(tuple(NON_VOID_ARGS), RESULT)
+        calldescr = self.cpu.calldescrof(FUNC, tuple(NON_VOID_ARGS), RESULT)
         return calldescr, non_void_args
 
 
@@ -591,6 +591,11 @@
             self.emit(self.var_position(op.args[2]))
         self.register_var(op.result)
 
+##     def serialize_op_new(self, op):
+##         TYPE = op.args[0].value
+##         self.emit('new', self.get_position(self.cpu.typedescrof(TYPE)))
+##         self.register_var(op.result)
+
     def serialize_op_zero_gc_pointers_inside(self, op):
         pass   # XXX assume Boehm for now
 
@@ -964,6 +969,13 @@
             self.emit(self.get_position(virtualizabledesc))
             self.emit(self.get_position(guard_field))
 
+    def serialize_op_oostring(self, op):
+        T = op.args[0].concretetype
+        opname = '%s_%s' % (op.opname, T._name.lower())
+        return self.default_serialize_op(op, opname)
+
+    serialize_op_oounicode = serialize_op_oostring
+
     # ----------
 
     def register_var(self, arg, verbose=True):

Modified: pypy/branch/pyjitpl5-simplify/pypy/jit/metainterp/pyjitpl.py
==============================================================================
--- pypy/branch/pyjitpl5-simplify/pypy/jit/metainterp/pyjitpl.py	(original)
+++ pypy/branch/pyjitpl5-simplify/pypy/jit/metainterp/pyjitpl.py	Wed Apr 15 18:53:04 2009
@@ -537,12 +537,12 @@
         self.execute(rop.OOSEND_PURE, boxes, descr=methdescr)
 
     @arguments("box", "box")
-    def opimpl_oostring(self, obj, base):
-        self.execute(rop.OOSTRING, [obj, base])
+    def opimpl_oostring_char(self, obj, base):
+        self.execute(rop.OOSTRING_CHAR, [obj, base])
 
     @arguments("box", "box")
-    def opimpl_oounicode(self, obj, base):
-        self.execute(rop.OOUNICODE, [obj, base])
+    def opimpl_oounicode_unichar(self, obj, base):
+        self.execute(rop.OOUNICODE_UNICHAR, [obj, base])
 
     @arguments("orgpc", "box", returns="box")
     def opimpl_guard_value(self, pc, box):

Modified: pypy/branch/pyjitpl5-simplify/pypy/jit/metainterp/resoperation.py
==============================================================================
--- pypy/branch/pyjitpl5-simplify/pypy/jit/metainterp/resoperation.py	(original)
+++ pypy/branch/pyjitpl5-simplify/pypy/jit/metainterp/resoperation.py	Wed Apr 15 18:53:04 2009
@@ -159,8 +159,8 @@
     UNICODEGETITEM         = 84
     #
     # ootype operations
-    OOSTRING               = 85
-    OOUNICODE              = 86
+    OOSTRING_CHAR          = 85
+    OOUNICODE_UNICHAR      = 86
     OOSEND_PURE            = 87
     #
     _ALWAYS_PURE_LAST = 87  # ----- end of always_pure operations -----

Modified: pypy/branch/pyjitpl5-simplify/pypy/jit/metainterp/test/test_basic.py
==============================================================================
--- pypy/branch/pyjitpl5-simplify/pypy/jit/metainterp/test/test_basic.py	(original)
+++ pypy/branch/pyjitpl5-simplify/pypy/jit/metainterp/test/test_basic.py	Wed Apr 15 18:53:04 2009
@@ -50,6 +50,7 @@
 
     def meta_interp(self, *args, **kwds):
         kwds['CPUClass'] = self.CPUClass
+        kwds['type_system'] = self.type_system
         return ll_meta_interp(*args, **kwds)
 
     def interp_operations(self, f, args, policy=None, **kwds):
@@ -175,15 +176,12 @@
                 return "?"
         res = self.interp_operations(f, [1])
         assert res == ord("d") # XXX should be "d"
-        if self.type_system != 'ootype':
-            # this test fails on ootype, see test_chr2str
-            res = self.interp_operations(f, [6])
-            assert res == 6
+        res = self.interp_operations(f, [6])
+        assert res == 6
         res = self.interp_operations(f, [42])
         assert res == ord("?")
 
     def test_chr2str(self):
-        # the problem is that we call oostring(6) instead of oostring('\x06')
         def f(n):
             s = chr(n)
             return s[0]
@@ -516,15 +514,18 @@
     def skip(self):
         py.test.skip('in-progress')
 
-    test_chr2str = skip
-    test_unicode = skip # for the same reason as test_chr2str
-    test_residual_call = skip
     test_format = skip
     test_getfield = skip
     test_getfield_immutable = skip
     test_oops_on_nongc = skip
     test_instantiate_classes = skip
 
+    test_loop = skip
+    test_we_are_jitted = skip
+    test_r_uint = skip
+    test_mod_ovf = skip
+    test_bridge_from_interpreter = skip
+
     test_constant_across_mp = skip
     test_stopatxpolicy = skip
     test_print = skip

Modified: pypy/branch/pyjitpl5-simplify/pypy/jit/metainterp/warmspot.py
==============================================================================
--- pypy/branch/pyjitpl5-simplify/pypy/jit/metainterp/warmspot.py	(original)
+++ pypy/branch/pyjitpl5-simplify/pypy/jit/metainterp/warmspot.py	Wed Apr 15 18:53:04 2009
@@ -34,8 +34,10 @@
     warmrunnerdesc.finish()
     translator.warmrunnerdesc = warmrunnerdesc    # for later debugging
 
-def ll_meta_interp(function, args, backendopt=False, **kwds):
-    interp, graph = get_interpreter(function, args, backendopt=backendopt,
+def ll_meta_interp(function, args, backendopt=False, type_system='lltype', **kwds):
+    interp, graph = get_interpreter(function, args,
+                                    backendopt=backendopt,
+                                    type_system=type_system,
                                     inline_threshold=0)
     clear_tcache()
     return jittify_and_run(interp, graph, args, **kwds)



More information about the Pypy-commit mailing list