Skip to content

Commit

Permalink
merge 3.3
Browse files Browse the repository at this point in the history
  • Loading branch information
benjaminp committed Oct 31, 2012
2 parents 42124a7 + 2c05a2e commit 3cb9024
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 9 deletions.
16 changes: 12 additions & 4 deletions Lib/test/test_descr.py
Original file line number Diff line number Diff line change
Expand Up @@ -4502,11 +4502,19 @@ def test_qualname(self):
self.assertEqual(float.real.__qualname__, 'float.real')
self.assertEqual(int.__add__.__qualname__, 'int.__add__')

class X:
pass
with self.assertRaises(TypeError):
del X.__qualname__

self.assertRaises(TypeError, type.__dict__['__qualname__'].__set__,
str, 'Oink')

def test_qualname_dict(self):
ns = {'__qualname__': 'some.name'}
tp = type('Foo', (), ns)
self.assertEqual(tp.__qualname__, 'some.name')
self.assertEqual(tp.__dict__['__qualname__'], 'some.name')
self.assertNotIn('__qualname__', tp.__dict__)
self.assertEqual(ns, {'__qualname__': 'some.name'})

ns = {'__qualname__': 1}
Expand Down Expand Up @@ -4564,7 +4572,7 @@ def test_iter_keys(self):
keys = list(it)
keys.sort()
self.assertEqual(keys, ['__dict__', '__doc__', '__module__',
'__qualname__', '__weakref__', 'meth'])
'__weakref__', 'meth'])

@unittest.skipIf(hasattr(sys, 'gettrace') and sys.gettrace(),
'trace function introduces __local__')
Expand All @@ -4573,7 +4581,7 @@ def test_iter_values(self):
it = self.C.__dict__.values()
self.assertNotIsInstance(it, list)
values = list(it)
self.assertEqual(len(values), 6)
self.assertEqual(len(values), 5)

@unittest.skipIf(hasattr(sys, 'gettrace') and sys.gettrace(),
'trace function introduces __local__')
Expand All @@ -4584,7 +4592,7 @@ def test_iter_items(self):
keys = [item[0] for item in it]
keys.sort()
self.assertEqual(keys, ['__dict__', '__doc__', '__module__',
'__qualname__', '__weakref__', 'meth'])
'__weakref__', 'meth'])

def test_dict_type_with_metaclass(self):
# Testing type of __dict__ when metaclass set...
Expand Down
6 changes: 6 additions & 0 deletions Misc/NEWS
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,15 @@ Core and Builtins
Py_TPFLAGS_TYPE_SUBCLASS ((1 << 31). PyType_GetFlags() result type is
now unsigned too (unsigned long, instead of long).

- Fix segfaults on setting __qualname__ on builtin types and attempting to
delete it on any type.

- Issue #14625: Rewrite the UTF-32 decoder. It is now 3x to 4x faster. Patch
written by Serhiy Storchaka.

- Issue #16271: Fix strange bugs that resulted from __qualname__ appearing in a
class's __dict__ and on type.

- Issue #16197: Update winreg docstrings and documentation to match code.
Patch by Zachary Ware.

Expand Down
11 changes: 6 additions & 5 deletions Objects/typeobject.c
Original file line number Diff line number Diff line change
Expand Up @@ -311,6 +311,8 @@ type_set_qualname(PyTypeObject *type, PyObject *value, void *context)
{
PyHeapTypeObject* et;

if (!check_set_special_type_attr(type, value, "__qualname__"))
return -1;
if (!PyUnicode_Check(value)) {
PyErr_Format(PyExc_TypeError,
"can only assign string to %s.__qualname__, not '%s'",
Expand Down Expand Up @@ -2250,11 +2252,10 @@ type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds)
goto error;
}
}
else {
qualname = et->ht_name;
}
Py_INCREF(qualname);
et->ht_qualname = qualname;
et->ht_qualname = qualname ? qualname : et->ht_name;
Py_INCREF(et->ht_qualname);
if (qualname != NULL && PyDict_DelItem(dict, PyId___qualname__.object) < 0)
goto error;

/* Set tp_doc to a copy of dict['__doc__'], if the latter is there
and is a string. The __doc__ accessor will first look for tp_doc;
Expand Down

0 comments on commit 3cb9024

Please sign in to comment.