diff options
| -rw-r--r-- | bitbake/lib/bb/cookerdata.py | 4 | ||||
| -rw-r--r-- | bitbake/lib/bb/event.py | 10 | ||||
| -rw-r--r-- | bitbake/lib/bb/methodpool.py | 4 | ||||
| -rw-r--r-- | bitbake/lib/bb/parse/ast.py | 16 | ||||
| -rw-r--r-- | bitbake/lib/bb/utils.py | 12 |
5 files changed, 32 insertions, 14 deletions
diff --git a/bitbake/lib/bb/cookerdata.py b/bitbake/lib/bb/cookerdata.py index 671c0cb0e2..b47e7f3230 100644 --- a/bitbake/lib/bb/cookerdata.py +++ b/bitbake/lib/bb/cookerdata.py | |||
| @@ -317,7 +317,9 @@ class CookerDataBuilder(object): | |||
| 317 | # Nomally we only register event handlers at the end of parsing .bb files | 317 | # Nomally we only register event handlers at the end of parsing .bb files |
| 318 | # We register any handlers we've found so far here... | 318 | # We register any handlers we've found so far here... |
| 319 | for var in data.getVar('__BBHANDLERS', False) or []: | 319 | for var in data.getVar('__BBHANDLERS', False) or []: |
| 320 | bb.event.register(var, data.getVar(var, False), (data.getVarFlag(var, "eventmask", True) or "").split()) | 320 | handlerfn = data.getVarFlag(var, "filename", False) |
| 321 | handlerln = int(data.getVarFlag(var, "lineno", False)) | ||
| 322 | bb.event.register(var, data.getVar(var, False), (data.getVarFlag(var, "eventmask", True) or "").split(), handlerfn, handlerln) | ||
| 321 | 323 | ||
| 322 | if data.getVar("BB_WORKERCONTEXT", False) is None: | 324 | if data.getVar("BB_WORKERCONTEXT", False) is None: |
| 323 | bb.fetch.fetcher_init(data) | 325 | bb.fetch.fetcher_init(data) |
diff --git a/bitbake/lib/bb/event.py b/bitbake/lib/bb/event.py index ec25ce77fb..bd2b0a4b05 100644 --- a/bitbake/lib/bb/event.py +++ b/bitbake/lib/bb/event.py | |||
| @@ -177,7 +177,7 @@ def fire_from_worker(event, d): | |||
| 177 | fire_ui_handlers(event, d) | 177 | fire_ui_handlers(event, d) |
| 178 | 178 | ||
| 179 | noop = lambda _: None | 179 | noop = lambda _: None |
| 180 | def register(name, handler, mask=None): | 180 | def register(name, handler, mask=None, filename=None, lineno=None): |
| 181 | """Register an Event handler""" | 181 | """Register an Event handler""" |
| 182 | 182 | ||
| 183 | # already registered | 183 | # already registered |
| @@ -189,7 +189,13 @@ def register(name, handler, mask=None): | |||
| 189 | if isinstance(handler, basestring): | 189 | if isinstance(handler, basestring): |
| 190 | tmp = "def %s(e):\n%s" % (name, handler) | 190 | tmp = "def %s(e):\n%s" % (name, handler) |
| 191 | try: | 191 | try: |
| 192 | code = compile(tmp, "%s(e)" % name, "exec") | 192 | import ast |
| 193 | if filename is None: | ||
| 194 | filename = "%s(e)" % name | ||
| 195 | code = compile(tmp, filename, "exec", ast.PyCF_ONLY_AST) | ||
| 196 | if lineno is not None: | ||
| 197 | ast.increment_lineno(code, lineno-1) | ||
| 198 | code = compile(code, filename, "exec") | ||
| 193 | except SyntaxError: | 199 | except SyntaxError: |
| 194 | logger.error("Unable to register event handler '%s':\n%s", name, | 200 | logger.error("Unable to register event handler '%s':\n%s", name, |
| 195 | ''.join(traceback.format_exc(limit=0))) | 201 | ''.join(traceback.format_exc(limit=0))) |
diff --git a/bitbake/lib/bb/methodpool.py b/bitbake/lib/bb/methodpool.py index bf2e9f5542..b2ea1a1887 100644 --- a/bitbake/lib/bb/methodpool.py +++ b/bitbake/lib/bb/methodpool.py | |||
| @@ -19,11 +19,11 @@ | |||
| 19 | 19 | ||
| 20 | from bb.utils import better_compile, better_exec | 20 | from bb.utils import better_compile, better_exec |
| 21 | 21 | ||
| 22 | def insert_method(modulename, code, fn): | 22 | def insert_method(modulename, code, fn, lineno): |
| 23 | """ | 23 | """ |
| 24 | Add code of a module should be added. The methods | 24 | Add code of a module should be added. The methods |
| 25 | will be simply added, no checking will be done | 25 | will be simply added, no checking will be done |
| 26 | """ | 26 | """ |
| 27 | comp = better_compile(code, modulename, fn ) | 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 | ||
diff --git a/bitbake/lib/bb/parse/ast.py b/bitbake/lib/bb/parse/ast.py index 11db1801b3..e1bf82fe90 100644 --- a/bitbake/lib/bb/parse/ast.py +++ b/bitbake/lib/bb/parse/ast.py | |||
| @@ -148,17 +148,19 @@ class MethodNode(AstNode): | |||
| 148 | 148 | ||
| 149 | def eval(self, data): | 149 | def eval(self, data): |
| 150 | text = '\n'.join(self.body) | 150 | text = '\n'.join(self.body) |
| 151 | funcname = self.func_name | ||
| 151 | if self.func_name == "__anonymous": | 152 | if self.func_name == "__anonymous": |
| 152 | funcname = ("__anon_%s_%s" % (self.lineno, self.filename.translate(MethodNode.tr_tbl))) | 153 | funcname = ("__anon_%s_%s" % (self.lineno, self.filename.translate(MethodNode.tr_tbl))) |
| 153 | text = "def %s(d):\n" % (funcname) + text | 154 | text = "def %s(d):\n" % (funcname) + text |
| 154 | bb.methodpool.insert_method(funcname, text, self.filename) | 155 | bb.methodpool.insert_method(funcname, text, self.filename, self.lineno - len(self.body)) |
| 155 | anonfuncs = data.getVar('__BBANONFUNCS', False) or [] | 156 | anonfuncs = data.getVar('__BBANONFUNCS', False) or [] |
| 156 | anonfuncs.append(funcname) | 157 | anonfuncs.append(funcname) |
| 157 | data.setVar('__BBANONFUNCS', anonfuncs) | 158 | data.setVar('__BBANONFUNCS', anonfuncs) |
| 158 | data.setVar(funcname, text, parsing=True) | ||
| 159 | else: | 159 | else: |
| 160 | data.setVarFlag(self.func_name, "func", 1) | 160 | data.setVarFlag(self.func_name, "func", 1) |
| 161 | data.setVar(self.func_name, text, parsing=True) | 161 | data.setVar(funcname, text, parsing=True) |
| 162 | data.setVarFlag(funcname, 'filename', self.filename) | ||
| 163 | data.setVarFlag(funcname, 'lineno', str(self.lineno - len(self.body))) | ||
| 162 | 164 | ||
| 163 | class PythonMethodNode(AstNode): | 165 | class PythonMethodNode(AstNode): |
| 164 | def __init__(self, filename, lineno, function, modulename, body): | 166 | def __init__(self, filename, lineno, function, modulename, body): |
| @@ -172,10 +174,12 @@ class PythonMethodNode(AstNode): | |||
| 172 | # 'this' file. This means we will not parse methods from | 174 | # 'this' file. This means we will not parse methods from |
| 173 | # bb classes twice | 175 | # bb classes twice |
| 174 | text = '\n'.join(self.body) | 176 | text = '\n'.join(self.body) |
| 175 | bb.methodpool.insert_method(self.modulename, text, self.filename) | 177 | bb.methodpool.insert_method(self.modulename, text, self.filename, self.lineno - len(self.body) - 1) |
| 176 | data.setVarFlag(self.function, "func", 1) | 178 | data.setVarFlag(self.function, "func", 1) |
| 177 | data.setVarFlag(self.function, "python", 1) | 179 | data.setVarFlag(self.function, "python", 1) |
| 178 | data.setVar(self.function, text, parsing=True) | 180 | data.setVar(self.function, text, parsing=True) |
| 181 | data.setVarFlag(self.function, 'filename', self.filename) | ||
| 182 | data.setVarFlag(self.function, 'lineno', str(self.lineno - len(self.body) - 1)) | ||
| 179 | 183 | ||
| 180 | class MethodFlagsNode(AstNode): | 184 | class MethodFlagsNode(AstNode): |
| 181 | def __init__(self, filename, lineno, key, m): | 185 | def __init__(self, filename, lineno, key, m): |
| @@ -317,7 +321,9 @@ def finalize(fn, d, variant = None): | |||
| 317 | all_handlers = {} | 321 | all_handlers = {} |
| 318 | for var in d.getVar('__BBHANDLERS', False) or []: | 322 | for var in d.getVar('__BBHANDLERS', False) or []: |
| 319 | # try to add the handler | 323 | # try to add the handler |
| 320 | bb.event.register(var, d.getVar(var, False), (d.getVarFlag(var, "eventmask", True) or "").split()) | 324 | handlerfn = d.getVarFlag(var, "filename", False) |
| 325 | handlerln = int(d.getVarFlag(var, "lineno", False)) | ||
| 326 | bb.event.register(var, d.getVar(var, False), (d.getVarFlag(var, "eventmask", True) or "").split(), handlerfn, handlerln) | ||
| 321 | 327 | ||
| 322 | bb.event.fire(bb.event.RecipePreFinalise(fn), d) | 328 | bb.event.fire(bb.event.RecipePreFinalise(fn), d) |
| 323 | 329 | ||
diff --git a/bitbake/lib/bb/utils.py b/bitbake/lib/bb/utils.py index 31ec2b7c9a..c5ff903cef 100644 --- a/bitbake/lib/bb/utils.py +++ b/bitbake/lib/bb/utils.py | |||
| @@ -33,6 +33,7 @@ import fnmatch | |||
| 33 | import traceback | 33 | import traceback |
| 34 | import errno | 34 | import errno |
| 35 | import signal | 35 | import signal |
| 36 | import ast | ||
| 36 | from commands import getstatusoutput | 37 | from commands import getstatusoutput |
| 37 | from contextlib import contextmanager | 38 | from contextlib import contextmanager |
| 38 | from ctypes import cdll | 39 | from ctypes import cdll |
| @@ -291,19 +292,22 @@ def _print_trace(body, line): | |||
| 291 | error.append(' %.4d:%s' % (i, body[i-1].rstrip())) | 292 | error.append(' %.4d:%s' % (i, body[i-1].rstrip())) |
| 292 | return error | 293 | return error |
| 293 | 294 | ||
| 294 | def better_compile(text, file, realfile, mode = "exec"): | 295 | def better_compile(text, file, realfile, mode = "exec", lineno = None): |
| 295 | """ | 296 | """ |
| 296 | A better compile method. This method | 297 | A better compile method. This method |
| 297 | will print the offending lines. | 298 | will print the offending lines. |
| 298 | """ | 299 | """ |
| 299 | try: | 300 | try: |
| 300 | return compile(text, file, mode) | 301 | code = compile(text, realfile, mode, ast.PyCF_ONLY_AST) |
| 302 | if lineno is not None: | ||
| 303 | ast.increment_lineno(code, lineno) | ||
| 304 | return compile(code, realfile, mode) | ||
| 301 | except Exception as e: | 305 | except Exception as e: |
| 302 | error = [] | 306 | error = [] |
| 303 | # split the text into lines again | 307 | # split the text into lines again |
| 304 | body = text.split('\n') | 308 | body = text.split('\n') |
| 305 | error.append("Error in compiling python function in %s:\n" % realfile) | 309 | error.append("Error in compiling python function in %s, line %s:\n" % (realfile, lineno)) |
| 306 | if e.lineno: | 310 | if hasattr(e, "lineno"): |
| 307 | error.append("The code lines resulting in this error were:") | 311 | error.append("The code lines resulting in this error were:") |
| 308 | error.extend(_print_trace(body, e.lineno)) | 312 | error.extend(_print_trace(body, e.lineno)) |
| 309 | else: | 313 | else: |
