diff options
Diffstat (limited to 'bitbake/lib')
-rw-r--r-- | bitbake/lib/bb/event.py | 17 | ||||
-rw-r--r-- | bitbake/lib/bb/methodpool.py | 11 | ||||
-rw-r--r-- | bitbake/lib/bb/utils.py | 7 |
3 files changed, 27 insertions, 8 deletions
diff --git a/bitbake/lib/bb/event.py b/bitbake/lib/bb/event.py index bd2b0a4b05..5ffe89eae3 100644 --- a/bitbake/lib/bb/event.py +++ b/bitbake/lib/bb/event.py | |||
@@ -31,6 +31,7 @@ except ImportError: | |||
31 | import logging | 31 | import logging |
32 | import atexit | 32 | import atexit |
33 | import traceback | 33 | import traceback |
34 | import ast | ||
34 | import bb.utils | 35 | import bb.utils |
35 | import bb.compat | 36 | import bb.compat |
36 | import bb.exceptions | 37 | import bb.exceptions |
@@ -189,13 +190,15 @@ def register(name, handler, mask=None, filename=None, lineno=None): | |||
189 | if isinstance(handler, basestring): | 190 | if isinstance(handler, basestring): |
190 | tmp = "def %s(e):\n%s" % (name, handler) | 191 | tmp = "def %s(e):\n%s" % (name, handler) |
191 | try: | 192 | try: |
192 | import ast | 193 | code = bb.methodpool.compile_cache(tmp) |
193 | if filename is None: | 194 | if not code: |
194 | filename = "%s(e)" % name | 195 | if filename is None: |
195 | code = compile(tmp, filename, "exec", ast.PyCF_ONLY_AST) | 196 | filename = "%s(e)" % name |
196 | if lineno is not None: | 197 | code = compile(tmp, filename, "exec", ast.PyCF_ONLY_AST) |
197 | ast.increment_lineno(code, lineno-1) | 198 | if lineno is not None: |
198 | code = compile(code, filename, "exec") | 199 | ast.increment_lineno(code, lineno-1) |
200 | code = compile(code, filename, "exec") | ||
201 | bb.methodpool.compile_cache_add(tmp, code) | ||
199 | except SyntaxError: | 202 | except SyntaxError: |
200 | logger.error("Unable to register event handler '%s':\n%s", name, | 203 | logger.error("Unable to register event handler '%s':\n%s", name, |
201 | ''.join(traceback.format_exc(limit=0))) | 204 | ''.join(traceback.format_exc(limit=0))) |
diff --git a/bitbake/lib/bb/methodpool.py b/bitbake/lib/bb/methodpool.py index b2ea1a1887..49aed3338b 100644 --- a/bitbake/lib/bb/methodpool.py +++ b/bitbake/lib/bb/methodpool.py | |||
@@ -27,3 +27,14 @@ def insert_method(modulename, code, fn, lineno): | |||
27 | comp = better_compile(code, modulename, fn, lineno=lineno) | 27 | comp = better_compile(code, modulename, fn, lineno=lineno) |
28 | better_exec(comp, None, code, fn) | 28 | better_exec(comp, None, code, fn) |
29 | 29 | ||
30 | compilecache = {} | ||
31 | |||
32 | def compile_cache(code): | ||
33 | h = hash(code) | ||
34 | if h in compilecache: | ||
35 | return compilecache[h] | ||
36 | return None | ||
37 | |||
38 | def compile_cache_add(code, compileobj): | ||
39 | h = hash(code) | ||
40 | compilecache[h] = compileobj | ||
diff --git a/bitbake/lib/bb/utils.py b/bitbake/lib/bb/utils.py index e564bb6ff4..cd5fcede3c 100644 --- a/bitbake/lib/bb/utils.py +++ b/bitbake/lib/bb/utils.py | |||
@@ -298,10 +298,15 @@ def better_compile(text, file, realfile, mode = "exec", lineno = None): | |||
298 | will print the offending lines. | 298 | will print the offending lines. |
299 | """ | 299 | """ |
300 | try: | 300 | try: |
301 | cache = bb.methodpool.compile_cache(text) | ||
302 | if cache: | ||
303 | return cache | ||
301 | code = compile(text, realfile, mode, ast.PyCF_ONLY_AST) | 304 | code = compile(text, realfile, mode, ast.PyCF_ONLY_AST) |
302 | if lineno is not None: | 305 | if lineno is not None: |
303 | ast.increment_lineno(code, lineno) | 306 | ast.increment_lineno(code, lineno) |
304 | return compile(code, realfile, mode) | 307 | code = compile(code, realfile, mode) |
308 | bb.methodpool.compile_cache_add(text, code) | ||
309 | return code | ||
305 | except Exception as e: | 310 | except Exception as e: |
306 | error = [] | 311 | error = [] |
307 | # split the text into lines again | 312 | # split the text into lines again |