Hi,

in process of ripping out the exec statement, I stumbled over the
following function in symtable.c (line 468ff):

------------------------------------------------------------------------------------
/* Check for illegal statements in unoptimized namespaces */
static int
check_unoptimized(const PySTEntryObject* ste) {
        char buf[300];
        const char* trailer;

        if (ste->ste_type != FunctionBlock || !ste->ste_unoptimized
            || !(ste->ste_free || ste->ste_child_free))
                return 1;

        trailer = (ste->ste_child_free ?
                       "contains a nested function with free variables" :
                               "is a nested function");

        switch (ste->ste_unoptimized) {
        case OPT_TOPLEVEL: /* exec / import * at top-level is fine */
        case OPT_EXEC: /* qualified exec is fine */
                return 1;
        case OPT_IMPORT_STAR:
                PyOS_snprintf(buf, sizeof(buf),
                              "import * is not allowed in function '%.100s' "
                              "because it is %s",
                              PyString_AS_STRING(ste->ste_name), trailer);
                break;
        case OPT_BARE_EXEC:
                PyOS_snprintf(buf, sizeof(buf),
                              "unqualified exec is not allowed in function "
                              "'%.100s' it %s",
                              PyString_AS_STRING(ste->ste_name), trailer);
                break;
        default:
                PyOS_snprintf(buf, sizeof(buf),
                              "function '%.100s' uses import * and bare exec, "
                              "which are illegal because it %s",
                              PyString_AS_STRING(ste->ste_name), trailer);
                break;
        }

        PyErr_SetString(PyExc_SyntaxError, buf);
        PyErr_SyntaxLocation(ste->ste_table->st_filename,
                             ste->ste_opt_lineno);
        return 0;
}
--------------------------------------------------------------------------------------

Of course, this check can't be made at compile time if exec() is a function.
(You can even outsmart it currently by giving explicit None arguments to the
exec statement)

So my question is: is this check required, and can it be done at execution time
instead?

Comparing the exec code to execfile(), only this can be the cause for the
extra precaution:
(from Python/ceval.c, function exec_statement)

        if (plain)
                PyFrame_LocalsToFast(f, 0);

Georg

_______________________________________________
Python-3000 mailing list
[email protected]
http://mail.python.org/mailman/listinfo/python-3000
Unsubscribe: 
http://mail.python.org/mailman/options/python-3000/archive%40mail-archive.com

Reply via email to