summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bitbake/lib/bb/event.py17
-rw-r--r--bitbake/lib/bb/methodpool.py11
-rw-r--r--bitbake/lib/bb/utils.py7
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:
31import logging 31import logging
32import atexit 32import atexit
33import traceback 33import traceback
34import ast
34import bb.utils 35import bb.utils
35import bb.compat 36import bb.compat
36import bb.exceptions 37import 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
30compilecache = {}
31
32def compile_cache(code):
33 h = hash(code)
34 if h in compilecache:
35 return compilecache[h]
36 return None
37
38def 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