##// END OF EJS Templates
Backport PR #13535: Set co_name for cells run line by line (to fix debugging with Python 3.10).
Matthias Bussonnier -
Show More
@@ -15,6 +15,7 b' import abc'
15 15 import ast
16 16 import atexit
17 17 import builtins as builtin_mod
18 import dis
18 19 import functools
19 20 import inspect
20 21 import os
@@ -3304,6 +3305,29 b' class InteractiveShell(SingletonConfigurable):'
3304 3305 ast.fix_missing_locations(node)
3305 3306 return node
3306 3307
3308 def _update_code_co_name(self, code):
3309 """Python 3.10 changed the behaviour so that whenever a code object
3310 is assembled in the compile(ast) the co_firstlineno would be == 1.
3311
3312 This makes pydevd/debugpy think that all cells invoked are the same
3313 since it caches information based on (co_firstlineno, co_name, co_filename).
3314
3315 Given that, this function changes the code 'co_name' to be unique
3316 based on the first real lineno of the code (which also has a nice
3317 side effect of customizing the name so that it's not always <module>).
3318
3319 See: https://github.com/ipython/ipykernel/issues/841
3320 """
3321 if not hasattr(code, "replace"):
3322 # It may not be available on older versions of Python (only
3323 # available for 3.8 onwards).
3324 return code
3325 try:
3326 first_real_line = next(dis.findlinestarts(code))[1]
3327 except StopIteration:
3328 return code
3329 return code.replace(co_name="<cell line: %s>" % (first_real_line,))
3330
3307 3331 async def run_ast_nodes(self, nodelist:ListType[AST], cell_name:str, interactivity='last_expr',
3308 3332 compiler=compile, result=None):
3309 3333 """Run a sequence of AST nodes. The execution mode depends on the
@@ -3415,6 +3439,7 b' class InteractiveShell(SingletonConfigurable):'
3415 3439 mod = ast.Interactive([node])
3416 3440 with compiler.extra_flags(getattr(ast, 'PyCF_ALLOW_TOP_LEVEL_AWAIT', 0x0) if self.autoawait else 0x0):
3417 3441 code = compiler(mod, cell_name, mode)
3442 code = self._update_code_co_name(code)
3418 3443 asy = compare(code)
3419 3444 if (await self.run_code(code, result, async_=asy)):
3420 3445 return True
General Comments 0
You need to be logged in to leave comments. Login now