##// END OF EJS Templates
extensions: add unwrapfunction to undo wrapfunction...
Jun Wu -
r29765:19578bb8 default
parent child Browse files
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 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