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

Reply via email to