Author: Maciej Fijalkowski <[email protected]>
Branch: inline-dict-ops
Changeset: r45113:0af0de047bbc
Date: 2011-06-24 20:11 +0200
http://bitbucket.org/pypy/pypy/changeset/0af0de047bbc/
Log: Implement most of support. Probably needs rewrite because of mess
with Descrs :-/
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
@@ -402,6 +402,38 @@
assert isinstance(fielddescr, Descr)
return llimpl.do_getfield_raw_float(struct, fielddescr.ofs)
+ def bh_getinteriorfield_gc_i(self, array, index, arraydescr, fielddescr):
+ assert isinstance(arraydescr, Descr)
+ assert isinstance(fielddescr, Descr)
+ return llimpl.do_getinteriorfield_gc_int(array, index, fielddescr.ofs)
+ def bh_getinteriorfield_gc_r(self, array, index, arraydescr, fielddescr):
+ assert isinstance(arraydescr, Descr)
+ assert isinstance(fielddescr, Descr)
+ return llimpl.do_getinteriorfield_gc_ptr(array, index, fielddescr.ofs)
+ def bh_getinteriorfield_gc_f(self, array, index, arraydescr, fielddescr):
+ assert isinstance(arraydescr, Descr)
+ assert isinstance(fielddescr, Descr)
+ return llimpl.do_getinteriorfield_gc_float(array, index,
fielddescr.ofs)
+
+ def bh_setinteriorfield_gc_i(self, array, index, arraydescr, fielddescr,
+ value):
+ assert isinstance(arraydescr, Descr)
+ assert isinstance(fielddescr, Descr)
+ return llimpl.do_setinteriorfield_gc_int(array, index, fielddescr.ofs,
+ value)
+ def bh_setinteriorfield_gc_r(self, array, index, arraydescr, fielddescr,
+ value):
+ assert isinstance(arraydescr, Descr)
+ assert isinstance(fielddescr, Descr)
+ return llimpl.do_setinteriorfield_gc_ptr(array, index, fielddescr.ofs,
+ value)
+ def bh_setinteriorfield_gc_f(self, array, index, arraydescr, fielddescr,
+ value):
+ assert isinstance(arraydescr, Descr)
+ assert isinstance(fielddescr, Descr)
+ return llimpl.do_setinteriorfield_gc_float(array, index,
fielddescr.ofs,
+ value)
+
def bh_new(self, sizedescr):
assert isinstance(sizedescr, Descr)
return llimpl.do_new(sizedescr.ofs)
diff --git a/pypy/jit/metainterp/blackhole.py b/pypy/jit/metainterp/blackhole.py
--- a/pypy/jit/metainterp/blackhole.py
+++ b/pypy/jit/metainterp/blackhole.py
@@ -1120,10 +1120,10 @@
fielddescr)
@arguments("cpu", "r", "i", "d", "i", "d")
- def bhimpl_setinteriorfield_gc_i(cpu, array, index, arraydescr, value,
- fielddescr):
- cpu.bh_setinteriorfield_gc_i(array, index, arraydescr, value,
- fielddescr)
+ def bhimpl_setinteriorfield_gc_i(cpu, array, index, arraydescr,
+ fielddescr, value):
+ cpu.bh_setinteriorfield_gc_i(array, index, arraydescr, fielddescr,
+ value)
@arguments("cpu", "r", "d", returns="i")
def bhimpl_getfield_gc_i(cpu, struct, fielddescr):
diff --git a/pypy/jit/metainterp/executor.py b/pypy/jit/metainterp/executor.py
--- a/pypy/jit/metainterp/executor.py
+++ b/pypy/jit/metainterp/executor.py
@@ -121,11 +121,31 @@
cpu.bh_setarrayitem_raw_i(arraydescr, array, index, itembox.getint())
def do_getinteriorfield_gc(cpu, _, arraybox, indexbox, arraydescr, fielddescr):
- xxx
+ array = arraybox.getref_base()
+ index = indexbox.getint()
+ if fielddescr.is_pointer_field():
+ return BoxPtr(cpu.bh_getinteriorfield_gc_r(array, index, arraydescr,
+ fielddescr))
+ elif fielddescr.is_float_field():
+ return BoxFloat(cpu.bh_getinteriorfield_gc_f(array, index, arraydescr,
+ fielddescr))
+ else:
+ return BoxInt(cpu.bh_getinteriorfield_gc_i(array, index, arraydescr,
+ fielddescr))
def do_setinteriorfield_gc(cpu, _, arraybox, indexbox, valuebox, arraydescr,
- fielddecr):
- xxx
+ fielddescr):
+ array = arraybox.getref_base()
+ index = indexbox.getint()
+ if fielddescr.is_pointer_field():
+ cpu.bh_setinteriorfield_gc_r(array, index, arraydescr, fielddescr,
+ valuebox.getref_base())
+ elif fielddescr.is_float_field():
+ cpu.bh_setinteriorfield_gc_f(array, index, arraydescr, fielddescr,
+ valuebox.getfloatstorage())
+ else:
+ cpu.bh_setinteriorfield_gc_i(array, index, arraydescr, fielddescr,
+ valuebox.getint())
def do_getfield_gc(cpu, _, structbox, fielddescr):
struct = structbox.getref_base()
diff --git a/pypy/jit/metainterp/pyjitpl.py b/pypy/jit/metainterp/pyjitpl.py
--- a/pypy/jit/metainterp/pyjitpl.py
+++ b/pypy/jit/metainterp/pyjitpl.py
@@ -512,6 +512,15 @@
opimpl_getfield_gc_r_pure = _opimpl_getfield_gc_pure_any
opimpl_getfield_gc_f_pure = _opimpl_getfield_gc_pure_any
+ @arguments("box", "box", "descr", "descr")
+ def _opimpl_getinteriorfield_gc_any(self, array, index, arraydescr,
+ fielddescr):
+ return self.execute_with_descr(rop.GETINTERIORFIELD_GC, fielddescr,
+ array, index, arraydescr)
+ opimpl_getinteriorfield_gc_i = _opimpl_getinteriorfield_gc_any
+ opimpl_getinteriorfield_gc_f = _opimpl_getinteriorfield_gc_any
+ opimpl_getinteriorfield_gc_r = _opimpl_getinteriorfield_gc_any
+
@arguments("orgpc", "box", "descr")
def _opimpl_getfield_gc_greenfield_any(self, pc, box, fielddescr):
ginfo = self.metainterp.jitdriver_sd.greenfield_info
@@ -535,6 +544,16 @@
opimpl_setfield_gc_r = _opimpl_setfield_gc_any
opimpl_setfield_gc_f = _opimpl_setfield_gc_any
+ @arguments("box", "box", "box", "descr", "descr")
+ def _opimpl_setinteriorfield_gc_any(self, array, index, value, arraydescr,
+ fielddescr):
+ self.execute_with_descr(rop.SETINTERIORFIELD_GC, fielddescr,
+ array, index, value, arraydescr)
+ opimpl_setinteriorfield_gc_i = _opimpl_setinteriorfield_gc_any
+ opimpl_setinteriorfield_gc_f = _opimpl_setinteriorfield_gc_any
+ opimpl_setinteriorfield_gc_r = _opimpl_setinteriorfield_gc_any
+
+
@arguments("box", "descr")
def _opimpl_getfield_raw_any(self, box, fielddescr):
return self.execute_with_descr(rop.GETFIELD_RAW, fielddescr, box)
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit