[pypy-svn] r74872 - pypy/branch/blackhole-improvement/pypy/jit/backend/llsupport

arigo at codespeak.net arigo at codespeak.net
Fri May 28 20:55:18 CEST 2010


Author: arigo
Date: Fri May 28 20:55:17 2010
New Revision: 74872

Modified:
   pypy/branch/blackhole-improvement/pypy/jit/backend/llsupport/llmodel.py
Log:
Progress.


Modified: pypy/branch/blackhole-improvement/pypy/jit/backend/llsupport/llmodel.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/backend/llsupport/llmodel.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/backend/llsupport/llmodel.py	Fri May 28 20:55:17 2010
@@ -229,9 +229,7 @@
         assert isinstance(arraydescr, BaseArrayDescr)
         ofs = arraydescr.get_base_size(self.translate_support_code)
         size = arraydescr.get_item_size(self.translate_support_code)
-        ptr = arraydescr.is_array_of_pointers()
-        float = arraydescr.is_array_of_floats()
-        return ofs, size, ptr, float
+        return ofs, size
     unpack_arraydescr._always_inline_ = True
 
     def calldescrof(self, FUNC, ARGS, RESULT, extrainfo=None):
@@ -251,77 +249,72 @@
 
     # ____________________________________________________________
 
-    def do_arraylen_gc(self, arraybox, arraydescr):
+    def bh_arraylen_gc(self, arraydescr, array):
         assert isinstance(arraydescr, BaseArrayDescr)
         ofs = arraydescr.get_ofs_length(self.translate_support_code)
-        gcref = arraybox.getref_base()
-        length = rffi.cast(rffi.CArrayPtr(lltype.Signed), gcref)[ofs/WORD]
-        return BoxInt(length)
-
-    def do_getarrayitem_gc(self, arraybox, indexbox, arraydescr):
-        itemindex = indexbox.getint()
-        gcref = arraybox.getref_base()
-        ofs, size, ptr, float = self.unpack_arraydescr(arraydescr)
+        return rffi.cast(rffi.CArrayPtr(lltype.Signed), array)[ofs/WORD]
+
+    def bh_getarrayitem_gc_i(self, arraydescr, gcref, itemindex):
+        ofs, size = self.unpack_arraydescr(arraydescr)
         # --- start of GC unsafe code (no GC operation!) ---
         items = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref), ofs)
-        #
-        if ptr:
-            items = rffi.cast(rffi.CArrayPtr(lltype.Signed), items)
-            pval = self._cast_int_to_gcref(items[itemindex])
-            # --- end of GC unsafe code ---
-            return BoxPtr(pval)
-        #
-        if float:
-            items = rffi.cast(rffi.CArrayPtr(lltype.Float), items)
-            fval = items[itemindex]
-            # --- end of GC unsafe code ---
-            return BoxFloat(fval)
-        #
         for TYPE, itemsize in unroll_basic_sizes:
             if size == itemsize:
                 items = rffi.cast(rffi.CArrayPtr(TYPE), items) 
                 val = items[itemindex]
                 # --- end of GC unsafe code ---
-                return BoxInt(rffi.cast(lltype.Signed, val))
+                return rffi.cast(lltype.Signed, val)
         else:
             raise NotImplementedError("size = %d" % size)
 
-    def do_setarrayitem_gc(self, arraybox, indexbox, vbox, arraydescr):
-        itemindex = indexbox.getint()
-        gcref = arraybox.getref_base()
-        ofs, size, ptr, float = self.unpack_arraydescr(arraydescr)
-        #
-        if ptr:
-            vboxptr = vbox.getref_base()
-            self.gc_ll_descr.do_write_barrier(gcref, vboxptr)
-            # --- start of GC unsafe code (no GC operation!) ---
-            items = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref), ofs)
-            items = rffi.cast(rffi.CArrayPtr(lltype.Signed), items)
-            items[itemindex] = self.cast_gcref_to_int(vboxptr)
-            # --- end of GC unsafe code ---
-            return
-        #
-        if float:
-            fval = vbox.getfloat()
-            # --- start of GC unsafe code (no GC operation!) ---
-            items = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref), ofs)
-            items = rffi.cast(rffi.CArrayPtr(lltype.Float), items)
-            items[itemindex] = fval
-            # --- end of GC unsafe code ---
-            return
-        #
-        val = vbox.getint()
+    def bh_getarrayitem_gc_r(self, arraydescr, gcref, itemindex):
+        ofs, size = self.unpack_arraydescr(arraydescr)
+        # --- start of GC unsafe code (no GC operation!) ---
+        items = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref), ofs)
+        items = rffi.cast(rffi.CArrayPtr(lltype.Signed), items)
+        pval = self._cast_int_to_gcref(items[itemindex])
+        # --- end of GC unsafe code ---
+        return pval
+
+    def bh_getarrayitem_gc_f(self, arraydescr, gcref, itemindex):
+        ofs, size = self.unpack_arraydescr(arraydescr)
+        # --- start of GC unsafe code (no GC operation!) ---
+        items = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref), ofs)
+        items = rffi.cast(rffi.CArrayPtr(lltype.Float), items)
+        fval = items[itemindex]
+        # --- end of GC unsafe code ---
+        return fval
+
+    def bh_setarrayitem_gc_i(self, arraydescr, gcref, itemindex, newvalue):
+        ofs, size = self.unpack_arraydescr(arraydescr)
         for TYPE, itemsize in unroll_basic_sizes:
             if size == itemsize:
                 # --- start of GC unsafe code (no GC operation!) ---
                 items = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref), ofs)
                 items = rffi.cast(rffi.CArrayPtr(TYPE), items)
-                items[itemindex] = rffi.cast(TYPE, val)
+                items[itemindex] = rffi.cast(TYPE, newvalue)
                 # --- end of GC unsafe code ---
                 return
         else:
             raise NotImplementedError("size = %d" % size)
 
+    def bh_setarrayitem_gc_r(self, arraydescr, gcref, itemindex, newvalue):
+        ofs, size = self.unpack_arraydescr(arraydescr)
+        self.gc_ll_descr.do_write_barrier(gcref, newvalue)
+        # --- start of GC unsafe code (no GC operation!) ---
+        items = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref), ofs)
+        items = rffi.cast(rffi.CArrayPtr(lltype.Signed), items)
+        items[itemindex] = self.cast_gcref_to_int(newvalue)
+        # --- end of GC unsafe code ---
+
+    def bh_setarrayitem_gc_f(self, arraydescr, gcref, itemindex, newvalue):
+        ofs, size = self.unpack_arraydescr(arraydescr)
+        # --- start of GC unsafe code (no GC operation!) ---
+        items = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref), ofs)
+        items = rffi.cast(rffi.CArrayPtr(lltype.Float), items)
+        items[itemindex] = newvalue
+        # --- end of GC unsafe code ---
+
     def _new_do_len(TP):
         def do_strlen(self, stringbox):
             basesize, itemsize, ofs_length = symbolic.get_array_token(TP,
@@ -342,14 +335,9 @@
         v = rffi.cast(rffi.CArrayPtr(lltype.Char), gcref)[basesize + i]
         return BoxInt(ord(v))
 
-    def do_unicodegetitem(self, stringbox, indexbox):
-        basesize, itemsize, ofs_length = symbolic.get_array_token(rstr.UNICODE,
-                                                    self.translate_support_code)
-        gcref = stringbox.getref_base()
-        i = indexbox.getint()
-        basesize = basesize // itemsize
-        v = rffi.cast(rffi.CArrayPtr(lltype.UniChar), gcref)[basesize + i]
-        return BoxInt(ord(v))
+    def bh_unicodegetitem(self, string, index):
+        u = lltype.cast_opaque_ptr(lltype.Ptr(rstr.UNICODE), string)
+        return ord(u.chars[index])
 
     @specialize.argtype(1)
     def _base_do_getfield(self, gcref, fielddescr):
@@ -446,15 +434,11 @@
         res = self.gc_ll_descr.gc_malloc_array(arraydescr, num_elem)
         return BoxPtr(res)
 
-    def do_newstr(self, countbox):
-        num_elem = countbox.getint()
-        res = self.gc_ll_descr.gc_malloc_str(num_elem)
-        return BoxPtr(res)
+    def bh_newstr(self, length):
+        return self.gc_ll_descr.gc_malloc_str(length)
 
-    def do_newunicode(self, countbox):
-        num_elem = countbox.getint()
-        res = self.gc_ll_descr.gc_malloc_unicode(num_elem)
-        return BoxPtr(res)
+    def bh_newunicode(self, length):
+        return self.gc_ll_descr.gc_malloc_unicode(length)
 
     def do_strsetitem(self, stringbox, indexbox, vbox):
         basesize, itemsize, ofs_length = symbolic.get_array_token(rstr.STR,
@@ -464,14 +448,9 @@
         a = stringbox.getref_base()
         rffi.cast(rffi.CArrayPtr(lltype.Char), a)[index + basesize] = chr(v)
 
-    def do_unicodesetitem(self, stringbox, indexbox, vbox):
-        basesize, itemsize, ofs_length = symbolic.get_array_token(rstr.UNICODE,
-                                                self.translate_support_code)
-        index = indexbox.getint()
-        v = vbox.getint()
-        a = stringbox.getref_base()
-        basesize = basesize // itemsize
-        rffi.cast(rffi.CArrayPtr(lltype.UniChar), a)[index + basesize] = unichr(v)
+    def bh_unicodesetitem(self, string, index, newvalue):
+        u = lltype.cast_opaque_ptr(lltype.Ptr(rstr.UNICODE), string)
+        u.chars[index] = unichr(newvalue)
 
     def bh_call_i(self, func, calldescr, args_i, args_r, args_f):
         assert isinstance(calldescr, BaseIntCallDescr)



More information about the Pypy-commit mailing list