[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