Unverified Kaydet (Commit) b7e1eff8 authored tarafından Serhiy Storchaka's avatar Serhiy Storchaka Kaydeden (comit) GitHub

bpo-33299: Return an object itself for some types in _PyCode_ConstantKey(). (GH-6513)

üst 9009f3e3
...@@ -488,14 +488,21 @@ _PyCode_ConstantKey(PyObject *op) ...@@ -488,14 +488,21 @@ _PyCode_ConstantKey(PyObject *op)
{ {
PyObject *key; PyObject *key;
/* Py_None and Py_Ellipsis are singleton */ /* Py_None and Py_Ellipsis are singletons. */
if (op == Py_None || op == Py_Ellipsis if (op == Py_None || op == Py_Ellipsis
|| PyLong_CheckExact(op) || PyLong_CheckExact(op)
|| PyBool_Check(op)
|| PyBytes_CheckExact(op)
|| PyUnicode_CheckExact(op) || PyUnicode_CheckExact(op)
/* code_richcompare() uses _PyCode_ConstantKey() internally */ /* code_richcompare() uses _PyCode_ConstantKey() internally */
|| PyCode_Check(op)) { || PyCode_Check(op))
{
/* Objects of these types are always different from object of other
* type and from tuples. */
Py_INCREF(op);
key = op;
}
else if (PyBool_Check(op) || PyBytes_CheckExact(op)) {
/* Make booleans different from integers 0 and 1.
* Avoid BytesWarning from comparing bytes with strings. */
key = PyTuple_Pack(2, Py_TYPE(op), op); key = PyTuple_Pack(2, Py_TYPE(op), op);
} }
else if (PyFloat_CheckExact(op)) { else if (PyFloat_CheckExact(op)) {
......
...@@ -5299,10 +5299,12 @@ dict_keys_inorder(PyObject *dict, Py_ssize_t offset) ...@@ -5299,10 +5299,12 @@ dict_keys_inorder(PyObject *dict, Py_ssize_t offset)
return NULL; return NULL;
while (PyDict_Next(dict, &pos, &k, &v)) { while (PyDict_Next(dict, &pos, &k, &v)) {
i = PyLong_AS_LONG(v); i = PyLong_AS_LONG(v);
/* The keys of the dictionary are tuples. (see compiler_add_o /* The keys of the dictionary can be tuples wrapping a contant.
* and _PyCode_ConstantKey). The object we want is always second, * (see compiler_add_o and _PyCode_ConstantKey). In that case
* though. */ * the object we want is always second. */
k = PyTuple_GET_ITEM(k, 1); if (PyTuple_CheckExact(k)) {
k = PyTuple_GET_ITEM(k, 1);
}
Py_INCREF(k); Py_INCREF(k);
assert((i - offset) < size); assert((i - offset) < size);
assert((i - offset) >= 0); assert((i - offset) >= 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