[pypy-commit] pypy optresult-unroll: fixes to the backend

fijal noreply at buildbot.pypy.org
Thu Aug 27 14:42:28 CEST 2015


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: optresult-unroll
Changeset: r79257:40407d03401e
Date: 2015-08-27 14:42 +0200
http://bitbucket.org/pypy/pypy/changeset/40407d03401e/

Log:	fixes to the backend

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
@@ -106,12 +106,17 @@
     field_size = 0
     flag = '\x00'
 
-    def __init__(self, name, offset, field_size, flag, index_in_parent=0):
+    def __init__(self, name, offset, field_size, flag, index_in_parent=0,
+                 is_pure=False):
         self.name = name
         self.offset = offset
         self.field_size = field_size
         self.flag = flag
         self.index = index_in_parent
+        self._is_pure = is_pure
+
+    def is_always_pure(self):
+        return self._is_pure
 
     def __repr__(self):
         return 'FieldDescr<%s>' % (self.name,)
@@ -184,7 +189,9 @@
         flag = get_type_flag(FIELDTYPE)
         name = '%s.%s' % (STRUCT._name, fieldname)
         index_in_parent = heaptracker.get_fielddescr_index_in(STRUCT, fieldname)
-        fielddescr = FieldDescr(name, offset, size, flag, index_in_parent)
+        is_pure = STRUCT._immutable_field(fieldname)
+        fielddescr = FieldDescr(name, offset, size, flag, index_in_parent,
+                                is_pure)
         cachedict = cache.setdefault(STRUCT, {})
         cachedict[fieldname] = fielddescr
         if STRUCT is rclass.OBJECT:
@@ -234,15 +241,19 @@
     vinfo = None
     all_interiorfielddescrs = None
 
-    def __init__(self, basesize, itemsize, lendescr, flag):
+    def __init__(self, basesize, itemsize, lendescr, flag, is_pure=False):
         self.basesize = basesize
         self.itemsize = itemsize
         self.lendescr = lendescr    # or None, if no length
         self.flag = flag
+        self._is_pure = is_pure
 
     def get_all_fielddescrs(self):
         return self.all_interiorfielddescrs
 
+    def is_always_pure(self):
+        return self._is_pure
+
     def is_array_of_pointers(self):
         return self.flag == FLAG_POINTER
 
@@ -297,7 +308,8 @@
         else:
             lendescr = get_field_arraylen_descr(gccache, ARRAY_OR_STRUCT)
         flag = get_type_flag(ARRAY_INSIDE.OF)
-        arraydescr = ArrayDescr(basesize, itemsize, lendescr, flag)
+        is_pure = ARRAY_INSIDE._immutable_field(None)
+        arraydescr = ArrayDescr(basesize, itemsize, lendescr, flag, is_pure)
         cache[ARRAY_OR_STRUCT] = arraydescr
         if isinstance(ARRAY_INSIDE.OF, lltype.Struct):
             descrs = heaptracker.all_interiorfielddescrs(gccache,
diff --git a/rpython/jit/metainterp/compile.py b/rpython/jit/metainterp/compile.py
--- a/rpython/jit/metainterp/compile.py
+++ b/rpython/jit/metainterp/compile.py
@@ -328,7 +328,7 @@
                                              loop_data)
     except InvalidLoop:
         # Fall back on jumping to preamble
-        xxx
+        raise Exception("think about it")
         return None
 
     loop = partial_trace


More information about the pypy-commit mailing list