##// END OF EJS Templates
Merge pull request #13021 from Carreau/flocals...
Matthias Bussonnier -
r26597:abee6378 merge
parent child Browse files
Show More
@@ -331,7 +331,7 b' class Pdb(OldPdb):'
331 if frame in (self.curframe, getattr(self, "initial_frame", None)):
331 if frame in (self.curframe, getattr(self, "initial_frame", None)):
332 return False
332 return False
333 else:
333 else:
334 return frame.f_locals.get("__tracebackhide__", False)
334 return self._get_frame_locals(frame).get("__tracebackhide__", False)
335
335
336 return False
336 return False
337
337
@@ -435,6 +435,28 b' class Pdb(OldPdb):'
435 self.shell.hooks.synchronize_with_editor(filename, lineno, 0)
435 self.shell.hooks.synchronize_with_editor(filename, lineno, 0)
436 # vds: <<
436 # vds: <<
437
437
438 def _get_frame_locals(self, frame):
439 """ "
440 Acessing f_local of current frame reset the namespace, so we want to avoid
441 that or the following can happend
442
443 ipdb> foo
444 "old"
445 ipdb> foo = "new"
446 ipdb> foo
447 "new"
448 ipdb> where
449 ipdb> foo
450 "old"
451
452 So if frame is self.current_frame we instead return self.curframe_locals
453
454 """
455 if frame is self.curframe:
456 return self.curframe_locals
457 else:
458 return frame.f_locals
459
438 def format_stack_entry(self, frame_lineno, lprefix=': ', context=None):
460 def format_stack_entry(self, frame_lineno, lprefix=': ', context=None):
439 if context is None:
461 if context is None:
440 context = self.context
462 context = self.context
@@ -459,10 +481,11 b' class Pdb(OldPdb):'
459 frame, lineno = frame_lineno
481 frame, lineno = frame_lineno
460
482
461 return_value = ''
483 return_value = ''
462 if '__return__' in frame.f_locals:
484 loc_frame = self._get_frame_locals(frame)
463 rv = frame.f_locals['__return__']
485 if "__return__" in loc_frame:
464 #return_value += '->'
486 rv = loc_frame["__return__"]
465 return_value += reprlib.repr(rv) + '\n'
487 # return_value += '->'
488 return_value += reprlib.repr(rv) + "\n"
466 ret.append(return_value)
489 ret.append(return_value)
467
490
468 #s = filename + '(' + `lineno` + ')'
491 #s = filename + '(' + `lineno` + ')'
@@ -474,10 +497,10 b' class Pdb(OldPdb):'
474 else:
497 else:
475 func = "<lambda>"
498 func = "<lambda>"
476
499
477 call = ''
500 call = ""
478 if func != '?':
501 if func != "?":
479 if '__args__' in frame.f_locals:
502 if "__args__" in loc_frame:
480 args = reprlib.repr(frame.f_locals['__args__'])
503 args = reprlib.repr(loc_frame["__args__"])
481 else:
504 else:
482 args = '()'
505 args = '()'
483 call = tpl_call % (func, args)
506 call = tpl_call % (func, args)
@@ -671,7 +694,7 b' class Pdb(OldPdb):'
671
694
672 def getsourcelines(self, obj):
695 def getsourcelines(self, obj):
673 lines, lineno = inspect.findsource(obj)
696 lines, lineno = inspect.findsource(obj)
674 if inspect.isframe(obj) and obj.f_globals is obj.f_locals:
697 if inspect.isframe(obj) and obj.f_globals is self._get_frame_locals(obj):
675 # must be a module frame: do not try to cut a block out of it
698 # must be a module frame: do not try to cut a block out of it
676 return lines, 1
699 return lines, 1
677 elif inspect.ismodule(obj):
700 elif inspect.ismodule(obj):
@@ -277,14 +277,14 b' def test_xmode_skip():'
277
277
278 block = dedent(
278 block = dedent(
279 """
279 """
280 def f():
280 def f():
281 __tracebackhide__ = True
281 __tracebackhide__ = True
282 g()
282 g()
283
283
284 def g():
284 def g():
285 raise ValueError
285 raise ValueError
286
286
287 f()
287 f()
288 """
288 """
289 )
289 )
290
290
@@ -295,15 +295,15 b' f()'
295
295
296 block = dedent(
296 block = dedent(
297 """
297 """
298 def f():
298 def f():
299 __tracebackhide__ = True
299 __tracebackhide__ = True
300 g()
300 g()
301
301
302 def g():
302 def g():
303 from IPython.core.debugger import set_trace
303 from IPython.core.debugger import set_trace
304 set_trace()
304 set_trace()
305
305
306 f()
306 f()
307 """
307 """
308 )
308 )
309
309
@@ -321,3 +321,70 b' f()'
321 child.expect("ipdb>")
321 child.expect("ipdb>")
322
322
323 child.close()
323 child.close()
324
325
326 @skip_win32
327 def test_where_erase_value():
328 """Test that `where` does not access f_locals and erase values."""
329 import pexpect
330
331 env = os.environ.copy()
332 env["IPY_TEST_SIMPLE_PROMPT"] = "1"
333
334 child = pexpect.spawn(
335 sys.executable, ["-m", "IPython", "--colors=nocolor"], env=env
336 )
337 child.timeout = 15 * IPYTHON_TESTING_TIMEOUT_SCALE
338
339 child.expect("IPython")
340 child.expect("\n")
341 child.expect_exact("In [1]")
342
343 block = dedent(
344 """
345 def simple_f():
346 myvar = 1
347 print(myvar)
348 1/0
349 print(myvar)
350 simple_f() """
351 )
352
353 for line in block.splitlines():
354 child.sendline(line)
355 child.expect_exact(line)
356 child.expect_exact("ZeroDivisionError")
357 child.expect_exact("In [2]:")
358
359 child.sendline("%debug")
360
361 ##
362 child.expect("ipdb>")
363
364 child.sendline("myvar")
365 child.expect("1")
366
367 ##
368 child.expect("ipdb>")
369
370 child.sendline("myvar = 2")
371
372 ##
373 child.expect_exact("ipdb>")
374
375 child.sendline("myvar")
376
377 child.expect_exact("2")
378
379 ##
380 child.expect("ipdb>")
381 child.sendline("where")
382
383 ##
384 child.expect("ipdb>")
385 child.sendline("myvar")
386
387 child.expect_exact("2")
388 child.expect("ipdb>")
389
390 child.close()
General Comments 0
You need to be logged in to leave comments. Login now