mirror of https://github.com/python/cpython
Intern all names and varnames in newcodeobject(), plus those string
literals that look like identifiers. Also intern all strings used as names during the compilation.
This commit is contained in:
parent
a412d24be0
commit
7b89b6a660
|
@ -205,13 +205,14 @@ newcodeobject(argcount, nlocals, stacksize, flags,
|
|||
err_badcall();
|
||||
return NULL;
|
||||
}
|
||||
/* Make sure names and varnames are all strings */
|
||||
/* Make sure names and varnames are all strings, & intern them */
|
||||
for (i = gettuplesize(names); --i >= 0; ) {
|
||||
object *v = gettupleitem(names, i);
|
||||
if (v == NULL || !is_stringobject(v)) {
|
||||
err_badcall();
|
||||
return NULL;
|
||||
}
|
||||
PyString_InternInPlace(&PyTuple_GET_ITEM(names, i));
|
||||
}
|
||||
for (i = gettuplesize(varnames); --i >= 0; ) {
|
||||
object *v = gettupleitem(varnames, i);
|
||||
|
@ -219,6 +220,20 @@ newcodeobject(argcount, nlocals, stacksize, flags,
|
|||
err_badcall();
|
||||
return NULL;
|
||||
}
|
||||
PyString_InternInPlace(&PyTuple_GET_ITEM(varnames, i));
|
||||
}
|
||||
/* Intern selected string constants */
|
||||
for (i = gettuplesize(consts); --i >= 0; ) {
|
||||
object *v = gettupleitem(consts, i);
|
||||
int n;
|
||||
char *p;
|
||||
if (!is_stringobject(v))
|
||||
continue;
|
||||
p = getstringvalue(v);
|
||||
if (strspn(p, "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz")
|
||||
!= getstringsize(v))
|
||||
continue;
|
||||
PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
|
||||
}
|
||||
co = NEWOBJ(codeobject, &Codetype);
|
||||
if (co != NULL) {
|
||||
|
@ -620,7 +635,7 @@ com_addopnamestr(c, op, name)
|
|||
com_mangle(c, name, buffer, (int)sizeof(buffer)))
|
||||
name = buffer;
|
||||
#endif
|
||||
if (name == NULL || (v = newstringobject(name)) == NULL) {
|
||||
if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
|
||||
c->c_errors++;
|
||||
i = 255;
|
||||
}
|
||||
|
@ -986,7 +1001,7 @@ com_argument(c, n, pkeywords)
|
|||
com_error(c, SyntaxError, "keyword can't be an expression");
|
||||
}
|
||||
else {
|
||||
object *v = newstringobject(STR(m));
|
||||
object *v = PyString_InternFromString(STR(m));
|
||||
if (v != NULL && *pkeywords == NULL)
|
||||
*pkeywords = newdictobject();
|
||||
if (v == NULL || *pkeywords == NULL)
|
||||
|
@ -1973,7 +1988,7 @@ com_newlocal(c, name)
|
|||
struct compiling *c;
|
||||
char *name;
|
||||
{
|
||||
object *nameval = newstringobject(name);
|
||||
object *nameval = PyString_InternFromString(name);
|
||||
int i;
|
||||
if (nameval == NULL) {
|
||||
c->c_errors++;
|
||||
|
@ -2563,7 +2578,7 @@ com_classdef(c, n)
|
|||
object *v;
|
||||
REQ(n, classdef);
|
||||
/* classdef: class NAME ['(' testlist ')'] ':' suite */
|
||||
if ((v = newstringobject(STR(CHILD(n, 1)))) == NULL) {
|
||||
if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
|
||||
c->c_errors++;
|
||||
return;
|
||||
}
|
||||
|
@ -3186,8 +3201,8 @@ jcompile(n, filename, base)
|
|||
consts = listtuple(sc.c_consts);
|
||||
names = listtuple(sc.c_names);
|
||||
varnames = listtuple(sc.c_varnames);
|
||||
filename = newstringobject(sc.c_filename);
|
||||
name = newstringobject(sc.c_name);
|
||||
filename = PyString_InternFromString(sc.c_filename);
|
||||
name = PyString_InternFromString(sc.c_name);
|
||||
if (!err_occurred())
|
||||
co = newcodeobject(sc.c_argcount,
|
||||
sc.c_nlocals,
|
||||
|
|
Loading…
Reference in New Issue