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

Reply via email to