Author: Maciej Fijalkowski <[email protected]>
Branch: cleanup-llgraph-backend
Changeset: r58153:b8a017f07707
Date: 2012-10-17 10:29 +0200
http://bitbucket.org/pypy/pypy/changeset/b8a017f07707/

Log:    (fijal, arigo) array support

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
@@ -7,7 +7,7 @@
 from pypy.jit.metainterp.resoperation import rop
 
 from pypy.rpython.llinterp import LLInterpreter
-from pypy.rpython.lltypesystem import lltype, llmemory
+from pypy.rpython.lltypesystem import lltype, llmemory, rclass
 
 from pypy.rlib.rarithmetic import ovfcheck
 
@@ -45,6 +45,12 @@
     def is_pointer_field(self):
         return getkind(self.FIELD) == 'ref'
 
+class ArrayDescr(AbstractDescr):
+    def __init__(self, A):
+        self.A = A
+
+    def is_array_of_pointers(self):
+        return getkind(self.A.OF) == 'ref'
 
 class LLGraphCPU(model.AbstractCPU):
     def __init__(self, rtyper):
@@ -116,6 +122,15 @@
             self.descrs[key] = descr
             return descr
 
+    def arraydescrof(self, A):
+        key = ('array', A)
+        try:
+            return self.descrs[key]
+        except KeyError:
+            descr = ArrayDescr(A)
+            self.descrs[key] = descr
+            return descr
+
     def _calldescr_dynamic_for_tests(self, atypes, rtype,
                                      abiname='FFI_DEFAULT_ABI'):
         # XXX WTF is that and why it breaks all abstractions?
@@ -244,6 +259,30 @@
         if arg:
             self.fail_guard(descr)
 
+    def execute_guard_value(self, descr, arg1, arg2):
+        if arg1 != arg2:
+            self.fail_guard(descr)
+
+    def execute_guard_nonnull(self, descr, arg):
+        if not arg:
+            self.fail_guard(descr)
+
+    def execute_guard_isnull(self, descr, arg):
+        if arg:
+            self.fail_guard(descr)
+
+    def execute_guard_class(self, descr, arg, klass):
+        value = lltype.cast_opaque_ptr(rclass.OBJECTPTR, arg)
+        expected_class = llmemory.cast_adr_to_ptr(
+            llmemory.cast_int_to_adr(klass),
+            rclass.CLASSTYPE)
+        if value.typeptr != expected_class:
+            self.fail_guard(descr)
+
+    def execute_guard_nonnull_class(self, descr, arg, klass):
+        self.execute_guard_nonnull(descr, arg)
+        self.execute_guard_class(descr, arg, klass)
+
     def execute_int_add_ovf(self, _, x, y):
         try:
             z = ovfcheck(x + y)
@@ -300,6 +339,18 @@
         p = lltype.cast_opaque_ptr(lltype.Ptr(descr.S), p)
         setattr(p, descr.fieldname, support.cast_arg(descr.FIELD, newvalue))
 
+    def execute_arraylen_gc(self, descr, a):
+        array = a._obj.container
+        return array.getlength()
+
+    def execute_setarrayitem_gc(self, descr, a, index, item):
+        array = a._obj.container
+        array.setitem(index, support.cast_arg(descr.A.OF, item))
+
+    def execute_getarrayitem_gc(self, descr, a, index):
+        array = a._obj.container
+        return support.cast_result(descr.A.OF, array.getitem(index))
+
 def _setup():
     def _make_impl_from_blackhole_interp(opname):
         from pypy.jit.metainterp.blackhole import BlackholeInterpreter
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to