mirror of
https://github.com/python/cpython.git
synced 2025-08-04 08:59:19 +00:00
Make identifiers str (not str8) objects throughout.
This affects the parser, various object implementations, and all places that put identifiers into C string literals. In testing, a number of crashes occurred as code would fail when the recursion limit was reached (such as the Unicode interning dictionary having key/value pairs where key is not value). To solve these, I added an overflowed flag, which allows for 50 more recursions after the limit was reached and the exception was raised, and a recursion_critical flag, which indicates that recursion absolutely must be allowed, i.e. that a certain call must not cause a stack overflow exception. There are still some places where both str and str8 are accepted as identifiers; these should eventually be removed.
This commit is contained in:
parent
38e43c25ee
commit
5b222135f8
40 changed files with 462 additions and 289 deletions
|
@ -1040,7 +1040,7 @@ dict_subscript(dictobject *mp, register PyObject *key)
|
|||
static PyObject *missing_str = NULL;
|
||||
if (missing_str == NULL)
|
||||
missing_str =
|
||||
PyString_InternFromString("__missing__");
|
||||
PyUnicode_InternFromString("__missing__");
|
||||
missing = _PyType_Lookup(mp->ob_type, missing_str);
|
||||
if (missing != NULL)
|
||||
return PyObject_CallFunctionObjArgs(missing,
|
||||
|
@ -2073,7 +2073,7 @@ PyObject *
|
|||
PyDict_GetItemString(PyObject *v, const char *key)
|
||||
{
|
||||
PyObject *kv, *rv;
|
||||
kv = PyString_FromString(key);
|
||||
kv = PyUnicode_FromString(key);
|
||||
if (kv == NULL)
|
||||
return NULL;
|
||||
rv = PyDict_GetItem(v, kv);
|
||||
|
@ -2086,10 +2086,10 @@ PyDict_SetItemString(PyObject *v, const char *key, PyObject *item)
|
|||
{
|
||||
PyObject *kv;
|
||||
int err;
|
||||
kv = PyString_FromString(key);
|
||||
kv = PyUnicode_FromString(key);
|
||||
if (kv == NULL)
|
||||
return -1;
|
||||
PyString_InternInPlace(&kv); /* XXX Should we really? */
|
||||
PyUnicode_InternInPlace(&kv); /* XXX Should we really? */
|
||||
err = PyDict_SetItem(v, kv, item);
|
||||
Py_DECREF(kv);
|
||||
return err;
|
||||
|
@ -2100,7 +2100,7 @@ PyDict_DelItemString(PyObject *v, const char *key)
|
|||
{
|
||||
PyObject *kv;
|
||||
int err;
|
||||
kv = PyString_FromString(key);
|
||||
kv = PyUnicode_FromString(key);
|
||||
if (kv == NULL)
|
||||
return -1;
|
||||
err = PyDict_DelItem(v, kv);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue