Author: Ronan Lamy <[email protected]>
Branch: py2-mappingproxy
Changeset: r86113:3555af06864f
Date: 2016-08-04 18:58 +0100
http://bitbucket.org/pypy/pypy/changeset/3555af06864f/
Log: Make cls->tp_dict be a real dict while cls.__dict__ returns a proxy
diff --git a/pypy/module/cpyext/test/test_typeobject.py
b/pypy/module/cpyext/test/test_typeobject.py
--- a/pypy/module/cpyext/test/test_typeobject.py
+++ b/pypy/module/cpyext/test/test_typeobject.py
@@ -293,12 +293,21 @@
])
obj = foo.new()
assert module.read_tp_dict(obj) == foo.fooType.copy
- assert type(module.get_type_dict(obj)) is dict
+ d = module.get_type_dict(obj)
+ assert type(d) is dict
+ d["_some_attribute"] = 1
+ assert type(obj)._some_attribute == 1
+ del d["_some_attribute"]
+
d = module.get_type_dict(1)
assert type(d) is dict
- d["_some_attribute"] = 1
- assert int._some_attribute == 1
- del d["_some_attribute"]
+ try:
+ d["_some_attribute"] = 1
+ except TypeError: # on PyPy, int.__dict__ is really immutable
+ pass
+ else:
+ assert int._some_attribute == 1
+ del d["_some_attribute"]
def test_custom_allocation(self):
foo = self.import_module("foo")
diff --git a/pypy/module/cpyext/typeobject.py b/pypy/module/cpyext/typeobject.py
--- a/pypy/module/cpyext/typeobject.py
+++ b/pypy/module/cpyext/typeobject.py
@@ -272,12 +272,12 @@
if len(slot_names) == 1:
if not getattr(pto, slot_names[0]):
setattr(pto, slot_names[0], slot_func_helper)
- elif (w_type.getname(space) in ('list', 'tuple') and
+ elif (w_type.getname(space) in ('list', 'tuple') and
slot_names[0] == 'c_tp_as_number'):
# XXX hack - hwo can we generalize this? The problem is method
# names like __mul__ map to more than one slot, and we have no
# convenient way to indicate which slots CPython have filled
- #
+ #
# We need at least this special case since Numpy checks that
# (list, tuple) do __not__ fill tp_as_number
pass
@@ -860,8 +860,8 @@
if w_obj.is_cpytype():
Py_DecRef(space, pto.c_tp_dict)
- w_dict = w_obj.getdict(space)
- pto.c_tp_dict = make_ref(space, w_dict)
+ w_dict = w_obj.getdict(space)
+ pto.c_tp_dict = make_ref(space, w_dict)
@cpython_api([PyTypeObjectPtr, PyTypeObjectPtr], rffi.INT_real,
error=CANNOT_FAIL)
def PyType_IsSubtype(space, a, b):
diff --git a/pypy/objspace/std/typeobject.py b/pypy/objspace/std/typeobject.py
--- a/pypy/objspace/std/typeobject.py
+++ b/pypy/objspace/std/typeobject.py
@@ -3,8 +3,8 @@
from pypy.interpreter.baseobjspace import W_Root, SpaceCache
from pypy.interpreter.error import OperationError, oefmt
from pypy.interpreter.function import Function, StaticMethod
-from pypy.interpreter.typedef import weakref_descr, GetSetProperty,\
- descr_get_dict, dict_descr, Member, TypeDef
+from pypy.interpreter.typedef import (
+ weakref_descr, GetSetProperty, dict_descr, Member, TypeDef)
from pypy.interpreter.astcompiler.misc import mangle
from pypy.module.__builtin__ import abstractinst
@@ -485,16 +485,14 @@
self.getdictvalue(self.space, attr)
del self.lazyloaders
- def getdict(self, space): # returning a dict-proxy!
+ def getdict(self, space):
from pypy.objspace.std.classdict import ClassDictStrategy
from pypy.objspace.std.dictmultiobject import W_DictObject
- from pypy.objspace.std.dictproxyobject import W_DictProxyObject
if self.lazyloaders:
self._cleanup_() # force un-lazification
strategy = space.fromcache(ClassDictStrategy)
storage = strategy.erase(self)
- w_dict = W_DictObject(space, strategy, storage)
- return W_DictProxyObject(w_dict)
+ return W_DictObject(space, strategy, storage)
def is_heaptype(self):
return self.flag_heaptype
@@ -912,13 +910,20 @@
return space.newbool(
abstractinst.p_recursive_isinstance_type_w(space, w_inst, w_obj))
+def type_get_dict(space, w_cls):
+ from pypy.objspace.std.dictproxyobject import W_DictProxyObject
+ w_dict = w_cls.getdict(space)
+ if w_dict is None:
+ return space.w_None
+ return W_DictProxyObject(w_dict)
+
W_TypeObject.typedef = TypeDef("type",
__new__ = gateway.interp2app(descr__new__),
__name__ = GetSetProperty(descr_get__name__, descr_set__name__),
__bases__ = GetSetProperty(descr_get__bases__, descr_set__bases__),
__base__ = GetSetProperty(descr__base),
__mro__ = GetSetProperty(descr_get__mro__),
- __dict__ = GetSetProperty(descr_get_dict),
+ __dict__=GetSetProperty(type_get_dict),
__doc__ = GetSetProperty(descr__doc),
mro = gateway.interp2app(descr_mro),
__flags__ = GetSetProperty(descr__flags),
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit