Author: Maciej Fijalkowski <[email protected]>
Branch: inline-dict-ops
Changeset: r45289:5396eecdde05
Date: 2011-07-03 01:03 +0200
http://bitbucket.org/pypy/pypy/changeset/5396eecdde05/
Log: enough support to run basic tests, unskip the none one
diff --git a/pypy/jit/backend/llsupport/descr.py
b/pypy/jit/backend/llsupport/descr.py
--- a/pypy/jit/backend/llsupport/descr.py
+++ b/pypy/jit/backend/llsupport/descr.py
@@ -147,6 +147,12 @@
self.arraydescr = arraydescr
self.fielddescr = fielddescr
+ def is_pointer_field(self):
+ return self.fielddescr.is_pointer_field()
+
+ def is_float_field(self):
+ return self.fielddescr.is_float_field()
+
# ____________________________________________________________
# ArrayDescrs
diff --git a/pypy/jit/backend/llsupport/llmodel.py
b/pypy/jit/backend/llsupport/llmodel.py
--- a/pypy/jit/backend/llsupport/llmodel.py
+++ b/pypy/jit/backend/llsupport/llmodel.py
@@ -300,6 +300,25 @@
else:
raise NotImplementedError("size = %d" % size)
+ def bh_getinteriorfield_gc_i(self, gcref, itemindex, descr):
+ arraydescr = descr.arraydescr
+ ofs, size, _ = self.unpack_arraydescr_size(arraydescr)
+ ofs += descr.fielddescr.offset
+ fieldsize =
descr.fielddescr.get_field_size(self.translate_support_code)
+ ofs = itemindex * size + ofs
+ # --- start of GC unsafe code (no GC operation!) ---
+ items = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref), ofs)
+ for STYPE, UTYPE, itemsize in unroll_basic_sizes:
+ if fieldsize == itemsize:
+ # XXX signedness
+ items = rffi.cast(rffi.CArrayPtr(STYPE), items)
+ val = items[0]
+ val = rffi.cast(lltype.Signed, val)
+ # --- end of GC unsafe code ---
+ return val
+ else:
+ raise NotImplementedError("size = %d" % fieldsize)
+
def bh_getarrayitem_gc_r(self, arraydescr, gcref, itemindex):
ofs = self.unpack_arraydescr(arraydescr)
# --- start of GC unsafe code (no GC operation!) ---
@@ -357,6 +376,23 @@
bh_getarrayitem_raw_i = bh_getarrayitem_gc_i
bh_getarrayitem_raw_f = bh_getarrayitem_gc_f
+ def bh_setinteriorfield_gc_i(self, gcref, itemindex, descr, value):
+ arraydescr = descr.arraydescr
+ ofs, size, _ = self.unpack_arraydescr_size(arraydescr)
+ ofs += descr.fielddescr.offset
+ fieldsize =
descr.fielddescr.get_field_size(self.translate_support_code)
+ ofs = itemindex * size + ofs
+ # --- start of GC unsafe code (no GC operation!) ---
+ items = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref), ofs)
+ for TYPE, _, itemsize in unroll_basic_sizes:
+ if fieldsize == itemsize:
+ items = rffi.cast(rffi.CArrayPtr(TYPE), items)
+ items[0] = rffi.cast(TYPE, value)
+ # --- end of GC unsafe code ---
+ return
+ else:
+ raise NotImplementedError("size = %d" % fieldsize)
+
def bh_strlen(self, string):
s = lltype.cast_opaque_ptr(lltype.Ptr(rstr.STR), string)
return len(s.chars)
diff --git a/pypy/jit/backend/x86/regalloc.py b/pypy/jit/backend/x86/regalloc.py
--- a/pypy/jit/backend/x86/regalloc.py
+++ b/pypy/jit/backend/x86/regalloc.py
@@ -1088,12 +1088,14 @@
t = self._unpack_interiorfielddescr(op.getdescr())
ofs, itemsize, fieldsize, _ = t
args = op.getarglist()
+ tmpvar = TempBox()
base_loc = self.rm.make_sure_var_in_reg(op.getarg(0), args)
- index_loc = self.rm.force_result_in_reg(op.getarg(1), op.getarg(1),
+ index_loc = self.rm.force_result_in_reg(tmpvar, op.getarg(1),
args)
# we're free to modify index now
value_loc = self.make_sure_var_in_reg(op.getarg(2), args)
self.possibly_free_vars(args)
+ self.rm.possibly_free_var(tmpvar)
self.PerformDiscard(op, [base_loc, ofs, itemsize, fieldsize,
index_loc, value_loc])
@@ -1166,10 +1168,12 @@
else:
sign_loc = imm0
args = op.getarglist()
+ tmpvar = TempBox()
base_loc = self.rm.make_sure_var_in_reg(op.getarg(0), args)
- index_loc = self.rm.force_result_in_reg(op.getarg(1), op.getarg(1),
+ index_loc = self.rm.force_result_in_reg(tmpvar, op.getarg(1),
args)
- self.possibly_free_vars(args)
+ self.rm.possibly_free_vars_for_op(op)
+ self.rm.possibly_free_var(tmpvar)
result_loc = self.force_allocate_reg(op.result)
self.Perform(op, [base_loc, ofs, itemsize, fieldsize,
index_loc, sign_loc], result_loc)
diff --git a/pypy/jit/metainterp/test/test_dict.py
b/pypy/jit/metainterp/test/test_dict.py
--- a/pypy/jit/metainterp/test/test_dict.py
+++ b/pypy/jit/metainterp/test/test_dict.py
@@ -1,4 +1,3 @@
-import py
from pypy.jit.metainterp.test.support import LLJitMixin, OOJitMixin
from pypy.rlib.jit import JitDriver
from pypy.rlib import objectmodel
@@ -6,7 +5,6 @@
class DictTests:
def test_dict_set_none(self):
- py.test.skip("annoying...")
def fn(n):
d = {}
d[0] = None
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit