Show More
@@ -0,0 +1,39 | |||||
|
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 | |||||
|
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 def wrapfunction(container, funcname, wr | |||||
309 | setattr(container, funcname, wrap) |
|
309 | setattr(container, funcname, wrap) | |
310 | return origfn |
|
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 | def getwrapperchain(container, funcname): |
|
332 | def getwrapperchain(container, funcname): | |
313 | '''get a chain of wrappers of a function |
|
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