bzr branch
http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
| 
1996.1.24
by John Arbash Meinel
 cherry-pick the inspect_for_copy changes  | 
1  | 
# Copyright (C) 2005, 2006 Canonical Development Ltd
 | 
2  | 
#
 | 
|
3  | 
# This program is free software; you can redistribute it and/or modify
 | 
|
4  | 
# it under the terms of the GNU General Public License as published by
 | 
|
5  | 
# the Free Software Foundation; either version 2 of the License, or
 | 
|
6  | 
# (at your option) any later version.
 | 
|
7  | 
#
 | 
|
8  | 
# This program is distributed in the hope that it will be useful,
 | 
|
9  | 
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
|
10  | 
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
|
11  | 
# GNU General Public License for more details.
 | 
|
12  | 
#
 | 
|
13  | 
# You should have received a copy of the GNU General Public License
 | 
|
14  | 
# along with this program; if not, write to the Free Software
 | 
|
15  | 
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
|
16  | 
||
17  | 
"""A version of inspect that includes what 'copy' needs.
 | 
|
18  | 
||
19  | 
Importing the python standard module 'copy' is far more expensive than it
 | 
|
20  | 
needs to be, because copy imports 'inspect' which imports 'tokenize'.
 | 
|
21  | 
And 'copy' only needs 2 small functions out of 'inspect', but has to
 | 
|
22  | 
load all of 'tokenize', which makes it horribly slow.
 | 
|
23  | 
||
24  | 
This module is designed to use tricky hacks in import rules, to avoid this
 | 
|
25  | 
overhead.
 | 
|
26  | 
"""
 | 
|
27  | 
||
28  | 
||
29  | 
####
 | 
|
30  | 
# These are the only 2 functions that 'copy' needs from 'inspect'
 | 
|
31  | 
# As you can see, they are quite trivial, and don't justify the
 | 
|
32  | 
# 40ms spent to import 'inspect' because it is importing 'tokenize'
 | 
|
33  | 
# These are copied verbatim from the python standard library.
 | 
|
34  | 
||
35  | 
# ----------------------------------------------------------- class helpers
 | 
|
36  | 
def _searchbases(cls, accum):  | 
|
37  | 
    # Simulate the "classic class" search order.
 | 
|
38  | 
if cls in accum:  | 
|
39  | 
        return
 | 
|
40  | 
accum.append(cls)  | 
|
41  | 
for base in cls.__bases__:  | 
|
42  | 
_searchbases(base, accum)  | 
|
43  | 
||
44  | 
||
45  | 
def getmro(cls):  | 
|
46  | 
    "Return tuple of base classes (including cls) in method resolution order."
 | 
|
47  | 
if hasattr(cls, "__mro__"):  | 
|
48  | 
return cls.__mro__  | 
|
49  | 
else:  | 
|
50  | 
result = []  | 
|
51  | 
_searchbases(cls, result)  | 
|
52  | 
return tuple(result)  | 
|
53  | 
||
54  | 
||
55  | 
def import_copy_with_hacked_inspect():  | 
|
56  | 
"""Import the 'copy' module with a hacked 'inspect' module"""  | 
|
57  | 
    # We don't actually care about 'getmro' but we need to pass
 | 
|
58  | 
    # something in the list so that we get the direct module,
 | 
|
59  | 
    # rather than getting the base module
 | 
|
60  | 
import sys  | 
|
61  | 
||
62  | 
    # Don't hack around if 'inspect' already exists
 | 
|
63  | 
if 'inspect' in sys.modules:  | 
|
64  | 
import copy  | 
|
65  | 
        return
 | 
|
66  | 
||
67  | 
mod = __import__('bzrlib.inspect_for_copy',  | 
|
68  | 
globals(), locals(), ['getmro'])  | 
|
69  | 
||
70  | 
sys.modules['inspect'] = mod  | 
|
71  | 
try:  | 
|
72  | 
import copy  | 
|
73  | 
finally:  | 
|
74  | 
del sys.modules['inspect']  |