srcanamdw/codescanner/pyinstaller/iu.py
author noe\swadi
Thu, 18 Feb 2010 12:29:02 +0530
changeset 1 22878952f6e2
permissions -rw-r--r--
Committing the CodeScanner Core tool This component has been moved from the StaticAnaApps package. BUG : 5889 (http://developer.symbian.org/webbugs/show_bug.cgi?id=5889).
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     1
# Copyright (C) 2005, Giovanni Bajo
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     2
# Based on previous work under copyright (c) 2002 McMillan Enterprises, Inc.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     3
#
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     4
# This program is free software; you can redistribute it and/or
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     5
# modify it under the terms of the GNU General Public License
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     6
# as published by the Free Software Foundation; either version 2
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     7
# of the License, or (at your option) any later version.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     8
#
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     9
# In addition to the permissions in the GNU General Public License, the
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    10
# authors give you unlimited permission to link or embed the compiled
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    11
# version of this file into combinations with other programs, and to
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    12
# distribute those combinations without any restriction coming from the
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    13
# use of this file. (The General Public License restrictions do apply in
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    14
# other respects; for example, they cover modification of the file, and
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    15
# distribution when not linked into a combine executable.)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    16
#
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    17
# This program is distributed in the hope that it will be useful,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    18
# but WITHOUT ANY WARRANTY; without even the implied warranty of
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    19
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    20
# GNU General Public License for more details.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    21
#
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    22
# You should have received a copy of the GNU General Public License
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    23
# along with this program; if not, write to the Free Software
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    24
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    25
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    26
# **NOTE** This module is used during bootstrap. Import *ONLY* builtin modules.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    27
import sys
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    28
import imp
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    29
import marshal
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    30
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    31
try:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    32
    py_version = sys.version_info
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    33
except AttributeError:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    34
    py_version = (1,5)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    35
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    36
#=======================Owners==========================#
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    37
# An Owner does imports from a particular piece of turf
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    38
# That is, there's an Owner for each thing on sys.path
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    39
# There are owners for directories and .pyz files.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    40
# There could be owners for zip files, or even URLs.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    41
# A shadowpath (a dictionary mapping the names in
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    42
# sys.path to their owners) is used so that sys.path
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    43
# (or a package's __path__) is still a bunch of strings,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    44
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    45
STRINGTYPE = type('')
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    46
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    47
class Owner:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    48
    def __init__(self, path):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    49
        self.path = path
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    50
    def __str__(self):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    51
        return self.path
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    52
    def getmod(self, nm):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    53
        return None
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    54
class DirOwner(Owner):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    55
    def __init__(self, path):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    56
        if path == '':
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    57
            path = _os_getcwd()
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    58
        if not pathisdir(path):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    59
            raise ValueError, "%s is not a directory" % path
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    60
        Owner.__init__(self, path)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    61
    def getmod(self, nm, getsuffixes=imp.get_suffixes, loadco=marshal.loads, newmod=imp.new_module):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    62
        pth =  _os_path_join(self.path, nm)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    63
        possibles = [(pth, 0, None)]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    64
        if pathisdir(pth):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    65
            possibles.insert(0, (_os_path_join(pth, '__init__'), 1, pth))
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    66
        py = pyc = None
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    67
        for pth, ispkg, pkgpth in possibles:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    68
            for ext, mode, typ in getsuffixes():
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    69
                attempt = pth+ext
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    70
                try:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    71
                    st = _os_stat(attempt)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    72
                except:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    73
                    pass
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    74
                else:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    75
                    if typ == imp.C_EXTENSION:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    76
                        fp = open(attempt, 'rb')
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    77
                        mod = imp.load_module(nm, fp, attempt, (ext, mode, typ))
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    78
                        mod.__file__ = attempt
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    79
                        return mod
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    80
                    elif typ == imp.PY_SOURCE:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    81
                        py = (attempt, st)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    82
                    else:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    83
                        pyc = (attempt, st)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    84
            if py or pyc:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    85
                break
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    86
        if py is None and pyc is None:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    87
            return None
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    88
        while 1:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    89
            if pyc is None or py and pyc[1][8] < py[1][8]:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    90
                try:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    91
                    co = compile(open(py[0], 'r').read()+'\n', py[0], 'exec')
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    92
                    break
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    93
                except SyntaxError, e:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    94
                    print "Invalid syntax in %s" % py[0]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    95
                    print e.args
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    96
                    raise
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    97
            elif pyc:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    98
                stuff = open(pyc[0], 'rb').read()
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    99
                try:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   100
                    co = loadco(stuff[8:])
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   101
                    break
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   102
                except (ValueError, EOFError):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   103
                    pyc = None
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   104
            else:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   105
                return None
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   106
        mod = newmod(nm)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   107
        mod.__file__ = co.co_filename
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   108
        if ispkg:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   109
            mod.__path__ = [pkgpth]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   110
            subimporter = PathImportDirector(mod.__path__)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   111
            mod.__importsub__ = subimporter.getmod
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   112
        mod.__co__ = co
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   113
        return mod
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   114
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   115
_globalownertypes = [
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   116
    DirOwner,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   117
    Owner,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   118
]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   119
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   120
#===================Import Directors====================================#
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   121
# ImportDirectors live on the metapath
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   122
# There's one for builtins, one for frozen modules, and one for sys.path
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   123
# Windows gets one for modules gotten from the Registry
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   124
# Mac would have them for PY_RESOURCE modules etc.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   125
# A generalization of Owner - their concept of "turf" is broader
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   126
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   127
class ImportDirector(Owner):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   128
    pass
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   129
class BuiltinImportDirector(ImportDirector):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   130
    def __init__(self):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   131
        self.path = 'Builtins'
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   132
    def getmod(self, nm, isbuiltin=imp.is_builtin):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   133
        if isbuiltin(nm):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   134
            mod = imp.load_module(nm, None, nm, ('','',imp.C_BUILTIN))
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   135
            return mod
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   136
        return None
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   137
class FrozenImportDirector(ImportDirector):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   138
    def __init__(self):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   139
        self.path = 'FrozenModules'
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   140
    def getmod(self, nm, isfrozen=imp.is_frozen):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   141
        if isfrozen(nm):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   142
            mod = imp.load_module(nm, None, nm, ('','',imp.PY_FROZEN))
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   143
            if hasattr(mod, '__path__'):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   144
                mod.__importsub__ = lambda name, pname=nm, owner=self: owner.getmod(pname+'.'+name)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   145
            return mod
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   146
        return None
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   147
class RegistryImportDirector(ImportDirector):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   148
    # for Windows only
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   149
    def __init__(self):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   150
        self.path = "WindowsRegistry"
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   151
        self.map = {}
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   152
        try:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   153
            import win32api
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   154
##            import win32con
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   155
        except ImportError:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   156
            pass
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   157
        else:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   158
            HKEY_CURRENT_USER = -2147483647
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   159
            HKEY_LOCAL_MACHINE = -2147483646
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   160
            KEY_ALL_ACCESS = 983103
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   161
            KEY_READ = 131097
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   162
            subkey = r"Software\Python\PythonCore\%s\Modules" % sys.winver
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   163
            for root in (HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   164
                try:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   165
                    #hkey = win32api.RegOpenKeyEx(root, subkey, 0, KEY_ALL_ACCESS)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   166
                    hkey = win32api.RegOpenKeyEx(root, subkey, 0, KEY_READ)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   167
                except:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   168
                    pass
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   169
                else:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   170
                    numsubkeys, numvalues, lastmodified = win32api.RegQueryInfoKey(hkey)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   171
                    for i in range(numsubkeys):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   172
                        subkeyname = win32api.RegEnumKey(hkey, i)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   173
                        #hskey = win32api.RegOpenKeyEx(hkey, subkeyname, 0, KEY_ALL_ACCESS)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   174
                        hskey = win32api.RegOpenKeyEx(hkey, subkeyname, 0, KEY_READ)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   175
                        val = win32api.RegQueryValueEx(hskey, '')
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   176
                        desc = getDescr(val[0])
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   177
                        self.map[subkeyname] = (val[0], desc)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   178
                        hskey.Close()
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   179
                    hkey.Close()
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   180
                    break
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   181
    def getmod(self, nm):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   182
        stuff = self.map.get(nm)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   183
        if stuff:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   184
            fnm, desc = stuff
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   185
            fp = open(fnm, 'rb')
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   186
            mod = imp.load_module(nm, fp, fnm, desc)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   187
            mod.__file__ = fnm
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   188
            return mod
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   189
        return None
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   190
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   191
class PathImportDirector(ImportDirector):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   192
    def __init__(self, pathlist=None, importers=None, ownertypes=None):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   193
        if pathlist is None:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   194
            self.path = sys.path
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   195
        else:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   196
            self.path = pathlist
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   197
        if ownertypes == None:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   198
            self.ownertypes = _globalownertypes
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   199
        else:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   200
            self.ownertypes = ownertypes
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   201
        if importers:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   202
            self.shadowpath = importers
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   203
        else:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   204
            self.shadowpath = {}
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   205
        self.inMakeOwner = 0
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   206
        self.building = {}
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   207
    def getmod(self, nm):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   208
        mod = None
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   209
        for thing in self.path:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   210
            if type(thing) is STRINGTYPE:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   211
                owner = self.shadowpath.get(thing, -1)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   212
                if owner == -1:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   213
                    owner = self.shadowpath[thing] = self.makeOwner(thing)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   214
                if owner:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   215
                    mod = owner.getmod(nm)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   216
            else:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   217
                mod = thing.getmod(nm)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   218
            if mod:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   219
                break
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   220
        return mod
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   221
    def makeOwner(self, path):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   222
        if self.building.get(path):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   223
            return None
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   224
        self.building[path] = 1
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   225
        owner = None
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   226
        for klass in self.ownertypes:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   227
            try:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   228
                # this may cause an import, which may cause recursion
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   229
                # hence the protection
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   230
                owner = klass(path)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   231
            except:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   232
                pass
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   233
            else:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   234
                break
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   235
        del self.building[path]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   236
        return owner
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   237
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   238
def getDescr(fnm):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   239
    ext = getpathext(fnm)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   240
    for (suffix, mode, typ) in imp.get_suffixes():
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   241
        if suffix == ext:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   242
            return (suffix, mode, typ)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   243
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   244
#=================ImportManager============================#
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   245
# The one-and-only ImportManager
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   246
# ie, the builtin import
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   247
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   248
UNTRIED = -1
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   249
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   250
class ImportManager:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   251
    # really the equivalent of builtin import
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   252
    def __init__(self):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   253
        self.metapath = [
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   254
            BuiltinImportDirector(),
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   255
            FrozenImportDirector(),
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   256
            RegistryImportDirector(),
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   257
            PathImportDirector()
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   258
        ]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   259
        self.threaded = 0
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   260
        self.rlock = None
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   261
        self.locker = None
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   262
        self.setThreaded()
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   263
    def setThreaded(self):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   264
        thread = sys.modules.get('thread', None)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   265
        if thread and not self.threaded:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   266
##            print "iu setting threaded"
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   267
            self.threaded = 1
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   268
            self.rlock = thread.allocate_lock()
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   269
            self._get_ident = thread.get_ident
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   270
    def install(self):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   271
        import __builtin__
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   272
        __builtin__.__import__ = self.importHook
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   273
        __builtin__.reload = self.reloadHook
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   274
    def importHook(self, name, globals=None, locals=None, fromlist=None):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   275
        # first see if we could be importing a relative name
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   276
        #print "importHook(%s, %s, locals, %s)" % (name, globals['__name__'], fromlist)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   277
        _sys_modules_get = sys.modules.get
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   278
        contexts = [None]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   279
        if globals:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   280
            importernm = globals.get('__name__', '')
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   281
            if importernm:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   282
                if hasattr(_sys_modules_get(importernm), '__path__'):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   283
                    # If you use the "from __init__ import" syntax, the package
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   284
                    # name will have a __init__ in it. We want to strip it.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   285
                    if importernm[-len(".__init__"):] == ".__init__":
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   286
                        importernm = importernm[:-len(".__init__")]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   287
                    contexts.insert(0,importernm)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   288
                else:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   289
                    pkgnm = packagename(importernm)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   290
                    if pkgnm:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   291
                        contexts.insert(0,pkgnm)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   292
        # so contexts is [pkgnm, None] or just [None]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   293
        # now break the name being imported up so we get:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   294
        # a.b.c -> [a, b, c]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   295
        nmparts = namesplit(name)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   296
        _self_doimport = self.doimport
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   297
        threaded = self.threaded
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   298
        for context in contexts:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   299
            ctx = context
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   300
            for i in range(len(nmparts)):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   301
                nm = nmparts[i]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   302
                #print " importHook trying %s in %s" % (nm, ctx)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   303
                if ctx:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   304
                    fqname = ctx + '.' + nm
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   305
                else:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   306
                    fqname = nm
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   307
                if threaded:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   308
                    self._acquire()
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   309
                mod = _sys_modules_get(fqname, UNTRIED)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   310
                if mod is UNTRIED:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   311
                    try:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   312
                        mod = _self_doimport(nm, ctx, fqname)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   313
                    except:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   314
                        if threaded:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   315
                            self._release()
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   316
                        raise
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   317
                if threaded:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   318
                    self._release()
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   319
                if mod:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   320
                    ctx = fqname
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   321
                else:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   322
                    break
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   323
            else:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   324
                # no break, point i beyond end
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   325
                i = i + 1
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   326
            if i:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   327
                break
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   328
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   329
        if i<len(nmparts):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   330
            if ctx and hasattr(sys.modules[ctx], nmparts[i]):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   331
                #print "importHook done with %s %s %s (case 1)" % (name, globals['__name__'], fromlist)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   332
                return sys.modules[nmparts[0]]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   333
            del sys.modules[fqname]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   334
            raise ImportError, "No module named %s" % fqname
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   335
        if fromlist is None:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   336
            #print "importHook done with %s %s %s (case 2)" % (name, globals['__name__'], fromlist)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   337
            if context:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   338
                return sys.modules[context+'.'+nmparts[0]]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   339
            return sys.modules[nmparts[0]]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   340
        bottommod = sys.modules[ctx]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   341
        if hasattr(bottommod, '__path__'):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   342
            fromlist = list(fromlist)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   343
            i = 0
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   344
            while i < len(fromlist):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   345
                nm = fromlist[i]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   346
                if nm == '*':
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   347
                    fromlist[i:i+1] = list(getattr(bottommod, '__all__', []))
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   348
                    if i >= len(fromlist):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   349
                        break
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   350
                    nm = fromlist[i]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   351
                i = i + 1
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   352
                if not hasattr(bottommod, nm):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   353
                    if threaded:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   354
                        self._acquire()
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   355
                    try:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   356
                        mod = self.doimport(nm, ctx, ctx+'.'+nm)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   357
                    except:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   358
                        pass
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   359
                    if threaded:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   360
                        self._release()
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   361
        #print "importHook done with %s %s %s (case 3)" % (name, globals['__name__'], fromlist)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   362
        return bottommod
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   363
    def doimport(self, nm, parentnm, fqname, reload=0):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   364
        # Not that nm is NEVER a dotted name at this point
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   365
        #print "doimport(%s, %s, %s)" % (nm, parentnm, fqname)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   366
        if parentnm:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   367
            parent = sys.modules[parentnm]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   368
            if hasattr(parent, '__path__'):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   369
                importfunc = getattr(parent, '__importsub__', None)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   370
                if not importfunc:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   371
                    subimporter = PathImportDirector(parent.__path__)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   372
                    importfunc = parent.__importsub__ = subimporter.getmod
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   373
                mod = importfunc(nm)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   374
                if mod and not reload:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   375
                    setattr(parent, nm, mod)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   376
            else:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   377
                #print "..parent not a package"
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   378
                return None
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   379
        else:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   380
            # now we're dealing with an absolute import
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   381
            for director in self.metapath:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   382
                mod = director.getmod(nm)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   383
                if mod:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   384
                    break
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   385
        if mod:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   386
            mod.__name__ = fqname
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   387
            if reload:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   388
                sys.modules[fqname].__dict__.update(mod.__dict__)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   389
            else:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   390
                sys.modules[fqname] = mod
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   391
            if hasattr(mod, '__co__'):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   392
                co = mod.__co__
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   393
                del mod.__co__
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   394
                try:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   395
                    if reload:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   396
                        exec co in sys.modules[fqname].__dict__
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   397
                    else:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   398
                        exec co in mod.__dict__
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   399
                except:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   400
                    # In Python 2.4 and above, sys.modules is left clean
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   401
                    # after a broken import. We need to do the same to
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   402
                    # achieve perfect compatibility (see ticket #32).
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   403
                    if py_version >= (2,4,0):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   404
                        # FIXME: how can we recover from a broken reload()?
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   405
                        # Should we save the mod dict and restore it in case
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   406
                        # of failure?
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   407
                        if not reload:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   408
                            del sys.modules[fqname]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   409
                    raise
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   410
            if fqname == 'thread' and not self.threaded:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   411
##                print "thread detected!"
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   412
                self.setThreaded()
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   413
        else:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   414
            sys.modules[fqname] = None
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   415
        #print "..found %s" % mod
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   416
        return mod
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   417
    def reloadHook(self, mod):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   418
        fqnm = mod.__name__
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   419
        nm = namesplit(fqnm)[-1]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   420
        parentnm = packagename(fqnm)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   421
        newmod = self.doimport(nm, parentnm, fqnm, reload=1)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   422
        #mod.__dict__.update(newmod.__dict__)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   423
        return newmod
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   424
    def _acquire(self):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   425
        if self.rlock.locked():
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   426
            if self.locker == self._get_ident():
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   427
                self.lockcount = self.lockcount + 1
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   428
##                print "_acquire incrementing lockcount to", self.lockcount
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   429
                return
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   430
        self.rlock.acquire()
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   431
        self.locker = self._get_ident()
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   432
        self.lockcount = 0
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   433
##        print "_acquire first time!"
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   434
    def _release(self):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   435
        if self.lockcount:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   436
            self.lockcount = self.lockcount - 1
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   437
##            print "_release decrementing lockcount to", self.lockcount
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   438
        else:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   439
            self.locker = None
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   440
            self.rlock.release()
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   441
##            print "_release releasing lock!"
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   442
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   443
#=========some helper functions=============================#
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   444
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   445
def packagename(s):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   446
    for i in range(len(s)-1, -1, -1):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   447
        if s[i] == '.':
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   448
            break
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   449
    else:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   450
        return ''
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   451
    return s[:i]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   452
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   453
def namesplit(s):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   454
    rslt = []
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   455
    i = j = 0
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   456
    for j in range(len(s)):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   457
        if s[j] == '.':
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   458
            rslt.append(s[i:j])
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   459
            i = j+1
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   460
    if i < len(s):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   461
        rslt.append(s[i:])
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   462
    return rslt
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   463
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   464
def getpathext(fnm):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   465
    for i in range(len(fnm)-1, -1, -1):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   466
        if fnm[i] == '.':
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   467
            return fnm[i:]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   468
    return ''
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   469
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   470
def pathisdir(pathname):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   471
    "Local replacement for os.path.isdir()."
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   472
    try:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   473
        s = _os_stat(pathname)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   474
    except OSError:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   475
        return None
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   476
    return (s[0] & 0170000) == 0040000
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   477
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   478
_os_stat = _os_path_join = _os_getcwd = _os_path_dirname = None
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   479
def _os_bootstrap():
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   480
    "Set up 'os' module replacement functions for use during import bootstrap."
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   481
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   482
    names = sys.builtin_module_names
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   483
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   484
    join = dirname = None
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   485
    mindirlen = 0
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   486
    if 'posix' in names:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   487
        sep = '/'
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   488
        mindirlen = 1
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   489
        from posix import stat, getcwd
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   490
    elif 'nt' in names:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   491
        sep = '\\'
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   492
        mindirlen = 3
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   493
        from nt import stat, getcwd
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   494
    elif 'dos' in names:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   495
        sep = '\\'
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   496
        mindirlen = 3
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   497
        from dos import stat, getcwd
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   498
    elif 'os2' in names:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   499
        sep = '\\'
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   500
        from os2 import stat, getcwd
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   501
    elif 'mac' in names:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   502
        from mac import stat, getcwd
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   503
        def join(a, b):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   504
            if a == '':
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   505
                return b
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   506
            path = s
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   507
            if ':' not in a:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   508
                a = ':' + a
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   509
            if a[-1:] != ':':
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   510
                a = a + ':'
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   511
            return a + b
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   512
    else:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   513
        raise ImportError, 'no os specific module found'
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   514
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   515
    if join is None:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   516
        def join(a, b, sep=sep):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   517
            if a == '':
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   518
                return b
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   519
            lastchar = a[-1:]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   520
            if lastchar == '/' or lastchar == sep:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   521
                return a + b
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   522
            return a + sep + b
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   523
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   524
    if dirname is None:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   525
        def dirname(a, sep=sep, mindirlen=mindirlen):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   526
            for i in range(len(a)-1, -1, -1):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   527
                c = a[i]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   528
                if c == '/' or c == sep:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   529
                    if i < mindirlen:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   530
                        return a[:i+1]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   531
                    return a[:i]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   532
            return ''
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   533
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   534
    global _os_stat
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   535
    _os_stat = stat
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   536
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   537
    global _os_path_join
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   538
    _os_path_join = join
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   539
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   540
    global _os_path_dirname
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   541
    _os_path_dirname = dirname
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   542
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   543
    global _os_getcwd
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   544
    _os_getcwd = getcwd
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   545
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   546
_string_replace = _string_join = _string_split = None
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   547
def _string_bootstrap():
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   548
    """
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   549
    Set up 'string' module replacement functions for use during import bootstrap.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   550
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   551
    During bootstrap, we can use only builtin modules since import does not work
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   552
    yet. For Python 2.0+, we can use string methods so this is not a problem.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   553
    For Python 1.5, we would need the string module, so we need replacements.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   554
    """
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   555
    s = type('')
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   556
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   557
    global _string_replace, _string_join, _string_split
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   558
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   559
    if hasattr(s, "join"):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   560
        _string_join = s.join
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   561
    else:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   562
        def join(sep, words):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   563
            res = ''
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   564
            for w in words:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   565
                    res = res + (sep + w)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   566
            return res[len(sep):]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   567
        _string_join = join
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   568
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   569
    if hasattr(s, "split"):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   570
        _string_split = s.split
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   571
    else:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   572
        def split(s, sep, maxsplit=0):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   573
            res = []
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   574
            nsep = len(sep)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   575
            if nsep == 0:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   576
                    return [s]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   577
            ns = len(s)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   578
            if maxsplit <= 0: maxsplit = ns
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   579
            i = j = 0
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   580
            count = 0
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   581
            while j+nsep <= ns:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   582
                    if s[j:j+nsep] == sep:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   583
                            count = count + 1
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   584
                            res.append(s[i:j])
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   585
                            i = j = j + nsep
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   586
                            if count >= maxsplit: break
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   587
                    else:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   588
                            j = j + 1
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   589
            res.append(s[i:])
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   590
            return res
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   591
        _string_split = split
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   592
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   593
    if hasattr(s, "replace"):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   594
        _string_replace = s.replace
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   595
    else:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   596
        def replace(str, old, new):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   597
            return _string_join(new, _string_split(str, old))
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   598
        _string_replace = replace
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   599
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   600
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   601
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   602
_os_bootstrap()
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   603
_string_bootstrap()