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

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
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.