Commit f609654b authored by Benjamin Peterson's avatar Benjamin Peterson

handle dict subclasses gracefully in PyArg_ValidateKeywordArguments

parent 12ae290b
...@@ -8,10 +8,13 @@ import gc, weakref ...@@ -8,10 +8,13 @@ import gc, weakref
class DictTest(unittest.TestCase): class DictTest(unittest.TestCase):
def test_invalid_keyword_arguments(self): def test_invalid_keyword_arguments(self):
with self.assertRaises(TypeError): class Custom(dict):
dict(**{1 : 2}) pass
with self.assertRaises(TypeError): for invalid in {1 : 2}, Custom({1 : 2}):
{}.update(**{1 : 2}) with self.assertRaises(TypeError):
dict(**invalid)
with self.assertRaises(TypeError):
{}.update(**invalid)
def test_constructor(self): def test_constructor(self):
# calling built-in types without argument must return empty # calling built-in types without argument must return empty
......
...@@ -26,6 +26,11 @@ Library ...@@ -26,6 +26,11 @@ Library
- Issue #10429: IMAP.starttls() stored the capabilities as bytes objects, - Issue #10429: IMAP.starttls() stored the capabilities as bytes objects,
rather than strings. rather than strings.
C-API
-----
- Loosen PyArg_ValidateKeywordArguments to allow dict subclasses.
What's New in Python 3.2 Alpha 4? What's New in Python 3.2 Alpha 4?
================================= =================================
......
...@@ -454,7 +454,7 @@ _PyDict_HasOnlyStringKeys(PyObject *dict) ...@@ -454,7 +454,7 @@ _PyDict_HasOnlyStringKeys(PyObject *dict)
{ {
Py_ssize_t pos = 0; Py_ssize_t pos = 0;
PyObject *key, *value; PyObject *key, *value;
assert(PyDict_CheckExact(dict)); assert(PyDict_Check(dict));
/* Shortcut */ /* Shortcut */
if (((PyDictObject *)dict)->ma_lookup == lookdict_unicode) if (((PyDictObject *)dict)->ma_lookup == lookdict_unicode)
return 1; return 1;
......
...@@ -1394,7 +1394,7 @@ _PyArg_VaParseTupleAndKeywords_SizeT(PyObject *args, ...@@ -1394,7 +1394,7 @@ _PyArg_VaParseTupleAndKeywords_SizeT(PyObject *args,
int int
PyArg_ValidateKeywordArguments(PyObject *kwargs) PyArg_ValidateKeywordArguments(PyObject *kwargs)
{ {
if (!PyDict_CheckExact(kwargs)) { if (!PyDict_Check(kwargs)) {
PyErr_BadInternalCall(); PyErr_BadInternalCall();
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment