[pypy-commit] pypy cleanup-llgraph-backend: test_field_basic

arigo noreply at buildbot.pypy.org
Wed Oct 17 09:37:16 CEST 2012


Author: Armin Rigo <arigo at tunes.org>
Branch: cleanup-llgraph-backend
Changeset: r58151:6370f32ec6b9
Date: 2012-10-17 09:36 +0200
http://bitbucket.org/pypy/pypy/changeset/6370f32ec6b9/

Log:	test_field_basic

diff --git a/pypy/jit/backend/llgraph/runner.py b/pypy/jit/backend/llgraph/runner.py
--- a/pypy/jit/backend/llgraph/runner.py
+++ b/pypy/jit/backend/llgraph/runner.py
@@ -37,6 +37,16 @@
         self.RESULT = RESULT
         self.ARGS = ARGS
 
+class FieldDescr(AbstractDescr):
+    def __init__(self, S, fieldname):
+        self.S = S
+        self.fieldname = fieldname
+        self.FIELD = getattr(S, fieldname)
+
+    def is_pointer_field(self):
+        return getkind(self.FIELD) == 'ref'
+
+
 class LLGraphCPU(model.AbstractCPU):
     def __init__(self, rtyper):
         self.rtyper = rtyper
@@ -76,6 +86,7 @@
     def get_latest_value_int(self, index):
         return self.latest_values[index]
     get_latest_value_float = get_latest_value_int
+    get_latest_value_ref   = get_latest_value_int
 
     def get_latest_value_count(self):
         return len(self.latest_values)
@@ -87,7 +98,7 @@
         return self.exc_value
 
     def calldescrof(self, FUNC, ARGS, RESULT, effect_info):
-        key = (getkind(RESULT),
+        key = ('call', getkind(RESULT),
                tuple([getkind(A) for A in ARGS]),
                effect_info)
         try:
@@ -97,7 +108,14 @@
             self.descrs[key] = descr
             return descr
 
-
+    def fielddescrof(self, S, fieldname):
+        key = ('field', S, fieldname)
+        try:
+            return self.descrs[key]
+        except KeyError:
+            descr = FieldDescr(S, fieldname)
+            self.descrs[key] = descr
+            return descr
 
     def _calldescr_dynamic_for_tests(self, atypes, rtype,
                                      abiname='FFI_DEFAULT_ABI'):
@@ -248,6 +266,14 @@
     def execute_call(self, descr, *args):
         return self.cpu.call(args[0], descr, args[1:])
 
+    def execute_getfield_gc(self, descr, p):
+        p = lltype.cast_opaque_ptr(lltype.Ptr(descr.S), p)
+        return support.cast_result(descr.FIELD, getattr(p, descr.fieldname))
+
+    def execute_setfield_gc(self, descr, p, newvalue):
+        p = lltype.cast_opaque_ptr(lltype.Ptr(descr.S), p)
+        setattr(p, descr.fieldname, support.cast_arg(descr.FIELD, newvalue))
+
 def _setup():
     def _make_impl_from_blackhole_interp(opname):
         from pypy.jit.metainterp.blackhole import BlackholeInterpreter
diff --git a/pypy/jit/backend/llgraph/support.py b/pypy/jit/backend/llgraph/support.py
--- a/pypy/jit/backend/llgraph/support.py
+++ b/pypy/jit/backend/llgraph/support.py
@@ -75,6 +75,19 @@
             x = heaptracker.adr2int(x)
         return lltype.cast_primitive(TYPE, x)
 
+def cast_from_ptr(TYPE, x):
+    return lltype.cast_opaque_ptr(TYPE, x)
+
+def cast_arg(TP, x):
+    kind = getkind(TP)
+    if kind == 'int':
+        return cast_from_int(TP, x)
+    elif kind == 'ref':
+        return cast_from_ptr(TP, x)
+    else:
+        assert kind == 'float'
+        return cast_from_floatstorage(TP, x)
+
 def cast_call_args(ARGS, args_i, args_r, args_f, args_in_order=None):
     argsiter_i = iter(args_i or [])
     argsiter_r = iter(args_r or [])
@@ -91,7 +104,7 @@
                     n = orderiter.next()
                     assert n == 'r'
                 x = argsiter_r.next()
-                x = lltype.cast_opaque_ptr(TYPE, x)
+                x = cast_from_ptr(TYPE, x)
             elif TYPE is lltype.Float or longlong.is_longlong(TYPE):
                 if args_in_order is not None:
                     n = orderiter.next()


More information about the pypy-commit mailing list