[pypy-svn] r62135 - in pypy/branch/pyjitpl5/pypy/jit: backend/llgraph metainterp metainterp/test

arigo at codespeak.net arigo at codespeak.net
Wed Feb 25 13:09:41 CET 2009


Author: arigo
Date: Wed Feb 25 13:09:39 2009
New Revision: 62135

Modified:
   pypy/branch/pyjitpl5/pypy/jit/backend/llgraph/llimpl.py
   pypy/branch/pyjitpl5/pypy/jit/backend/llgraph/runner.py
   pypy/branch/pyjitpl5/pypy/jit/metainterp/history.py
   pypy/branch/pyjitpl5/pypy/jit/metainterp/pyjitpl.py
   pypy/branch/pyjitpl5/pypy/jit/metainterp/specnode.py
   pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_send.py
   pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_zrpy_basic.py
   pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_zrpy_send.py
   pypy/branch/pyjitpl5/pypy/jit/metainterp/virtualizable.py
   pypy/branch/pyjitpl5/pypy/jit/metainterp/warmspot.py
Log:
RPythonification.  All tests pass, apart from
test_zrpy_virtualizable.


Modified: pypy/branch/pyjitpl5/pypy/jit/backend/llgraph/llimpl.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/backend/llgraph/llimpl.py	(original)
+++ pypy/branch/pyjitpl5/pypy/jit/backend/llgraph/llimpl.py	Wed Feb 25 13:09:39 2009
@@ -141,7 +141,7 @@
     else:
         return repr(x)
 
-def repr_list(lst, types, cpu):
+def repr_list(lst, types, memocast):
     res_l = []
     if types and types[-1] == 'varargs':
         types = types[:-1] + ('int',) * (len(lst) - len(types) + 1)
@@ -152,12 +152,12 @@
         else:
             extraarg = None
         if isinstance(elem, Constant):
-            res_l.append('(%s)' % repr1(elem, tp, cpu, extraarg))
+            res_l.append('(%s)' % repr1(elem, tp, memocast, extraarg))
         else:
-            res_l.append(repr1(elem, tp, cpu, extraarg))
+            res_l.append(repr1(elem, tp, memocast, extraarg))
     return '[%s]' % (', '.join(res_l))
 
-def repr1(x, tp, cpu, extraarg):
+def repr1(x, tp, memocast, extraarg):
     if tp == "intorptr":
         if extraarg % 2:
             tp = "ptr"
@@ -172,7 +172,7 @@
             return '(* None)'
         if isinstance(x, int):
             # XXX normalize?
-            ptr = str(cpu.cast_int_to_adr(x))
+            ptr = str(cast_int_to_adr(memocast, x))
         else:
             if getattr(x, '_fake', None):
                 return repr(x)
@@ -270,9 +270,9 @@
     op.jump_target_index = loop_target_index
     if op.opname == 'jump':
         if loop_target == loop and loop_target_index == 0:
-            log.trace("compiling new loop")
+            log.info("compiling new loop")
         else:
-            log.trace("compiling new bridge")
+            log.info("compiling new bridge")
 
 def compile_add_failnum(loop, failnum):
     loop = _from_opaque(loop)
@@ -296,16 +296,15 @@
 
 class Frame(object):
 
-    def __init__(self, cpu):
-        assert cpu
+    def __init__(self, memocast):
         llinterp = LLInterpreter(_rtyper)    # '_rtyper' set by CPU
         llinterp.traceback_frames = []
         self.llframe = ExtendedLLFrame(None, None, llinterp)
-        self.llframe.cpu = cpu
+        self.llframe.memocast = memocast
         self.llframe.last_exception = None
         self.llframe.last_exception_handled = True
-        self.verbose = False # cpu is not None
-        self.cpu = cpu
+        self.verbose = False
+        self.memocast = memocast
 
     def getenv(self, v):
         if isinstance(v, Constant):
@@ -402,10 +401,10 @@
                     extraarg = values[1]
                 else:
                     extraarg = None
-                resdata = '-> ' + repr1(res, restype, self.cpu, extraarg)
+                resdata = '-> ' + repr1(res, restype, self.memocast, extraarg)
             # fish the types
             log.cpu('\t%s %s %s' % (opname, repr_list(values, argtypes,
-                                                      self.cpu), resdata))
+                                                      self.memocast), resdata))
         if res is None:
             return []
         elif isinstance(res, list):
@@ -417,9 +416,9 @@
         TP = lltype.typeOf(x)
         if isinstance(TP, lltype.Ptr):
             assert TP.TO._gckind == 'raw'
-            return self.cpu.cast_adr_to_int(llmemory.cast_ptr_to_adr(x))
+            return cast_adr_to_int(self.memocast, llmemory.cast_ptr_to_adr(x))
         if TP == llmemory.Address:
-            return self.cpu.cast_adr_to_int(x)
+            return cast_adr_to_int(self.memocast, x)
         return lltype.cast_primitive(lltype.Signed, x)
     
     def as_ptr(self, x):
@@ -434,8 +433,8 @@
         log.trace('ran %d operations, %d jumps' % (count, count_jumps))
 
 
-def new_frame(cpu):
-    frame = Frame(cpu)
+def new_frame(memocast):
+    frame = Frame(memocast)
     return _to_opaque(frame)
 
 def frame_clear(frame, loop, opindex):
@@ -581,13 +580,13 @@
 
     def op_guard_nonnull(self, ptr):
         if lltype.typeOf(ptr) != llmemory.GCREF:
-            ptr = self.cpu.cast_int_to_adr(ptr)
+            ptr = cast_int_to_adr(self.memocast, ptr)
         if not ptr:
             raise GuardFailed
 
     def op_guard_isnull(self, ptr):
         if lltype.typeOf(ptr) != llmemory.GCREF:
-            ptr = self.cpu.cast_int_to_adr(ptr)
+            ptr = cast_int_to_adr(self.memocast, ptr)
         if ptr:
             raise GuardFailed
 
@@ -621,7 +620,7 @@
     def op_guard_class(self, value, expected_class):
         value = lltype.cast_opaque_ptr(rclass.OBJECTPTR, value)
         expected_class = llmemory.cast_adr_to_ptr(
-            self.cpu.cast_int_to_adr(expected_class),
+            cast_int_to_adr(self.memocast, expected_class),
             rclass.CLASSTYPE)
         if value.typeptr != expected_class:
             raise GuardFailed
@@ -643,7 +642,7 @@
 
     def op_guard_exception(self, expected_exception):
         expected_exception = llmemory.cast_adr_to_ptr(
-            self.cpu.cast_int_to_adr(expected_exception),
+            cast_int_to_adr(self.memocast, expected_exception),
             rclass.CLASSTYPE)
         assert expected_exception
         if self.last_exception:
@@ -673,7 +672,7 @@
 
     def op_getfield_raw(self, intval, fielddesc):
         STRUCT, fieldname = symbolic.TokenToField[fielddesc/2]
-        ptr = llmemory.cast_adr_to_ptr(self.cpu.cast_int_to_adr(intval),
+        ptr = llmemory.cast_adr_to_ptr(cast_int_to_adr(self.memocast, intval),
                                        lltype.Ptr(STRUCT))
         return getattr(ptr, fieldname)
 
@@ -689,25 +688,25 @@
             if isinstance(FIELDTYPE, lltype.Ptr):
                 assert FIELDTYPE.TO._gckind == 'raw'
                 newvalue = llmemory.cast_adr_to_ptr(
-                    self.cpu.cast_int_to_adr(newvalue),
+                    cast_int_to_adr(self.memocast, newvalue),
                     FIELDTYPE)
             elif FIELDTYPE == llmemory.Address:
-                newvalue = self.cpu.cast_int_to_adr(newvalue)
+                newvalue = cast_int_to_adr(self.memocast, newvalue)
         setattr(ptr, fieldname, newvalue)
 
     def op_setfield_raw(self, intval, fielddesc, newvalue):
-        ptr = llmemory.cast_adr_to_ptr(self.cpu.cast_int_to_adr(intval),
+        ptr = llmemory.cast_adr_to_ptr(cast_int_to_adr(self.memocast, intval),
                                        lltype.Ptr(STRUCT))
         self.op_setfield_gc(ptr, fielddesc, newvalue)
 
     def op_ooisnull(self, ptr):
         if lltype.typeOf(ptr) != llmemory.GCREF:
-            ptr = self.cpu.cast_int_to_adr(ptr)
+            ptr = cast_int_to_adr(self.memocast, ptr)
         return not ptr
 
     def op_oononnull(self, ptr):
         if lltype.typeOf(ptr) != llmemory.GCREF:
-            ptr = self.cpu.cast_int_to_adr(ptr)
+            ptr = cast_int_to_adr(self.memocast, ptr)
         return bool(ptr)
 
     def op_oois(self, ptr1, ptr2):
@@ -745,7 +744,7 @@
         self.last_exception = None
 
     def do_call(self, f, *args):
-        ptr = self.cpu.cast_int_to_adr(f).ptr
+        ptr = cast_int_to_adr(self.memocast, f).ptr
         FUNC = lltype.typeOf(ptr).TO
         ARGS = FUNC.ARGS
         args = list(args)

Modified: pypy/branch/pyjitpl5/pypy/jit/backend/llgraph/runner.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/backend/llgraph/runner.py	(original)
+++ pypy/branch/pyjitpl5/pypy/jit/backend/llgraph/runner.py	Wed Feb 25 13:09:39 2009
@@ -22,7 +22,7 @@
         self.stats = stats or MiniStats()
         self.stats.exec_counters = {}
         self.stats.exec_jumps = 0
-        self.memo_cast = lltype.nullptr(llimpl.MEMOCAST.TO)
+        self.memo_cast = llimpl.new_memo_cast()
         llimpl._stats = self.stats
         llimpl._rtyper = self.rtyper
         if translate_support_code:
@@ -103,7 +103,7 @@
         follow the merge point.
         """
         assert result_type is None or isinstance(result_type, str)
-        frame = llimpl.new_frame(self)
+        frame = llimpl.new_frame(self.memo_cast)
         llimpl.frame_clear(frame, merge_point._compiled, merge_point._opindex)
         for box in valueboxes:
             if isinstance(box, history.BoxInt):
@@ -122,7 +122,7 @@
         if opname[0] == '#':
             return None
         c = self.get_compiled_single_op(opname, valueboxes, result_type)
-        frame = llimpl.new_frame(self)
+        frame = llimpl.new_frame(self.memo_cast)
         llimpl.frame_clear(frame, c, 0)
         for box in valueboxes:
             if box.type == 'int':
@@ -269,8 +269,6 @@
         return ofs_length
 
     def cast_adr_to_int(self, adr):
-        if not self.memo_cast:
-            self.memo_cast = llimpl.new_memo_cast()
         return llimpl.cast_adr_to_int(self.memo_cast, adr)
 
     def cast_int_to_adr(self, int):

Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/history.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/history.py	(original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/history.py	Wed Feb 25 13:09:39 2009
@@ -69,6 +69,7 @@
     __slots__ = ()
 
     def _new(x, cpu):
+        "NOT_RPYTHON"
         T = lltype.typeOf(x)
         kind = getkind(T)
         if kind == "int":
@@ -199,6 +200,7 @@
 
     @staticmethod
     def _new(x, cpu):
+        "NOT_RPYTHON"
         kind = getkind(lltype.typeOf(x))
         if kind == "int":
             intval = lltype.cast_primitive(lltype.Signed, x)
@@ -438,7 +440,7 @@
         if not canfold:
             self.record(step, argboxes, resboxes)
         return resboxes
-    execute_and_record._annspecialcase_ = 'specialize:arg(3, 4)'
+    execute_and_record._annspecialcase_ = 'specialize:arg(4)'
 
     def record(self, opname, argboxes, resboxes, opcls=ResOperation):
         # xxx the indirection from record to _record is to work

Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/pyjitpl.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/pyjitpl.py	(original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/pyjitpl.py	Wed Feb 25 13:09:39 2009
@@ -1,6 +1,7 @@
 import py
 from pypy.rpython.lltypesystem import lltype, llmemory, rclass
 from pypy.rpython.llinterp import LLException
+from pypy.rpython.annlowlevel import cast_instance_to_base_ptr
 from pypy.tool.sourcetools import func_with_new_name
 from pypy.rlib.objectmodel import we_are_translated, r_dict
 from pypy.rlib.unroll import unrolling_iterable
@@ -629,7 +630,7 @@
         if len(resboxes) == 1:
             resultbox = resboxes[0]
             self.make_result_box(resultbox)
-    execute._annspecialcase_ = 'specialize:arg(3, 4)'
+    execute._annspecialcase_ = 'specialize:arg(4)'
 
     def execute_with_exc(self, step, argboxes, result_type, pure=False):
         old_index = len(self.metainterp.history.operations)
@@ -641,7 +642,8 @@
                     raise
                 etype, evalue = e.args[:2]
             else:
-                XXX
+                evalue = cast_instance_to_base_ptr(e)
+                etype = evalue.typeptr
             if result_type == 'void':
                 resultboxes = []
             else:
@@ -662,7 +664,7 @@
             llmemory.cast_ptr_to_adr(etype))
         value_as_gcref = lltype.cast_opaque_ptr(llmemory.GCREF, evalue)
         return self.metainterp.handle_exception(type_as_int, value_as_gcref)
-    execute_with_exc._annspecialcase_ = 'specialize:arg(3, 4)'
+    execute_with_exc._annspecialcase_ = 'specialize:arg(4)'
 
 # ____________________________________________________________
 
@@ -759,8 +761,8 @@
             else:
                 debug_print('LEAVE')
 
-    def compile_and_run(self, args):
-        orig_boxes = self.initialize_state_from_start(args)
+    def compile_and_run(self, *args):
+        orig_boxes = self.initialize_state_from_start(*args)
         try:
             self.interpret()
             assert False, "should always raise"
@@ -843,17 +845,30 @@
             specnode.extract_runtime_data(self.cpu, args[i], expanded_args)
         return expanded_args
 
-    def initialize_state_from_start(self, args):
+    def _initialize_from_start(self, original_boxes, num_green_args, *args):
+        if args:
+            value = args[0]
+            if isinstance(lltype.typeOf(value), lltype.Ptr):
+                value = lltype.cast_opaque_ptr(llmemory.GCREF, value)
+                if num_green_args > 0:
+                    cls = ConstPtr
+                else:
+                    cls = BoxPtr
+            else:
+                if num_green_args > 0:
+                    cls = ConstInt
+                else:
+                    cls = BoxInt
+            box = cls(value)
+            original_boxes.append(box)
+            self._initialize_from_start(original_boxes, num_green_args-1,
+                                        *args[1:])
+
+    def initialize_state_from_start(self, *args):
         self.create_empty_history()
         num_green_args = self.num_green_args
         original_boxes = []
-        for i in range(len(args)):
-            value = args[i]
-            if i < num_green_args:
-                box = Const._new(value, self.cpu)
-            else:
-                box = Box._new(value, self.cpu)
-            original_boxes.append(box)
+        self._initialize_from_start(original_boxes, num_green_args, *args)
         # ----- make a new frame -----
         self.framestack = []
         f = self.newframe(self.portal_code)
@@ -867,7 +882,6 @@
             self.history = history.History(self.cpu)
         else:
             self.history = history.BlackHole(self.cpu)
-        self.guard_failure = guard_failure
         guard_op = guard_failure.guard_op
         boxes_from_frame = []
         index = 0

Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/specnode.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/specnode.py	(original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/specnode.py	Wed Feb 25 13:09:39 2009
@@ -10,7 +10,16 @@
         resultlist.append(valuebox)
 
     def adapt_to(self, instnode):
-        instnode.escaped = True    
+        instnode.escaped = True
+
+    def mutate_nodes(self, instnode):
+        raise NotImplementedError
+
+    def equals(self, other):
+        raise NotImplementedError
+
+    def matches(self, other):
+        raise NotImplementedError
 
 class NotSpecNode(SpecNode):
     def mutate_nodes(self, instnode):

Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_send.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_send.py	(original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_send.py	Wed Feb 25 13:09:39 2009
@@ -161,8 +161,9 @@
                 w.foo()
                 y -= 1
             return 42
+        policy = StopAtXPolicy(externfn)
         for j in range(69, 75):
-            res = self.meta_interp(f, [j], policy=StopAtXPolicy(externfn))
+            res = self.meta_interp(f, [j], policy=policy)
             assert res == 42
             self.check_loop_count(3)
 

Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_zrpy_basic.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_zrpy_basic.py	(original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_zrpy_basic.py	Wed Feb 25 13:09:39 2009
@@ -21,9 +21,12 @@
         assert res == 490
 
     def test_loop_2(self):
+        jitdriver = JitDriver(greens = [], reds = ['i', 'total'])
         def f(i):
             total = 0
             while i > 3:
+                jitdriver.can_enter_jit(i=i, total=total)
+                jitdriver.jit_merge_point(i=i, total=total)
                 total += i
                 if i >= 10:
                     i -= 2

Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_zrpy_send.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_zrpy_send.py	(original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_zrpy_send.py	Wed Feb 25 13:09:39 2009
@@ -4,8 +4,4 @@
 
 
 class TestLLSend(test_send.SendTests, LLInterpJitMixin):
-    def test_oosend_guard_failure(self):
-        py.test.skip("Fails with assertion error")
-
-    def test_oosend_guard_failure_2(self):
-        py.test.skip("Fails with assertion error")
+    pass

Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/virtualizable.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/virtualizable.py	(original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/virtualizable.py	Wed Feb 25 13:09:39 2009
@@ -1,7 +1,9 @@
 
 from pypy.jit.metainterp import history
 from pypy.rpython.lltypesystem import lltype, llmemory
-from pypy.rpython.annlowlevel import llhelper
+from pypy.rpython.annlowlevel import llhelper, cast_base_ptr_to_instance
+from pypy.annotation.model import lltype_to_annotation
+from pypy.rlib.objectmodel import we_are_translated
 
 class VirtualizableDesc(history.AbstractValue):
     hash = 0

Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/warmspot.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/warmspot.py	(original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/warmspot.py	Wed Feb 25 13:09:39 2009
@@ -27,12 +27,13 @@
     warmrunnerdesc = WarmRunnerDesc(translator, **kwds)
     warmrunnerdesc.state.set_param_threshold(3)          # for tests
     warmrunnerdesc.state.set_param_trace_eagerness(2)    # for tests
+    warmrunnerdesc.finish()
     return interp.eval_graph(graph, args)
 
-def rpython_ll_meta_interp(function, args, loops='not used right now', **kwds):
-    return ll_meta_interp(function, args,
-                          translate_support_code=True, backendopt=True,
-                          **kwds)
+def rpython_ll_meta_interp(function, args, backendopt=True,
+                           loops='not used right now', **kwds):
+    return ll_meta_interp(function, args, backendopt=backendopt,
+                          translate_support_code=True, **kwds)
 
 def find_can_enter_jit(graphs):
     results = []
@@ -86,6 +87,8 @@
         self.rewrite_jit_merge_point()
         self.metainterp.num_green_args = self.num_green_args
         self.metainterp.state = self.state
+
+    def finish(self):
         if self.cpu.translate_support_code:
             self.annhelper.finish()
 
@@ -461,7 +464,7 @@
         getkeyhash._always_inline_ = True
 
         def compile_and_run(self, argshash, *args):
-            loop, boxes = warmrunnerdesc.metainterp.compile_and_run(list(args))
+            loop, boxes = warmrunnerdesc.metainterp.compile_and_run(*args)
             if loop:
                 cpu = warmrunnerdesc.metainterp.cpu
                 mp = loop.operations[0]



More information about the Pypy-commit mailing list