Source

trac-mq / tho / themeengine / t-9580-infinite-recursion.diff

Full commit
diff -r 4a86ff7d68a8 trac/core.py
--- a/trac/core.py	Mon Jan 23 09:10:31 2012 -0500
+++ b/trac/core.py	Mon Jan 23 09:38:18 2012 -0500
@@ -94,6 +94,24 @@
     def __new__(mcs, name, bases, d):
         """Create the component class."""
 
+        real_init = d.get('__init__')
+        if real_init:
+            def norec_init(f):
+                """Ignore nested calls to function f"""
+                # Recursion context stored in wrapper's closure
+                rec_ctx = set()
+                def __init__(self, *args, **kwargs):
+                    # No need to return anything
+                    if self.compmgr not in rec_ctx:
+                        try:
+                            rec_ctx.add(self.compmgr)
+                            f(self, *args, **kwargs)
+                        finally:
+                            rec_ctx.remove(self.compmgr)
+                return __init__
+
+            d['__init__'] = norec_init(real_init)
+
         new_class = type.__new__(mcs, name, bases, d)
         if name == 'Component':
             # Don't put the Component base class in the registry