Author: Carl Friedrich Bolz <[email protected]>
Branch:
Changeset: r78892:dd5e385a1000
Date: 2015-08-11 15:23 +0200
http://bitbucket.org/pypy/pypy/changeset/dd5e385a1000/
Log: (arigo, cfbolz): make import_from_mixin deal with _immutable_fields_
diff --git a/rpython/rlib/objectmodel.py b/rpython/rlib/objectmodel.py
--- a/rpython/rlib/objectmodel.py
+++ b/rpython/rlib/objectmodel.py
@@ -806,10 +806,14 @@
flatten = {}
caller = sys._getframe(1)
caller_name = caller.f_globals.get('__name__')
+ immutable_fields = []
for base in inspect.getmro(M):
if base is object:
continue
for key, value in base.__dict__.items():
+ if key == '_immutable_fields_':
+ immutable_fields.extend(value)
+ continue
if key.startswith('__') and key.endswith('__'):
if key not in special_methods:
continue
@@ -836,3 +840,5 @@
raise Exception("import_from_mixin: would overwrite the value "
"already defined locally for %r" % (key,))
target[key] = value
+ if immutable_fields:
+ target['_immutable_fields_'] = target.get('_immutable_fields_', []) +
immutable_fields
diff --git a/rpython/rlib/test/test_objectmodel.py
b/rpython/rlib/test/test_objectmodel.py
--- a/rpython/rlib/test/test_objectmodel.py
+++ b/rpython/rlib/test/test_objectmodel.py
@@ -675,3 +675,44 @@
import_from_mixin(M)
assert A.f is not M.f
assert A.f.__module__ != M.f.__module__
+
+
+def test_import_from_mixin_immutable_fields():
+ class A(object):
+ _immutable_fields_ = ['a']
+
+ class B(object):
+ _immutable_fields_ = ['b']
+ import_from_mixin(A)
+
+ assert B._immutable_fields_ == ['b', 'a']
+ assert A._immutable_fields_ == ['a']
+
+
+ class B(object):
+ import_from_mixin(A)
+
+ assert B._immutable_fields_ == ['a']
+
+ class C(A):
+ _immutable_fields_ = ['c']
+
+
+ class B(object):
+ import_from_mixin(C)
+
+ assert B._immutable_fields_ == ['c', 'a']
+
+ class B(object):
+ _immutable_fields_ = ['b']
+ import_from_mixin(C)
+
+ assert B._immutable_fields_ == ['b', 'c', 'a']
+
+
+ class B(object):
+ _immutable_fields_ = ['b']
+ class BA(B):
+ import_from_mixin(C)
+
+ assert BA._immutable_fields_ == ['c', 'a']
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit