[pypy-svn] r67308 - pypy/branch/pyjitpl5-llmodel/pypy/jit/backend/llsupport

arigo at codespeak.net arigo at codespeak.net
Sat Aug 29 14:11:51 CEST 2009


Author: arigo
Date: Sat Aug 29 14:11:51 2009
New Revision: 67308

Modified:
   pypy/branch/pyjitpl5-llmodel/pypy/jit/backend/llsupport/llmodel.py
Log:
do_setfield.


Modified: pypy/branch/pyjitpl5-llmodel/pypy/jit/backend/llsupport/llmodel.py
==============================================================================
--- pypy/branch/pyjitpl5-llmodel/pypy/jit/backend/llsupport/llmodel.py	(original)
+++ pypy/branch/pyjitpl5-llmodel/pypy/jit/backend/llsupport/llmodel.py	Sat Aug 29 14:11:51 2009
@@ -48,6 +48,9 @@
             _check_addr_range(x)
         return rffi.cast(llmemory.GCREF, x)
 
+    def cast_gcref_to_int(self, x):
+        return rffi.cast(lltype.Signed, x)
+
     def fielddescrof(self, STRUCT, fieldname):
         return get_field_descr(STRUCT, fieldname, self.translate_support_code)
 
@@ -99,7 +102,7 @@
         def do_strlen(self, args, descr=None):
             basesize, itemsize, ofs_length = symbolic.get_array_token(TP,
                                                 self.translate_support_code)
-            gcref = args[0].getptr(llmemory.GCREF)
+            gcref = args[0].getptr_base()
             v = rffi.cast(rffi.CArrayPtr(lltype.Signed), gcref)[ofs_length/WORD]
             return BoxInt(v)
         return do_strlen
@@ -110,7 +113,7 @@
     def do_strgetitem(self, args, descr=None):
         basesize, itemsize, ofs_length = symbolic.get_array_token(rstr.STR,
                                                     self.translate_support_code)
-        gcref = args[0].getptr(llmemory.GCREF)
+        gcref = args[0].getptr_base()
         i = args[1].getint()
         v = rffi.cast(rffi.CArrayPtr(lltype.Char), gcref)[basesize + i]
         return BoxInt(ord(v))
@@ -131,12 +134,39 @@
             return BoxInt(val)
 
     def do_getfield_gc(self, args, fielddescr):
-        gcref = args[0].getptr(llmemory.GCREF)
+        gcref = args[0].getptr_base()
         return self._base_do_getfield(gcref, fielddescr)
 
     def do_getfield_raw(self, args, fielddescr):
         return self._base_do_getfield(args[0].getint(), fielddescr)
 
+    @specialize.argtype(1)
+    def _base_do_setfield(self, gcref, vbox, fielddescr):
+        ofs, size, ptr = self.unpack_fielddescr(fielddescr)
+        if ptr:
+            assert lltype.typeOf(gcref) is not lltype.Signed, (
+                "can't handle write barriers for setfield_raw")
+            ptr = vbox.getptr_base()
+            self.gc_ll_descr.do_write_barrier(gcref, ptr)
+            a = rffi.cast(rffi.CArrayPtr(lltype.Signed), gcref)
+            a[ofs/WORD] = self.cast_gcref_to_int(ptr)
+        else:
+            v = vbox.getint()
+            for TYPE, itemsize in unroll_basic_sizes:
+                if size == itemsize:
+                    v = rffi.cast(TYPE, v)
+                    rffi.cast(rffi.CArrayPtr(TYPE), gcref)[ofs] = v
+                    break
+            else:
+                raise NotImplementedError("size = %d" % size)
+
+    def do_setfield_gc(self, args, fielddescr):
+        gcref = args[0].getptr_base()
+        self._base_do_setfield(gcref, args[1], fielddescr)
+
+    def do_setfield_raw(self, args, fielddescr):
+        self._base_do_setfield(args[0].getint(), args[1], fielddescr)
+
 
 import pypy.jit.metainterp.executor
 pypy.jit.metainterp.executor.make_execute_list(AbstractLLCPU)



More information about the Pypy-commit mailing list