Author: Armin Rigo <ar...@tunes.org> Branch: reverse-debugger Changeset: r86179:423804b65c4c Date: 2016-08-12 21:27 +0200 http://bitbucket.org/pypy/pypy/changeset/423804b65c4c/
Log: Install a minimal __import__ hook to use interactively. At least this version doesn't try to look for a file in the current directory, e.g. if we do "import math" instead a package, which just fails with "Attempted to do I/O". diff --git a/pypy/interpreter/reverse_debugging.py b/pypy/interpreter/reverse_debugging.py --- a/pypy/interpreter/reverse_debugging.py +++ b/pypy/interpreter/reverse_debugging.py @@ -321,18 +321,52 @@ revdb.send_output(s) revdb.send_output("\n") +@gateway.unwrap_spec(name='str0', level=int) +def revdb_importhook(space, name, w_globals=None, + w_locals=None, w_fromlist=None, level=-1): + # Incredibly simplified version of __import__, which only returns + # already-imported modules and doesn't call any custom import + # hooks. Recognizes only absolute imports. With a 'fromlist' + # argument that is a non-empty list, returns the module 'name3' if + # the 'name' argument is 'name1.name2.name3'. With an empty or + # None 'fromlist' argument, returns the module 'name1' instead. + return space.appexec([space.wrap(name), w_fromlist or space.w_None, + space.wrap(level), space.wrap(space.sys)], + """(name, fromlist, level, sys): + if level > 0: + raise ImportError("only absolute imports are " + "supported in the debugger") + basename = name.split('.')[0] + try: + basemod = sys.modules[basename] + mod = sys.modules[name] + except KeyError: + raise ImportError("'%s' not found or not imported yet " + "(the debugger can't import new modules, " + "and only supports absolute imports)" % (name,)) + if fromlist: + return mod + return basemod + """) + @specialize.memo() def get_revdb_displayhook(space): return space.wrap(gateway.interp2app(revdb_displayhook)) +@specialize.memo() +def get_revdb_importhook(space): + return space.wrap(gateway.interp2app(revdb_importhook)) + def prepare_print_environment(space): assert not dbstate.standard_code w_revdb_output = space.wrap(W_RevDBOutput(space)) w_displayhook = get_revdb_displayhook(space) + w_import = get_revdb_importhook(space) space.sys.setdictvalue(space, 'stdout', w_revdb_output) space.sys.setdictvalue(space, 'stderr', w_revdb_output) space.sys.setdictvalue(space, 'displayhook', w_displayhook) + space.builtin.setdictvalue(space, '__import__', w_import) def command_print(cmd, expression): frame = fetch_cur_frame() _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit