diff --git a/Include/bltinmodule.h b/Include/bltinmodule.h index c94cf636d74..2f4c12013df 100644 --- a/Include/bltinmodule.h +++ b/Include/bltinmodule.h @@ -30,9 +30,7 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. /* Built-in module interface */ -extern object *getbuiltin PROTO((object *)); -extern object *getbuiltins PROTO((char *)); -extern int setbuiltin PROTO((char *, object *)); +extern object *getbuiltindict PROTO(()); #ifdef __cplusplus } diff --git a/Include/ceval.h b/Include/ceval.h index 796b11aca26..d1020aaab03 100644 --- a/Include/ceval.h +++ b/Include/ceval.h @@ -32,10 +32,12 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. object *call_object PROTO((object *, object *)); +object *getbuiltins PROTO((void)); object *getglobals PROTO((void)); object *getlocals PROTO((void)); object *getowner PROTO((void)); object *getframe PROTO((void)); +int getrestricted PROTO((void)); void flushline PROTO((void)); diff --git a/Include/frameobject.h b/Include/frameobject.h index f8ad710918f..2179de8d8f1 100644 --- a/Include/frameobject.h +++ b/Include/frameobject.h @@ -40,6 +40,7 @@ typedef struct _frame { OB_HEAD struct _frame *f_back; /* previous frame, or NULL */ codeobject *f_code; /* code segment */ + object *f_builtins; /* builtin symbol table (dictobject) */ object *f_globals; /* global symbol table (dictobject) */ object *f_locals; /* local symbol table (dictobject) */ object *f_owner; /* owner (e.g. class or module) or NULL */ @@ -52,6 +53,7 @@ typedef struct _frame { int f_iblock; /* index in f_blockstack */ int f_lasti; /* Last instruction if called */ int f_lineno; /* Current line number */ + int f_restricted; /* Flag set if restricted operations in this scope */ object *f_trace; /* Trace function */ } frameobject; diff --git a/Include/rename1.h b/Include/rename1.h index 2ae9326e953..90f129f1abf 100755 --- a/Include/rename1.h +++ b/Include/rename1.h @@ -269,6 +269,7 @@ typedef struct methodlist PyMethodDef; #define PyEval_CallObject call_object #define PyEval_EvalCode eval_code #define Py_FlushLine flushline +#define PyEval_GetBuiltins getbuiltins #define PyEval_GetGlobals getglobals #define PyEval_GetLocals getlocals #define PyEval_InitThreads init_save_thread @@ -287,7 +288,7 @@ typedef struct methodlist PyMethodDef; #define PyImport_Init initimport #define PyImport_ReloadModule reload_module #define PyNumber_Coerce coerce -#define PyBuiltin_GetObject getbuiltin +#define PyBuiltin_GetDict getbuiltindict #define PyBuiltin_Init initbuiltin #define PyMarshal_Init initmarshal #define PyMarshal_ReadLongFromFile rd_long @@ -317,7 +318,7 @@ typedef struct methodlist PyMethodDef; #define PyRun_InteractiveLoop run_tty_loop #define PyMember_Get getmember #define PyMember_Set setmember -#define Py_InitModule initmodule +#define Py_InitModule(name, methods) initmodule(name, methods) #define Py_BuildValue mkvalue #define Py_VaBuildValue vmkvalue #define PyArg_Parse getargs diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index 59e15e1f4bd..5577f035c06 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -392,6 +392,17 @@ builtin_eval(self, args) &Mappingtype, &globals, &Mappingtype, &locals)) return NULL; + if (globals == NULL) { + globals = getglobals(); + if (globals == NULL) + return NULL; + } + if (locals == NULL) + locals = globals; + if (dictlookup(globals, "__builtins__") == NULL) { + if (dictinsert(globals, "__builtins__", getbuiltins()) != 0) + return NULL; + } if (is_codeobject(cmd)) return eval_code((codeobject *) cmd, globals, locals, (object *)NULL, (object *)NULL); @@ -428,6 +439,17 @@ builtin_execfile(self, args) &Mappingtype, &globals, &Mappingtype, &locals)) return NULL; + if (globals == NULL) { + globals = getglobals(); + if (globals == NULL) + return NULL; + } + if (locals == NULL) + locals = globals; + if (dictlookup(globals, "__builtins__") == NULL) { + if (dictinsert(globals, "__builtins__", getbuiltins()) != 0) + return NULL; + } BGN_SAVE fp = fopen(filename, "r"); END_SAVE @@ -725,6 +747,7 @@ builtin_input(self, args) object *line; char *str; object *res; + object *globals, *locals; line = builtin_raw_input(self, args); if (line == NULL) @@ -733,7 +756,13 @@ builtin_input(self, args) return NULL; while (*str == ' ' || *str == '\t') str++; - res = run_string(str, eval_input, (object *)NULL, (object *)NULL); + globals = getglobals(); + locals = getlocals(); + if (dictlookup(globals, "__builtins__") == NULL) { + if (dictinsert(globals, "__builtins__", getbuiltins()) != 0) + return NULL; + } + res = run_string(str, eval_input, globals, locals); DECREF(line); return res; } @@ -1363,25 +1392,9 @@ static struct methodlist builtin_methods[] = { static object *builtin_dict; object * -getbuiltin(name) - object *name; +getbuiltindict() { - return mappinglookup(builtin_dict, name); -} - -object * -getbuiltins(name) - char *name; -{ - return dictlookup(builtin_dict, name); -} - -int -setbuiltin(cname, value) - char *cname; - object *value; -{ - return dictinsert(builtin_dict, cname, value); + return builtin_dict; } /* Predefined exceptions */ diff --git a/Python/ceval.c b/Python/ceval.c index 410384ee94f..79874ef4d3a 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -33,7 +33,6 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include "eval.h" #include "ceval.h" #include "opcode.h" -#include "bltinmodule.h" #include "traceback.h" #include "graminit.h" #include "pythonrun.h" @@ -285,7 +284,6 @@ eval_code(co, globals, locals, owner, arg) char *name; /* Name used by some instructions */ int needmerge = 0; /* Set if need to merge locals back at end */ int defmode = 0; /* Default access mode for new variables */ - int ticker_count = 10; /* Check for intr every Nth instruction */ #ifdef LLTRACE int lltrace; #endif @@ -325,16 +323,9 @@ eval_code(co, globals, locals, owner, arg) #define POP() BASIC_POP() #endif - if (globals == NULL) { - globals = getglobals(); - if (locals == NULL) { - locals = getlocals(); - needmerge = 1; - } - } - else { - if (locals == NULL) - locals = globals; + if (globals == NULL || locals == NULL) { + err_setstr(SystemError, "eval_code: NULL globals or locals"); + return NULL; } #ifdef LLTRACE @@ -385,10 +376,6 @@ eval_code(co, globals, locals, owner, arg) } } - x = sysget("check_interval"); - if (x != NULL && is_intobject(x)) - ticker_count = getintvalue(x); - next_instr = GETUSTRINGVALUE(f->f_code->co_code); stack_pointer = f->f_valuestack; @@ -417,7 +404,7 @@ eval_code(co, globals, locals, owner, arg) } if (--ticker < 0) { - ticker = ticker_count; + ticker = sys_checkinterval; if (sigcheck()) { why = WHY_EXCEPTION; goto on_error; @@ -745,7 +732,7 @@ eval_code(co, globals, locals, owner, arg) /* Print value except if procedure result */ /* Before printing, also assign to '_' */ if (v != None && - (err = setbuiltin("_", v)) == 0 && + (err = dictinsert(f->f_builtins, "_", v)) == 0 && !suppress_print) { flushline(); x = sysget("stdout"); @@ -1157,7 +1144,7 @@ eval_code(co, globals, locals, owner, arg) x = dict2lookup(f->f_globals, w); if (x == NULL) { err_clear(); - x = getbuiltin(w); + x = dict2lookup(f->f_builtins, w); if (x == NULL) { err_setval(NameError, w); break; @@ -1179,7 +1166,7 @@ eval_code(co, globals, locals, owner, arg) x = dict2lookup(f->f_globals, w); if (x == NULL) { err_clear(); - x = getbuiltin(w); + x = dict2lookup(f->f_builtins, w); if (x == NULL) { err_setval(NameError, w); break; @@ -1324,7 +1311,7 @@ eval_code(co, globals, locals, owner, arg) case IMPORT_NAME: w = GETNAMEV(oparg); - x = getbuiltins("__import__"); + x = dictlookup(f->f_builtins, "__import__"); if (x == NULL) { err_setstr(ImportError, "__import__ not found"); @@ -1700,6 +1687,15 @@ call_trace(p_trace, p_newtrace, f, msg, arg) } } +object * +getbuiltins() +{ + if (current_frame == NULL) + return NULL; + else + return current_frame->f_builtins; +} + object * getlocals() { @@ -1733,6 +1729,12 @@ getframe() return (object *)current_frame; } +int +getrestricted() +{ + return current_frame == NULL ? 0 : current_frame->f_restricted; +} + void flushline() { @@ -2660,6 +2662,8 @@ exec_statement(prog, globals, locals) "exec 2nd/3rd args must be dict or None"); return -1; } + if (dictlookup(globals, "__builtins__") == NULL) + dictinsert(globals, "__builtins__", current_frame->f_builtins); if (is_codeobject(prog)) { if (eval_code((codeobject *) prog, globals, locals, (object *)NULL, (object *)NULL) == NULL) diff --git a/Python/import.c b/Python/import.c index ef24883ac5e..1d9ea35c5bf 100644 --- a/Python/import.c +++ b/Python/import.c @@ -32,6 +32,7 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include "import.h" #include "errcode.h" #include "sysmodule.h" +#include "bltinmodule.h" #include "pythonrun.h" #include "marshal.h" #include "compile.h" @@ -147,6 +148,10 @@ exec_code_module(name, co) if (m == NULL) return NULL; d = getmoduledict(m); + if (dictlookup(d, "__builtins__") == NULL) { + if (dictinsert(d, "__builtins__", getbuiltindict()) != 0) + return NULL; + } v = eval_code((codeobject *)co, d, d, d, (object *)NULL); if (v == NULL) return NULL; diff --git a/Python/pythonrun.c b/Python/pythonrun.c index c706081c68d..a25cbba848f 100644 --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -32,6 +32,7 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include "graminit.h" #include "errcode.h" #include "sysmodule.h" +#include "bltinmodule.h" #include "compile.h" #include "eval.h" #include "ceval.h" @@ -48,6 +49,7 @@ extern char *getpythonpath(); extern grammar gram; /* From graminit.c */ /* Forward */ +static void initmain PROTO((void)); static object *run_err_node PROTO((node *n, char *filename, object *globals, object *locals)); static object *run_node PROTO((node *n, char *filename, @@ -83,6 +85,24 @@ initall() setpythonpath(getpythonpath()); initsigs(); /* Signal handling stuff, including initintr() */ + + initmain(); +} + +/* Create __main__ module */ + +static void +initmain() +{ + object *m, *d; + m = add_module("__main__"); + if (m == NULL) + fatal("can't create __main__ module"); + d = getmoduledict(m); + if (dictlookup(d, "__builtins__") == NULL) { + if (dictinsert(d, "__builtins__", getbuiltindict())) + fatal("can't add __builtins__ to __main__"); + } } /* Parse input from a file and execute it */