Show More
@@ -0,0 +1,39 b'' | |||
|
1 | from __future__ import absolute_import, print_function | |
|
2 | ||
|
3 | from mercurial import extensions | |
|
4 | ||
|
5 | def genwrapper(x): | |
|
6 | def f(orig, *args, **kwds): | |
|
7 | return [x] + orig(*args, **kwds) | |
|
8 | f.x = x | |
|
9 | return f | |
|
10 | ||
|
11 | def getid(wrapper): | |
|
12 | return getattr(wrapper, 'x', '-') | |
|
13 | ||
|
14 | wrappers = [genwrapper(i) for i in range(5)] | |
|
15 | ||
|
16 | class dummyclass(object): | |
|
17 | def getstack(self): | |
|
18 | return ['orig'] | |
|
19 | ||
|
20 | dummy = dummyclass() | |
|
21 | ||
|
22 | def batchwrap(wrappers): | |
|
23 | for w in wrappers: | |
|
24 | extensions.wrapfunction(dummy, 'getstack', w) | |
|
25 | print('wrap %d: %s' % (getid(w), dummy.getstack())) | |
|
26 | ||
|
27 | def batchunwrap(wrappers): | |
|
28 | for w in wrappers: | |
|
29 | result = None | |
|
30 | try: | |
|
31 | result = extensions.unwrapfunction(dummy, 'getstack', w) | |
|
32 | msg = str(dummy.getstack()) | |
|
33 | except (ValueError, IndexError) as e: | |
|
34 | msg = e.__class__.__name__ | |
|
35 | print('unwrap %s: %s: %s' % (getid(w), getid(result), msg)) | |
|
36 | ||
|
37 | batchwrap(wrappers + [wrappers[0]]) | |
|
38 | batchunwrap([(wrappers[i] if i >= 0 else None) | |
|
39 | for i in [3, None, 0, 4, 0, 2, 1, None]]) |
@@ -0,0 +1,14 b'' | |||
|
1 | wrap 0: [0, 'orig'] | |
|
2 | wrap 1: [1, 0, 'orig'] | |
|
3 | wrap 2: [2, 1, 0, 'orig'] | |
|
4 | wrap 3: [3, 2, 1, 0, 'orig'] | |
|
5 | wrap 4: [4, 3, 2, 1, 0, 'orig'] | |
|
6 | wrap 0: [0, 4, 3, 2, 1, 0, 'orig'] | |
|
7 | unwrap 3: 3: [0, 4, 2, 1, 0, 'orig'] | |
|
8 | unwrap -: 0: [4, 2, 1, 0, 'orig'] | |
|
9 | unwrap 0: 0: [4, 2, 1, 'orig'] | |
|
10 | unwrap 4: 4: [2, 1, 'orig'] | |
|
11 | unwrap 0: -: ValueError | |
|
12 | unwrap 2: 2: [1, 'orig'] | |
|
13 | unwrap 1: 1: ['orig'] | |
|
14 | unwrap -: -: IndexError |
@@ -309,6 +309,26 b' def wrapfunction(container, funcname, wr' | |||
|
309 | 309 | setattr(container, funcname, wrap) |
|
310 | 310 | return origfn |
|
311 | 311 | |
|
312 | def unwrapfunction(container, funcname, wrapper=None): | |
|
313 | '''undo wrapfunction | |
|
314 | ||
|
315 | If wrappers is None, undo the last wrap. Otherwise removes the wrapper | |
|
316 | from the chain of wrappers. | |
|
317 | ||
|
318 | Return the removed wrapper. | |
|
319 | Raise IndexError if wrapper is None and nothing to unwrap; ValueError if | |
|
320 | wrapper is not None but is not found in the wrapper chain. | |
|
321 | ''' | |
|
322 | chain = getwrapperchain(container, funcname) | |
|
323 | origfn = chain.pop() | |
|
324 | if wrapper is None: | |
|
325 | wrapper = chain[0] | |
|
326 | chain.remove(wrapper) | |
|
327 | setattr(container, funcname, origfn) | |
|
328 | for w in reversed(chain): | |
|
329 | wrapfunction(container, funcname, w) | |
|
330 | return wrapper | |
|
331 | ||
|
312 | 332 | def getwrapperchain(container, funcname): |
|
313 | 333 | '''get a chain of wrappers of a function |
|
314 | 334 |
General Comments 0
You need to be logged in to leave comments.
Login now