Add warnings for assignment or deletion of variables and attributes

named 'None'.  Still to do: function definition parameter lists, and
function call keyword arguments.
This commit is contained in:
Guido van Rossum 2002-08-16 02:13:49 +00:00
parent b081e0c74c
commit 3ac99d4910
1 changed files with 27 additions and 0 deletions

View File

@ -574,6 +574,7 @@ block_pop(struct compiling *c, int type)
/* Prototype forward declarations */ /* Prototype forward declarations */
static int issue_warning(char *, char *, int);
static int com_init(struct compiling *, char *); static int com_init(struct compiling *, char *);
static void com_free(struct compiling *); static void com_free(struct compiling *);
static void com_push(struct compiling *, int); static void com_push(struct compiling *, int);
@ -988,6 +989,23 @@ com_lookup_arg(PyObject *dict, PyObject *name)
return PyInt_AS_LONG(v); return PyInt_AS_LONG(v);
} }
static int
none_assignment_check(struct compiling *c, char *name, int assigning)
{
if (name[0] == 'N' && strcmp(name, "None") == 0) {
char *msg;
if (assigning)
msg = "assigment to None";
else
msg = "deleting None";
if (issue_warning(msg, c->c_filename, c->c_lineno) < 0) {
c->c_errors++;
return -1;
}
}
return 0;
}
static void static void
com_addop_varname(struct compiling *c, int kind, char *name) com_addop_varname(struct compiling *c, int kind, char *name)
{ {
@ -997,6 +1015,13 @@ com_addop_varname(struct compiling *c, int kind, char *name)
int op = STOP_CODE; int op = STOP_CODE;
char buffer[MANGLE_LEN]; char buffer[MANGLE_LEN];
if (kind != VAR_LOAD &&
none_assignment_check(c, name, kind == VAR_STORE))
{
c->c_errors++;
i = 255;
goto done;
}
if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer))) if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
name = buffer; name = buffer;
if (name == NULL || (v = PyString_InternFromString(name)) == NULL) { if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
@ -2489,6 +2514,8 @@ com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
static void static void
com_assign_attr(struct compiling *c, node *n, int assigning) com_assign_attr(struct compiling *c, node *n, int assigning)
{ {
if (none_assignment_check(c, STR(n), assigning))
return;
com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n); com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
com_pop(c, assigning ? 2 : 1); com_pop(c, assigning ? 2 : 1);
} }