[Python-3000] Ripping out exec

Guido van Rossum guido at python.org
Fri Sep 1 20:37:55 CEST 2006


I would just rip it out.

On 9/1/06, Georg Brandl <g.brandl at gmx.net> wrote:
> 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
> Python-3000 at python.org
> http://mail.python.org/mailman/listinfo/python-3000
> Unsubscribe: http://mail.python.org/mailman/options/python-3000/guido%40python.org
>


-- 
--Guido van Rossum (home page: http://www.python.org/~guido/)


More information about the Python-3000 mailing list