X-Git-Url: https://git.distorted.org.uk/~mdw/catacomb-python/blobdiff_plain/ed7fea3d6f7f374818adee895174f8b09d5da016..8900d271da338c38ee55ee700b3420fb48fcd032:/catacomb/__init__.py diff --git a/catacomb/__init__.py b/catacomb/__init__.py index 53d7cea..ff771b9 100644 --- a/catacomb/__init__.py +++ b/catacomb/__init__.py @@ -27,6 +27,9 @@ from __future__ import with_statement from binascii import hexlify as _hexify, unhexlify as _unhexify from contextlib import contextmanager as _ctxmgr +try: import DLFCN as _dlfcn +except ImportError: _dlfcn = None +import os as _os from struct import pack as _pack import sys as _sys import types as _types @@ -34,14 +37,46 @@ import types as _types ###-------------------------------------------------------------------------- ### Import the main C extension module. +try: + _dlflags = _odlflags = _sys.getdlopenflags() +except AttributeError: + _dlflags = _odlflags = -1 + +## Set the `deep binding' flag. Python has its own different MD5 +## implementation, and some distributions export `md5_init' and friends so +## they override our versions, which doesn't end well. Figure out how to +## turn this flag on so we don't have the problem. +if _dlflags >= 0: + try: _dlflags |= _dlfcn.RTLD_DEEPBIND + except AttributeError: + try: _dlflags |= _os.RTLD_DEEPBIND + except AttributeError: + if _os.uname()[0] == 'Linux': _dlflags |= 8 # magic knowledge + else: pass # can't do this. + _sys.setdlopenflags(_dlflags) + import _base +if _odlflags >= 0: + _sys.setdlopenflags(_odlflags) + +del _dlflags, _odlflags + ###-------------------------------------------------------------------------- ### Basic stuff. ## For the benefit of the default keyreporter, we need the program name. _base._ego(_sys.argv[0]) +## Register our module. +_base._set_home_module(_sys.modules[__name__]) +def default_lostexchook(why, ty, val, tb): + """`catacomb.lostexchook(WHY, TY, VAL, TB)' reports lost exceptions.""" + _sys.stderr.write("\n\n!!! LOST EXCEPTION: %s\n" % why) + _sys.excepthook(ty, val, tb) + _sys.stderr.write("\n") +lostexchook = default_lostexchook + ## How to fix a name back into the right identifier. Alas, the rules are not ## consistent. def _fixname(name): @@ -203,7 +238,7 @@ class _ShakeBase (_HashBase): ## Delegate methods... def copy(me): new = me.__class__(); new._copy(me) - def _copy(me, other): me._h = other._h + def _copy(me, other): me._h = other._h.copy() def hash(me, m): me._h.hash(m); return me def xof(me): me._h.xof(); return me def get(me, n): return me._h.get(n)