[pypy-svn] r62470 - pypy/branch/pyjitpl5/pypy/jit/metainterp

arigo at codespeak.net arigo at codespeak.net
Tue Mar 3 14:14:20 CET 2009


Author: arigo
Date: Tue Mar  3 14:14:18 2009
New Revision: 62470

Modified:
   pypy/branch/pyjitpl5/pypy/jit/metainterp/codewriter.py
   pypy/branch/pyjitpl5/pypy/jit/metainterp/pyjitpl.py
Log:
Add opimpl_getarrayitem_foldable_gc.


Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/codewriter.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/codewriter.py	(original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/codewriter.py	Tue Mar  3 14:14:18 2009
@@ -736,17 +736,13 @@
             self.register_var(op.result)
             return True
         #
-        if (oopspec_name == 'list.getitem' or
-            oopspec_name == 'list.getitem_foldable'): # <- XXX do better here
-            index = self.prepare_list_getset(op, arraydescr, args)
-            if index is None:
-                return False
-            self.emit('getarrayitem_gc')
-            self.emit(self.var_position(args[0]))
-            self.emit(self.const_position(arraydescr))
-            self.emit(self.var_position(index))
-            self.register_var(op.result)
-            return True
+        if oopspec_name == 'list.getitem':
+            return self.handle_list_getitem(op, arraydescr, args,
+                                            'getarrayitem_gc')
+        #
+        if oopspec_name == 'list.getitem_foldable':
+            return self.handle_list_getitem(op, arraydescr, args,
+                                            'getarrayitem_foldable_gc')
         #
         if oopspec_name == 'list.setitem':
             index = self.prepare_list_getset(op, arraydescr, args)
@@ -770,6 +766,17 @@
         #
         return False
 
+    def handle_list_getitem(self, op, arraydescr, args, opname):
+        index = self.prepare_list_getset(op, arraydescr, args)
+        if index is None:
+            return False
+        self.emit(opname)
+        self.emit(self.var_position(args[0]))
+        self.emit(self.const_position(arraydescr))
+        self.emit(self.var_position(index))
+        self.register_var(op.result)
+        return True
+
     def prepare_list_getset(self, op, arraydescr, args):
         func = op.args[0].value._obj._callable      # xxx break of abstraction
         non_negative = '_nonneg' in func.__name__

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	Tue Mar  3 14:14:18 2009
@@ -327,6 +327,12 @@
         tp = self.metainterp.cpu.typefor(arraydesc.getint())
         self.execute(rop.GETARRAYITEM_GC, [arraybox, arraydesc, indexbox], tp)
 
+    @arguments("box", "constbox", "box")
+    def opimpl_getarrayitem_foldable_gc(self, arraybox, arraydesc, indexbox):
+        tp = self.metainterp.cpu.typefor(arraydesc.getint())
+        self.execute(rop.GETARRAYITEM_GC, [arraybox, arraydesc, indexbox], tp,
+                     True)
+
     @arguments("box", "constbox", "box", "box")
     def opimpl_setarrayitem_gc(self, arraybox, arraydesc, indexbox, itembox):
         self.execute(rop.SETARRAYITEM_GC, [arraybox, arraydesc,



More information about the Pypy-commit mailing list