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