Author: Maciej Fijalkowski <[email protected]>
Branch: optresult
Changeset: r77803:6de34441a3cc
Date: 2015-06-03 09:21 +0200
http://bitbucket.org/pypy/pypy/changeset/6de34441a3cc/
Log: start implementing virtual array of structs
diff --git a/rpython/jit/backend/llgraph/runner.py
b/rpython/jit/backend/llgraph/runner.py
--- a/rpython/jit/backend/llgraph/runner.py
+++ b/rpython/jit/backend/llgraph/runner.py
@@ -164,11 +164,16 @@
rffi.cast(TYPE, -1) == -1)
class ArrayDescr(AbstractDescr):
+ all_interiorfielddescrs = None
+
def __init__(self, A, runner):
self.A = self.OUTERA = A
if isinstance(A, lltype.Struct):
self.A = A._flds[A._arrayfld]
+ def get_all_fielddescrs(self):
+ return self.all_interiorfielddescrs
+
def __repr__(self):
return 'ArrayDescr(%r)' % (self.OUTERA,)
@@ -211,6 +216,9 @@
self.arraydescr = runner.arraydescrof(A)
self.fielddescr = runner.fielddescrof(A.OF, fieldname)
+ def get_arraydescr(self):
+ return self.arraydescr
+
def __repr__(self):
return 'InteriorFieldDescr(%r, %r)' % (self.A, self.fieldname)
diff --git a/rpython/jit/backend/llsupport/descr.py
b/rpython/jit/backend/llsupport/descr.py
--- a/rpython/jit/backend/llsupport/descr.py
+++ b/rpython/jit/backend/llsupport/descr.py
@@ -223,6 +223,7 @@
lendescr = None
flag = '\x00'
vinfo = None
+ all_interiorfielddescrs = None
def __init__(self, basesize, itemsize, lendescr, flag):
self.basesize = basesize
@@ -230,6 +231,9 @@
self.lendescr = lendescr # or None, if no length
self.flag = flag
+ def get_all_fielddescrs(self):
+ return self.all_interiorfielddescrs
+
def is_array_of_pointers(self):
return self.flag == FLAG_POINTER
@@ -285,9 +289,13 @@
lendescr = get_field_arraylen_descr(gccache, ARRAY_OR_STRUCT)
flag = get_type_flag(ARRAY_INSIDE.OF)
arraydescr = ArrayDescr(basesize, itemsize, lendescr, flag)
+ cache[ARRAY_OR_STRUCT] = arraydescr
+ if isinstance(ARRAY_INSIDE.OF, lltype.Struct):
+ descrs = heaptracker.all_interiorfielddescrs(gccache,
+ ARRAY_INSIDE, get_field_descr=get_interiorfield_descr)
+ arraydescr.all_interiorfielddescrs = descrs
if ARRAY_OR_STRUCT._gckind == 'gc':
gccache.init_array_descr(ARRAY_OR_STRUCT, arraydescr)
- cache[ARRAY_OR_STRUCT] = arraydescr
return arraydescr
diff --git a/rpython/jit/backend/x86/test/test_basic.py
b/rpython/jit/backend/x86/test/test_basic.py
--- a/rpython/jit/backend/x86/test/test_basic.py
+++ b/rpython/jit/backend/x86/test/test_basic.py
@@ -32,10 +32,5 @@
res = self.meta_interp(f, [31], enable_opts='')
assert res == -4
- def test_r_dict(self):
- # a Struct that belongs to the hash table is not seen as being
- # included in the larger Array
- py.test.skip("issue with ll2ctypes")
-
def test_free_object(self):
py.test.skip("issue of freeing, probably with ll2ctypes")
diff --git a/rpython/jit/metainterp/history.py
b/rpython/jit/metainterp/history.py
--- a/rpython/jit/metainterp/history.py
+++ b/rpython/jit/metainterp/history.py
@@ -168,7 +168,7 @@
return ConstPtr(lltype.nullptr(llmemory.GCREF.TO))
elif lltype.typeOf(value) == lltype.Signed:
return ConstInt(value)
- elif not we_are_translated() and type(value) is bool:
+ elif isinstance(value, bool):
return ConstInt(int(value))
elif isinstance(value, float):
return ConstFloat(value)
@@ -762,7 +762,7 @@
op = ResOperation(opnum, argboxes, descr)
if value is None:
assert op.type == 'v'
- elif not we_are_translated() and type(value) is bool:
+ elif isinstance(value, bool):
assert op.type == 'i'
op.setint(int(value))
elif isinstance(value, float):
diff --git a/rpython/jit/metainterp/optimizeopt/info.py
b/rpython/jit/metainterp/optimizeopt/info.py
--- a/rpython/jit/metainterp/optimizeopt/info.py
+++ b/rpython/jit/metainterp/optimizeopt/info.py
@@ -260,7 +260,6 @@
self._items = [None] * (size * lgt)
def _compute_index(self, index, fielddescr):
- raise Exception("implement virtual array of structs")
one_size = len(fielddescr.get_arraydescr().get_all_fielddescrs())
return index * one_size + fielddescr.fielddescr.get_index()
diff --git a/rpython/jit/metainterp/test/test_executor.py
b/rpython/jit/metainterp/test/test_executor.py
--- a/rpython/jit/metainterp/test/test_executor.py
+++ b/rpython/jit/metainterp/test/test_executor.py
@@ -2,7 +2,7 @@
import sys, random
from rpython.rlib.rarithmetic import r_uint, intmask
from rpython.jit.metainterp.executor import execute, wrap_constant
-from rpython.jit.metainterp.executor import execute_varargs, _execute_nonspec
+from rpython.jit.metainterp.executor import execute_varargs, _execute_arglist
from rpython.jit.metainterp.resoperation import rop, opname, opclasses,\
InputArgInt, InputArgFloat, InputArgRef
from rpython.jit.metainterp.history import ConstInt, ConstPtr, ConstFloat
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit