Author: Armin Rigo <[email protected]>
Branch: stm
Changeset: r51718:b6c8cd8207c6
Date: 2012-01-24 16:20 +0100
http://bitbucket.org/pypy/pypy/changeset/b6c8cd8207c6/

Log:    Add a new type of immutability: "mutable owned".

diff --git a/pypy/rpython/lltypesystem/lltype.py 
b/pypy/rpython/lltypesystem/lltype.py
--- a/pypy/rpython/lltypesystem/lltype.py
+++ b/pypy/rpython/lltypesystem/lltype.py
@@ -360,7 +360,7 @@
             return True
         if 'immutable_fields' in self._hints:
             try:
-                return self._hints['immutable_fields'].fields[field]
+                return self._hints['immutable_fields']._fields[field]
             except KeyError:
                 pass
         return False
diff --git a/pypy/rpython/ootypesystem/ootype.py 
b/pypy/rpython/ootypesystem/ootype.py
--- a/pypy/rpython/ootypesystem/ootype.py
+++ b/pypy/rpython/ootypesystem/ootype.py
@@ -272,7 +272,7 @@
             return True
         if 'immutable_fields' in self._hints:
             try:
-                return self._hints['immutable_fields'].fields[field]
+                return self._hints['immutable_fields']._fields[field]
             except KeyError:
                 pass
         return False
diff --git a/pypy/rpython/rclass.py b/pypy/rpython/rclass.py
--- a/pypy/rpython/rclass.py
+++ b/pypy/rpython/rclass.py
@@ -12,13 +12,13 @@
     def initialize(self, TYPE, fields):
         assert type(fields) is dict
         self.TYPE = TYPE
-        self.fields = fields
+        self._fields = fields
         for x in fields.itervalues():
             assert isinstance(x, ImmutableRanking)
 
     def all_immutable_fields(self):
         result = set()
-        for key, value in self.fields.iteritems():
+        for key, value in self._fields.iteritems():
             if value in (IR_IMMUTABLE, IR_IMMUTABLE_ARRAY):
                 result.add(key)
         return result
@@ -38,7 +38,11 @@
     def __repr__(self):
         return '<%s>' % self.name
 
+# IR_MUTABLE_OWNED means that the field is a regular mutable pointer field,
+# but as a pointer it is the only reference to whatever it points to.  This
+# is useful for STM support in PyFrame.
 IR_MUTABLE              = ImmutableRanking('mutable', False)
+IR_MUTABLE_OWNED        = ImmutableRanking("mutable_owned", False)
 IR_IMMUTABLE            = ImmutableRanking('immutable', True)
 IR_IMMUTABLE_ARRAY      = ImmutableRanking('immutable_array', True)
 IR_QUASIIMMUTABLE       = ImmutableRanking('quasiimmutable', False)
@@ -252,6 +256,9 @@
             elif name.endswith('?'):    # a quasi-immutable field
                 name = name[:-1]
                 rank = IR_QUASIIMMUTABLE
+            elif name.endswith('->...'):  # for stm_access_directly:
+                name = name[:-5]          # a mutable but owned object
+                rank = IR_MUTABLE_OWNED
             else:                       # a regular immutable/green field
                 rank = IR_IMMUTABLE
             try:
diff --git a/pypy/rpython/test/test_rclass.py b/pypy/rpython/test/test_rclass.py
--- a/pypy/rpython/test/test_rclass.py
+++ b/pypy/rpython/test/test_rclass.py
@@ -7,6 +7,7 @@
 from pypy.rpython.test.tool import BaseRtypingTest, LLRtypeMixin, OORtypeMixin
 from pypy.rpython.rclass import IR_IMMUTABLE, IR_IMMUTABLE_ARRAY
 from pypy.rpython.rclass import IR_QUASIIMMUTABLE, IR_QUASIIMMUTABLE_ARRAY
+from pypy.rpython.rclass import IR_MUTABLE_OWNED
 from pypy.rpython.error import TyperError
 from pypy.objspace.flow.model import summary
 
@@ -753,10 +754,10 @@
         t, typer, graph = self.gengraph(f, [])
         A_TYPE = deref(graph.getreturnvar().concretetype)
         accessor = A_TYPE._hints["immutable_fields"]
-        assert accessor.fields == {"inst_x": IR_IMMUTABLE,
-                                   "inst_y": IR_IMMUTABLE_ARRAY} or \
-               accessor.fields == {"ox": IR_IMMUTABLE,
-                                   "oy": IR_IMMUTABLE_ARRAY} # for ootype
+        assert accessor._fields == {"inst_x": IR_IMMUTABLE,
+                                    "inst_y": IR_IMMUTABLE_ARRAY} or \
+               accessor._fields == {"ox": IR_IMMUTABLE,
+                                    "oy": IR_IMMUTABLE_ARRAY} # for ootype
 
     def test_immutable_fields_subclass_1(self):
         from pypy.jit.metainterp.typesystem import deref
@@ -774,8 +775,8 @@
         t, typer, graph = self.gengraph(f, [])
         B_TYPE = deref(graph.getreturnvar().concretetype)
         accessor = B_TYPE._hints["immutable_fields"]
-        assert accessor.fields == {"inst_x": IR_IMMUTABLE} or \
-               accessor.fields == {"ox": IR_IMMUTABLE} # for ootype
+        assert accessor._fields == {"inst_x": IR_IMMUTABLE} or \
+               accessor._fields == {"ox": IR_IMMUTABLE} # for ootype
 
     def test_immutable_fields_subclass_2(self):
         from pypy.jit.metainterp.typesystem import deref
@@ -794,10 +795,10 @@
         t, typer, graph = self.gengraph(f, [])
         B_TYPE = deref(graph.getreturnvar().concretetype)
         accessor = B_TYPE._hints["immutable_fields"]
-        assert accessor.fields == {"inst_x": IR_IMMUTABLE,
-                                   "inst_y": IR_IMMUTABLE} or \
-               accessor.fields == {"ox": IR_IMMUTABLE,
-                                   "oy": IR_IMMUTABLE} # for ootype
+        assert accessor._fields == {"inst_x": IR_IMMUTABLE,
+                                    "inst_y": IR_IMMUTABLE} or \
+               accessor._fields == {"ox": IR_IMMUTABLE,
+                                    "oy": IR_IMMUTABLE} # for ootype
 
     def test_immutable_fields_only_in_subclass(self):
         from pypy.jit.metainterp.typesystem import deref
@@ -815,8 +816,8 @@
         t, typer, graph = self.gengraph(f, [])
         B_TYPE = deref(graph.getreturnvar().concretetype)
         accessor = B_TYPE._hints["immutable_fields"]
-        assert accessor.fields == {"inst_y": IR_IMMUTABLE} or \
-               accessor.fields == {"oy": IR_IMMUTABLE} # for ootype
+        assert accessor._fields == {"inst_y": IR_IMMUTABLE} or \
+               accessor._fields == {"oy": IR_IMMUTABLE} # for ootype
 
     def test_immutable_forbidden_inheritance_1(self):
         from pypy.rpython.rclass import ImmutableConflictError
@@ -860,8 +861,8 @@
         except AttributeError:
             A_TYPE = B_TYPE._superclass  # for ootype
         accessor = A_TYPE._hints["immutable_fields"]
-        assert accessor.fields == {"inst_v": IR_IMMUTABLE} or \
-               accessor.fields == {"ov": IR_IMMUTABLE} # for ootype
+        assert accessor._fields == {"inst_v": IR_IMMUTABLE} or \
+               accessor._fields == {"ov": IR_IMMUTABLE} # for ootype
 
     def test_immutable_subclass_1(self):
         from pypy.rpython.rclass import ImmutableConflictError
@@ -925,12 +926,12 @@
         t, typer, graph = self.gengraph(f, [])
         B_TYPE = deref(graph.getreturnvar().concretetype)
         accessor = B_TYPE._hints["immutable_fields"]
-        assert accessor.fields == {"inst_y": IR_IMMUTABLE,
-                                   "inst_b": IR_QUASIIMMUTABLE} or \
-               accessor.fields == {"ox": IR_IMMUTABLE,
-                                   "oy": IR_IMMUTABLE,
-                                   "oa": IR_QUASIIMMUTABLE,
-                                   "ob": IR_QUASIIMMUTABLE} # for ootype
+        assert accessor._fields == {"inst_y": IR_IMMUTABLE,
+                                    "inst_b": IR_QUASIIMMUTABLE} or \
+               accessor._fields == {"ox": IR_IMMUTABLE,
+                                    "oy": IR_IMMUTABLE,
+                                    "oa": IR_QUASIIMMUTABLE,
+                                    "ob": IR_QUASIIMMUTABLE} # for ootype
         found = []
         for op in graph.startblock.operations:
             if op.opname == 'jit_force_quasi_immutable':
@@ -950,8 +951,8 @@
         t, typer, graph = self.gengraph(f, [])
         A_TYPE = deref(graph.getreturnvar().concretetype)
         accessor = A_TYPE._hints["immutable_fields"]
-        assert accessor.fields == {"inst_c": IR_QUASIIMMUTABLE_ARRAY} or \
-               accessor.fields == {"oc": IR_QUASIIMMUTABLE_ARRAY} # for ootype
+        assert accessor._fields == {"inst_c": IR_QUASIIMMUTABLE_ARRAY} or \
+               accessor._fields == {"oc": IR_QUASIIMMUTABLE_ARRAY} # for ootype
         found = []
         for op in graph.startblock.operations:
             if op.opname == 'jit_force_quasi_immutable':
@@ -1171,6 +1172,20 @@
             else:
                 assert TYPE._hints["stm_access_directly"] == True
 
+    def test_mutable_but_owned(self):
+        class A(object):
+            _immutable_fields_ = ['a->...']
+        class B(object):
+            pass
+        def f(n):
+            a = A()
+            a.a = B()
+            return a
+        t, typer, graph = self.gengraph(f, [int])
+        A_TYPE = graph.getreturnvar().concretetype.TO
+        accessor = A_TYPE._hints["immutable_fields"]
+        assert accessor._fields == {"inst_a": IR_MUTABLE_OWNED}
+
 
 class TestOOtype(BaseTestRclass, OORtypeMixin):
 
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to