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:
Guido van Rossum 1997-01-18 08:02:57 +00:00
parent a412d24be0
commit 7b89b6a660

View file

@ -205,13 +205,14 @@ newcodeobject(argcount, nlocals, stacksize, flags,
err_badcall(); err_badcall();
return NULL; 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; ) { for (i = gettuplesize(names); --i >= 0; ) {
object *v = gettupleitem(names, i); object *v = gettupleitem(names, i);
if (v == NULL || !is_stringobject(v)) { if (v == NULL || !is_stringobject(v)) {
err_badcall(); err_badcall();
return NULL; return NULL;
} }
PyString_InternInPlace(&PyTuple_GET_ITEM(names, i));
} }
for (i = gettuplesize(varnames); --i >= 0; ) { for (i = gettuplesize(varnames); --i >= 0; ) {
object *v = gettupleitem(varnames, i); object *v = gettupleitem(varnames, i);
@ -219,6 +220,20 @@ newcodeobject(argcount, nlocals, stacksize, flags,
err_badcall(); err_badcall();
return NULL; 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); co = NEWOBJ(codeobject, &Codetype);
if (co != NULL) { if (co != NULL) {
@ -620,7 +635,7 @@ com_addopnamestr(c, op, name)
com_mangle(c, name, buffer, (int)sizeof(buffer))) com_mangle(c, name, buffer, (int)sizeof(buffer)))
name = buffer; name = buffer;
#endif #endif
if (name == NULL || (v = newstringobject(name)) == NULL) { if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
c->c_errors++; c->c_errors++;
i = 255; i = 255;
} }
@ -986,7 +1001,7 @@ com_argument(c, n, pkeywords)
com_error(c, SyntaxError, "keyword can't be an expression"); com_error(c, SyntaxError, "keyword can't be an expression");
} }
else { else {
object *v = newstringobject(STR(m)); object *v = PyString_InternFromString(STR(m));
if (v != NULL && *pkeywords == NULL) if (v != NULL && *pkeywords == NULL)
*pkeywords = newdictobject(); *pkeywords = newdictobject();
if (v == NULL || *pkeywords == NULL) if (v == NULL || *pkeywords == NULL)
@ -1973,7 +1988,7 @@ com_newlocal(c, name)
struct compiling *c; struct compiling *c;
char *name; char *name;
{ {
object *nameval = newstringobject(name); object *nameval = PyString_InternFromString(name);
int i; int i;
if (nameval == NULL) { if (nameval == NULL) {
c->c_errors++; c->c_errors++;
@ -2563,7 +2578,7 @@ com_classdef(c, n)
object *v; object *v;
REQ(n, classdef); REQ(n, classdef);
/* classdef: class NAME ['(' testlist ')'] ':' suite */ /* 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++; c->c_errors++;
return; return;
} }
@ -3186,8 +3201,8 @@ jcompile(n, filename, base)
consts = listtuple(sc.c_consts); consts = listtuple(sc.c_consts);
names = listtuple(sc.c_names); names = listtuple(sc.c_names);
varnames = listtuple(sc.c_varnames); varnames = listtuple(sc.c_varnames);
filename = newstringobject(sc.c_filename); filename = PyString_InternFromString(sc.c_filename);
name = newstringobject(sc.c_name); name = PyString_InternFromString(sc.c_name);
if (!err_occurred()) if (!err_occurred())
co = newcodeobject(sc.c_argcount, co = newcodeobject(sc.c_argcount,
sc.c_nlocals, sc.c_nlocals,