diff options
author | Yit Phang Khoo <khooyp@sourceware.org> | 2012-09-13 21:49:32 +0000 |
---|---|---|
committer | Yit Phang Khoo <khooyp@sourceware.org> | 2012-09-13 21:49:32 +0000 |
commit | b9516fa158d68eedaa9e2191e38e7a1acfcfee77 (patch) | |
tree | 926b28e504ad9bd54ef5159de82f25fac6244401 /gdb/python/lib | |
parent | 121c73f33ac3a687cd7fba2b6711c308f715e44a (diff) | |
download | gdb-b9516fa158d68eedaa9e2191e38e7a1acfcfee77.zip gdb-b9516fa158d68eedaa9e2191e38e7a1acfcfee77.tar.gz gdb-b9516fa158d68eedaa9e2191e38e7a1acfcfee77.tar.bz2 |
Refactor Python "gdb" module into a proper Python package, by introducing
a new "_gdb" module for code implemented in C, and using reload/__import__
instead of exec.
gdb/
* python/lib/gdb/__init__.py: Import * from _gdb.
(GdbOutputFile, sys.stdout, GdbOutputErrorFile, sys.stderr,
prompt_hook, sys.argv): Moved from finish_python_initialization.
(pretty_printers, PYTHONDIR): Moved from _initialize_python.
(packages, auto_load_packages): New list and function replacing
module_dict and auto-loading code, using __file__ instead of
gdb.PYTHONDIR and reload/__import__ instead of exec.
(GdbSetPythonDirectory): Replacing function of the same name
from finish_python_initialization, using reload/__import__ instead
of exec, as well as call auto_load_packages.
* python/py-prettyprint.c (find_pretty_printer_from_gdb): Check
gdb_python_module and not gdb_module.
* python/python-internal.h (gdb_python_module): Declare.
* python/python.c (gdb_python_module): New global.
(before_prompt_hook): Check gdb_python_module and not gdb_module.
(_initialize_python): Rename gdb module to _gdb.
Move gdb.PYTHONDIR and gdb.pretty_printer to lib/gdb/__init__.py.
(finish_python_initialization): Move Python code to
lib/gdb/__init__.py; instead, set up sys.path and import gdb into
__main__.
gdb/testsuite/
* gdb.python/python.exp (Test stderr location): Update module
location of GDB-specific sys.stderr.
(Test stdout location): Ditto for sys.stdout.
Diffstat (limited to 'gdb/python/lib')
-rw-r--r-- | gdb/python/lib/gdb/__init__.py | 121 |
1 files changed, 103 insertions, 18 deletions
diff --git a/gdb/python/lib/gdb/__init__.py b/gdb/python/lib/gdb/__init__.py index a82e495..0e020fe 100644 --- a/gdb/python/lib/gdb/__init__.py +++ b/gdb/python/lib/gdb/__init__.py @@ -14,28 +14,113 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. import traceback +import os +import sys +import _gdb + +from _gdb import * + +class GdbOutputFile: + def close(self): + # Do nothing. + return None + + def isatty(self): + return False + + def write(self, s): + write(s, stream=STDOUT) + + def writelines(self, iterable): + for line in iterable: + self.write(line) + + def flush(self): + flush() + +sys.stdout = GdbOutputFile() + +class GdbOutputErrorFile: + def close(self): + # Do nothing. + return None + + def isatty(self): + return False + + def write(self, s): + write(s, stream=STDERR) + + def writelines(self, iterable): + for line in iterable: + self.write(line) + + def flush(self): + flush() + +sys.stderr = GdbOutputErrorFile() + +# Default prompt hook does nothing. +prompt_hook = None + +# Ensure that sys.argv is set to something. +# We do not use PySys_SetArgvEx because it did not appear until 2.6.6. +sys.argv = [''] + +# Initial pretty printers. +pretty_printers = [] + +# Convenience variable to GDB's python directory +PYTHONDIR = os.path.dirname(os.path.dirname(__file__)) # Auto-load all functions/commands. -# Modules to auto-load, and the paths where those modules exist. +# Packages to auto-load. -module_dict = { - 'gdb.function': os.path.join(gdb.PYTHONDIR, 'gdb', 'function'), - 'gdb.command': os.path.join(gdb.PYTHONDIR, 'gdb', 'command') -} +packages = [ + 'function', + 'command' +] -# Iterate the dictionary, collating the Python files in each module +# pkgutil.iter_modules is not available prior to Python 2.6. Instead, +# manually iterate the list, collating the Python files in each module # path. Construct the module name, and import. -for module, location in module_dict.iteritems(): - if os.path.exists(location): - py_files = filter(lambda x: x.endswith('.py') and x != '__init__.py', - os.listdir(location)) - - for py_file in py_files: - # Construct from foo.py, gdb.module.foo - py_file = module + '.' + py_file[:-3] - try: - exec('import ' + py_file) - except: - print >> sys.stderr, traceback.format_exc() +def auto_load_packages(): + for package in packages: + location = os.path.join(os.path.dirname(__file__), package) + if os.path.exists(location): + py_files = filter(lambda x: x.endswith('.py') + and x != '__init__.py', + os.listdir(location)) + + for py_file in py_files: + # Construct from foo.py, gdb.module.foo + modname = "%s.%s.%s" % ( __name__, package, py_file[:-3] ) + try: + if modname in sys.modules: + # reload modules with duplicate names + reload(__import__(modname)) + else: + __import__(modname) + except: + print >> sys.stderr, traceback.format_exc() + +auto_load_packages() + +def GdbSetPythonDirectory(dir): + """Update sys.path, reload gdb and auto-load packages.""" + global PYTHONDIR + + try: + sys.path.remove(PYTHONDIR) + except ValueError: + pass + sys.path.insert(0, dir) + + PYTHONDIR = dir + + # note that reload overwrites the gdb module without deleting existing + # attributes + reload(__import__(__name__)) + auto_load_packages() |