[pypy-commit] pypy array-overallocation-in-nursery: Start adapting the codewriter for the new rlist.py format

arigo noreply at buildbot.pypy.org
Mon Nov 4 18:10:51 CET 2013


Author: Armin Rigo <arigo at tunes.org>
Branch: array-overallocation-in-nursery
Changeset: r67831:dc207f7dffcb
Date: 2013-11-04 18:10 +0100
http://bitbucket.org/pypy/pypy/changeset/dc207f7dffcb/

Log:	Start adapting the codewriter for the new rlist.py format

diff --git a/rpython/jit/codewriter/jtransform.py b/rpython/jit/codewriter/jtransform.py
--- a/rpython/jit/codewriter/jtransform.py
+++ b/rpython/jit/codewriter/jtransform.py
@@ -1449,7 +1449,6 @@
                 descrs = ()
             else:
                 descrs = (self.cpu.arraydescrof(ARRAY),
-                          self.cpu.fielddescrof(LIST, 'length'),
                           self.cpu.fielddescrof(LIST, 'items'),
                           self.cpu.sizeof(LIST))
         else:
@@ -1487,7 +1486,7 @@
         fast = '_fast' in func.func_name
         return non_negative or fast
 
-    def _prepare_list_getset(self, op, descr, args, checkname):
+    def _prepare_list_getset(self, op, args, checkname, *descrs):
         non_negative = self._get_list_nonneg_canraise_flags(op)
         if non_negative:
             return args[1], []
@@ -1495,8 +1494,8 @@
             v_posindex = Variable('posindex')
             v_posindex.concretetype = lltype.Signed
             op0 = SpaceOperation('-live-', [], None)
-            op1 = SpaceOperation(checkname, [args[0], args[1],
-                                             descr], v_posindex)
+            op1 = SpaceOperation(checkname, [args[0], args[1]] + list(descrs),
+                                 v_posindex)
             return v_posindex, [op0, op1]
 
     def _prepare_void_list_getset(self, op):
@@ -1555,8 +1554,9 @@
                     SpaceOperation('getarrayitem_vable_%s' % kind[0],
                                    [v_base, args[1], arrayfielddescr,
                                     arraydescr], op.result)]
-        v_index, extraop = self._prepare_list_getset(op, arraydescr, args,
-                                                     'check_neg_index')
+        v_index, extraop = self._prepare_list_getset(op, args,
+                                                     'check_neg_index',
+                                                     arraydescr)
         extra = getkind(op.result.concretetype)[0]
         if pure:
             extra += '_pure'
@@ -1576,8 +1576,9 @@
                     SpaceOperation('setarrayitem_vable_%s' % kind[0],
                                    [v_base, args[1], args[2],
                                     arrayfielddescr, arraydescr], None)]
-        v_index, extraop = self._prepare_list_getset(op, arraydescr, args,
-                                                     'check_neg_index')
+        v_index, extraop = self._prepare_list_getset(op, args,
+                                                     'check_neg_index',
+                                                     arraydescr)
         kind = getkind(args[2].concretetype)[0]
         op = SpaceOperation('setarrayitem_gc_%s' % kind,
                             [args[0], v_index, args[2], arraydescr], None)
@@ -1594,46 +1595,47 @@
 
     # ---------- resizable lists ----------
 
-    def do_resizable_newlist(self, op, args, arraydescr, lengthdescr,
+    def do_resizable_newlist(self, op, args, arraydescr,
                              itemsdescr, structdescr):
         v_length = self._get_initial_newlist_length(op, args)
         return SpaceOperation('newlist',
-                              [v_length, structdescr, lengthdescr, itemsdescr,
+                              [v_length, structdescr, itemsdescr, arraydescr],
+                              op.result)
+
+    def do_resizable_newlist_hint(self, op, args, arraydescr,
+                                  itemsdescr, structdescr):
+        v_hint = self._get_initial_newlist_length(op, args)
+        return SpaceOperation('newlist_hint',
+                              [v_hint, structdescr, itemsdescr,
                                arraydescr],
                               op.result)
 
-    def do_resizable_newlist_hint(self, op, args, arraydescr, lengthdescr,
+    def do_resizable_list_getitem(self, op, args, arraydescr,
                                   itemsdescr, structdescr):
-        v_hint = self._get_initial_newlist_length(op, args)
-        return SpaceOperation('newlist_hint',
-                              [v_hint, structdescr, lengthdescr, itemsdescr,
-                               arraydescr],
-                              op.result)
-
-    def do_resizable_list_getitem(self, op, args, arraydescr, lengthdescr,
-                                  itemsdescr, structdescr):
-        v_index, extraop = self._prepare_list_getset(op, lengthdescr, args,
-                                                 'check_resizable_neg_index')
+        v_index, extraop = self._prepare_list_getset(op, args,
+                                                 'check_resizable_neg_index',
+                                                     itemsdescr, arraydescr)
         kind = getkind(op.result.concretetype)[0]
         op = SpaceOperation('getlistitem_gc_%s' % kind,
                             [args[0], v_index, itemsdescr, arraydescr],
                             op.result)
         return extraop + [op]
 
-    def do_resizable_list_setitem(self, op, args, arraydescr, lengthdescr,
+    def do_resizable_list_setitem(self, op, args, arraydescr,
                                   itemsdescr, structdescr):
-        v_index, extraop = self._prepare_list_getset(op, lengthdescr, args,
-                                                 'check_resizable_neg_index')
+        v_index, extraop = self._prepare_list_getset(op, args,
+                                                 'check_resizable_neg_index',
+                                                     itemsdescr, arraydescr)
         kind = getkind(args[2].concretetype)[0]
         op = SpaceOperation('setlistitem_gc_%s' % kind,
                             [args[0], v_index, args[2],
                              itemsdescr, arraydescr], None)
         return extraop + [op]
 
-    def do_resizable_list_len(self, op, args, arraydescr, lengthdescr,
+    def do_resizable_list_len(self, op, args, arraydescr,
                               itemsdescr, structdescr):
-        return SpaceOperation('getfield_gc_i',
-                              [args[0], lengthdescr], op.result)
+        return SpaceOperation('getlistlen',
+                              [args[0], itemsdescr, arraydescr], op.result)
 
     def do_resizable_void_list_getitem(self, op, args):
         self._prepare_void_list_getset(op)
diff --git a/rpython/jit/codewriter/test/test_list.py b/rpython/jit/codewriter/test/test_list.py
--- a/rpython/jit/codewriter/test/test_list.py
+++ b/rpython/jit/codewriter/test/test_list.py
@@ -11,9 +11,10 @@
 # ____________________________________________________________
 
 FIXEDLIST = lltype.Ptr(lltype.GcArray(lltype.Signed))
+OVERLIST = lltype.Ptr(lltype.GcArray(lltype.Signed,
+                                     hints={'overallocated': True}))
 VARLIST = lltype.Ptr(lltype.GcStruct('VARLIST',
-                                     ('length', lltype.Signed),
-                                     ('items', FIXEDLIST),
+                                     ('items', OVERLIST),
                                      adtmeths={"ITEM": lltype.Signed}))
 
 class FakeCPU:
@@ -25,6 +26,7 @@
             return '<ArrayDescr>'
     class fielddescrof(AbstractDescr):
         def __init__(self, STRUCT, fieldname):
+            assert hasattr(STRUCT, fieldname)
             self.STRUCT = STRUCT
             self.fieldname = fieldname
         def __repr__(self):
@@ -167,8 +169,7 @@
 # Resizable lists
 
 def test_resizable_newlist():
-    alldescrs = ("<SizeDescr>, <FieldDescr length>,"
-                 " <FieldDescr items>, <ArrayDescr>")
+    alldescrs = "<SizeDescr>, <FieldDescr items>, <ArrayDescr>"
     builtin_test('newlist', [], VARLIST,
                  """newlist $0, """+alldescrs+""" -> %r0""")
     builtin_test('newlist', [Constant(5, lltype.Signed)], VARLIST,
@@ -195,7 +196,7 @@
                  [varoftype(VARLIST), varoftype(lltype.Signed)],
                  lltype.Signed, """
         -live-
-        check_resizable_neg_index %r0, %i0, <FieldDescr length> -> %i1
+        check_resizable_neg_index %r0, %i0, <FieldDescr items>, <ArrayDescr> -> %i1
         getlistitem_gc_i %r0, %i1, <FieldDescr items>, <ArrayDescr> -> %i2
                  """)
 
@@ -211,13 +212,13 @@
                                       varoftype(lltype.Signed)],
                  lltype.Void, """
         -live-
-        check_resizable_neg_index %r0, %i0, <FieldDescr length> -> %i1
+        check_resizable_neg_index %r0, %i0, <FieldDescr items>, <ArrayDescr> -> %i1
         setlistitem_gc_i %r0, %i1, %i2, <FieldDescr items>, <ArrayDescr>
                  """)
 
 def test_resizable_len():
     builtin_test('list.len', [varoftype(VARLIST)], lltype.Signed,
-                 """getfield_gc_i %r0, <FieldDescr length> -> %i0""")
+                 """getlistlen %r0, <FieldDescr items>, <ArrayDescr> -> %i0""")
 
 def test_resizable_unsupportedop():
     builtin_test('list.foobar', [varoftype(VARLIST)], lltype.Signed,


More information about the pypy-commit mailing list