[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