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