Olemis Lang avatar Olemis Lang committed b04ef64

ThemeEngine #9580: Using recursion context rather than counter

Comments (0)

Files changed (1)

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

-diff -r 379d6cfc8bf3 trac/core.py
---- a/trac/core.py	Thu Jan 19 14:14:39 2012 -0500
-+++ b/trac/core.py	Fri Jan 20 08:27:53 2012 -0500
+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."""
 +        if real_init:
 +            def norec_init(f):
 +                """Ignore nested calls to function f"""
-+                # Recursion counter stored in wrapper's closure
-+                rec_counter = [0]
++                # Recursion context stored in wrapper's closure
++                rec_ctx = set()
 +                def __init__(self, *args, **kwargs):
 +                    # No need to return anything
-+                    if rec_counter[0] == 0:
++                    if self.compmgr not in rec_ctx:
 +                        try:
-+                            rec_counter[0] += 1
++                            rec_ctx.add(self.compmgr)
 +                            f(self, *args, **kwargs)
 +                        finally:
-+                            rec_counter[0] -= 1
++                            rec_ctx.remove(self.compmgr)
 +                return __init__
 +
 +            d['__init__'] = norec_init(real_init)
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.