[pypy-svn] r67291 - pypy/branch/pyjitpl5-c/pypy/jit/backend/c

arigo at codespeak.net arigo at codespeak.net
Fri Aug 28 19:39:00 CEST 2009


Author: arigo
Date: Fri Aug 28 19:38:59 2009
New Revision: 67291

Modified:
   pypy/branch/pyjitpl5-c/pypy/jit/backend/c/compile.py
   pypy/branch/pyjitpl5-c/pypy/jit/backend/c/runner.py
Log:
More random progress.


Modified: pypy/branch/pyjitpl5-c/pypy/jit/backend/c/compile.py
==============================================================================
--- pypy/branch/pyjitpl5-c/pypy/jit/backend/c/compile.py	(original)
+++ pypy/branch/pyjitpl5-c/pypy/jit/backend/c/compile.py	Fri Aug 28 19:38:59 2009
@@ -299,6 +299,14 @@
                                            rffi.cast(llmemory.GCREF, value)))
 
 
+class FieldDescr(AbstractDescr):
+    def __init__(self, field_ofs, field_cls, field_c_type, field_size):
+        self.field_ofs = field_ofs
+        self.field_cls = field_cls
+        self.field_c_type = field_c_type
+        self.field_size = field_size
+
+
 class ArrayDescr(AbstractDescr):
     def __init__(self, item_cls, item_c_type, item_size):
         self.item_cls = item_cls

Modified: pypy/branch/pyjitpl5-c/pypy/jit/backend/c/runner.py
==============================================================================
--- pypy/branch/pyjitpl5-c/pypy/jit/backend/c/runner.py	(original)
+++ pypy/branch/pyjitpl5-c/pypy/jit/backend/c/runner.py	Fri Aug 28 19:38:59 2009
@@ -2,6 +2,7 @@
 from pypy.jit.backend.model import AbstractCPU
 from pypy.jit.backend.c.compile import Compiler, get_c_type, get_class_for_type
 from pypy.jit.backend.c.compile import CallDescr, ArrayDescr, get_c_array_descr
+from pypy.jit.backend.c.compile import FieldDescr
 from pypy.jit.metainterp import history
 from pypy.jit.metainterp.history import BoxInt, BoxPtr
 from pypy.jit.backend.x86 import symbolic
@@ -14,6 +15,7 @@
 
     def __init__(self, rtyper, stats, translate_support_code=False):
         self.rtyper = rtyper
+        self.field_descrs = {}
         self.call_descrs = {}
         self.compiler = Compiler(translate_support_code)
         self.translate_support_code = translate_support_code
@@ -36,6 +38,19 @@
     def get_latest_value_ptr(self, index):
         return self.compiler.c_jit_ap[index]
 
+    def fielddescrof(self, S, fieldname):
+        try:
+            return self.field_descrs[S, fieldname]
+        except KeyError:
+            pass
+        ofs, size = symbolic.get_field_token(S, fieldname,
+                                             self.translate_support_code)
+        cls = get_class_for_type(getattr(S, fieldname))
+        c_type = get_c_type(getattr(S, fieldname))
+        descr = FieldDescr(ofs, cls, c_type, size)
+        self.field_descrs[S, fieldname] = descr
+        return descr
+
     @staticmethod
     def arraydescrof(A):
         return get_c_array_descr(A.OF)
@@ -53,6 +68,22 @@
         self.call_descrs[key] = descr
         return descr
 
+    def do_getfield_gc(self, args, fielddescr):
+        assert isinstance(fielddescr, FieldDescr)
+        gcref = args[0].getptr(llmemory.GCREF)
+        ofs = fielddescr.field_ofs
+        size = fielddescr.field_size
+        if size == 1:
+            v = ord(rffi.cast(rffi.CArrayPtr(lltype.Char), gcref)[ofs])
+        elif size == 2:
+            v = rffi.cast(rffi.CArrayPtr(rffi.USHORT), gcref)[ofs/2]
+            v = rffi.cast(lltype.Signed, v)
+        elif size == WORD:
+            v = rffi.cast(rffi.CArrayPtr(lltype.Signed), gcref)[ofs/WORD]
+        else:
+            raise NotImplementedError("size = %d" % size)
+        return fielddescr.field_cls._c_jit_make(v)
+
     def do_arraylen_gc(self, args, arraydescr):
         ofs = 0    #self.gc_ll_descr.array_length_ofs
         gcref = args[0].getptr(llmemory.GCREF)



More information about the Pypy-commit mailing list