Author: Antonio Cuni <[email protected]>
Branch: ffistruct
Changeset: r47182:f86c80625b41
Date: 2011-09-09 11:49 +0200
http://bitbucket.org/pypy/pypy/changeset/f86c80625b41/
Log: implement fielddescrof_dynamic for the llgraph backend
diff --git a/pypy/jit/backend/llgraph/llimpl.py
b/pypy/jit/backend/llgraph/llimpl.py
--- a/pypy/jit/backend/llgraph/llimpl.py
+++ b/pypy/jit/backend/llgraph/llimpl.py
@@ -764,7 +764,9 @@
op_getfield_gc_pure = op_getfield_gc
def op_getfield_raw(self, fielddescr, struct):
- if fielddescr.typeinfo == REF:
+ if fielddescr.arg_types == 'dynamic': # abuse of .arg_types
+ return do_getfield_raw_dynamic(struct, fielddescr)
+ elif fielddescr.typeinfo == REF:
return do_getfield_raw_ptr(struct, fielddescr.ofs)
elif fielddescr.typeinfo == INT:
return do_getfield_raw_int(struct, fielddescr.ofs)
@@ -817,7 +819,9 @@
raise NotImplementedError
def op_setfield_raw(self, fielddescr, struct, newvalue):
- if fielddescr.typeinfo == REF:
+ if fielddescr.arg_types == 'dynamic': # abuse of .arg_types
+ do_setfield_raw_dynamic(struct, fielddescr, newvalue)
+ elif fielddescr.typeinfo == REF:
do_setfield_raw_ptr(struct, fielddescr.ofs, newvalue)
elif fielddescr.typeinfo == INT:
do_setfield_raw_int(struct, fielddescr.ofs, newvalue)
@@ -1370,6 +1374,17 @@
def do_getfield_raw_ptr(struct, fieldnum):
return cast_to_ptr(_getfield_raw(struct, fieldnum))
+def do_getfield_raw_dynamic(struct, fielddescr):
+ from pypy.rlib import libffi
+ addr = cast_from_int(rffi.VOIDP, struct)
+ ofs = fielddescr.ofs
+ if fielddescr.is_pointer_field():
+ assert False, 'fixme'
+ elif fielddescr.is_float_field():
+ assert False, 'fixme'
+ else:
+ return libffi._struct_getfield(lltype.Signed, addr, ofs)
+
def do_new(size):
TYPE = symbolic.Size2Type[size]
x = lltype.malloc(TYPE, zero=True)
@@ -1453,6 +1468,17 @@
newvalue = cast_from_ptr(FIELDTYPE, newvalue)
setattr(ptr, fieldname, newvalue)
+def do_setfield_raw_dynamic(struct, fielddescr, newvalue):
+ from pypy.rlib import libffi
+ addr = cast_from_int(rffi.VOIDP, struct)
+ ofs = fielddescr.ofs
+ if fielddescr.is_pointer_field():
+ assert False, 'fixme'
+ elif fielddescr.is_float_field():
+ assert False, 'fixme'
+ else:
+ libffi._struct_setfield(lltype.Signed, addr, ofs, newvalue)
+
def do_newstr(length):
x = rstr.mallocstr(length)
return cast_to_ptr(x)
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
@@ -316,6 +316,16 @@
token = history.getkind(getattr(S, fieldname))
return self.getdescr(ofs, token[0], name=fieldname)
+ def fielddescrof_dynamic(self, offset, fieldsize, is_pointer, is_float,
is_signed):
+ if is_pointer:
+ typeinfo = REF
+ elif is_float:
+ typeinfo = FLOAT
+ else:
+ typeinfo = INT
+ # we abuse the arg_types field to distinguish dynamic and static descrs
+ return self.getdescr(offset, typeinfo, arg_types='dynamic',
name='<dynamic field>')
+
def calldescrof(self, FUNC, ARGS, RESULT, extrainfo):
arg_types = []
for ARG in ARGS:
diff --git a/pypy/jit/backend/test/runner_test.py
b/pypy/jit/backend/test/runner_test.py
--- a/pypy/jit/backend/test/runner_test.py
+++ b/pypy/jit/backend/test/runner_test.py
@@ -1509,20 +1509,38 @@
assert s.x == chr(190)
assert s.y == chr(150)
- def test_field_raw_pure(self):
- # This is really testing the same thing as test_field_basic but can't
- # hurt...
- S = lltype.Struct('S', ('x', lltype.Signed))
+ def test_fielddescrof_dynamic(self):
+ S = lltype.Struct('S',
+ ('x', lltype.Signed),
+ ('y', lltype.Signed),
+ )
+ longsize = rffi.sizeof(lltype.Signed)
+ y_ofs = longsize
s = lltype.malloc(S, flavor='raw')
sa = llmemory.cast_ptr_to_adr(s)
s_box = BoxInt(heaptracker.adr2int(sa))
+ #
+ field = self.cpu.fielddescrof(S, 'y')
+ field_dyn = self.cpu.fielddescrof_dynamic(offset=y_ofs,
+ fieldsize=longsize,
+ is_pointer=False,
+ is_float=False,
+ is_signed=True)
+ assert field.is_pointer_field() == field_dyn.is_pointer_field()
+ assert field.is_float_field() == field_dyn.is_float_field()
+ if 'llgraph' not in str(self.cpu):
+ assert field.is_signed_field() == field_dyn.is_signed_field()
+ assert field.get_field_size() == field_dyn.get_field_size()
+
+ #
for get_op, set_op in ((rop.GETFIELD_RAW, rop.SETFIELD_RAW),
(rop.GETFIELD_RAW_PURE, rop.SETFIELD_RAW)):
- fd = self.cpu.fielddescrof(S, 'x')
- self.execute_operation(set_op, [s_box, BoxInt(32)], 'void',
- descr=fd)
- res = self.execute_operation(get_op, [s_box], 'int', descr=fd)
- assert res.getint() == 32
+ for descr in (field, field_dyn):
+ self.execute_operation(set_op, [s_box, BoxInt(32)], 'void',
+ descr=descr)
+ res = self.execute_operation(get_op, [s_box], 'int',
descr=descr)
+ assert res.getint() == 32
+
lltype.free(s, flavor='raw')
def test_new_with_vtable(self):
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit