Commit b8a00bf1 authored by Kevin Modzelewski's avatar Kevin Modzelewski

Implement traceback.print_stack() and use that to further test generator tracebacks

parent 929e154f
...@@ -293,13 +293,18 @@ def print_stack(f=None, limit=None, file=None): ...@@ -293,13 +293,18 @@ def print_stack(f=None, limit=None, file=None):
arguments have the same meaning as for print_exception(). arguments have the same meaning as for print_exception().
""" """
raise NotImplementedError("This function is currently not implemented in Pyston") if f is not None or limit is not None:
if f is None: raise NotImplementedError("print_stack() does not currently support the 'f' or 'limit' arguments in Pyston")
try:
raise ZeroDivisionError try:
except ZeroDivisionError: raise ZeroDivisionError
f = sys.exc_info()[2].tb_frame.f_back except ZeroDivisionError:
print_list(extract_stack(f, limit), file) # Make use of Pyston's incorrect behavior, that we generate exception tracebacks all the
# way to the top stack frame:
l = format_exception(*sys.exc_info())[1:-2]
for s in l:
_print(file, s, '')
def format_stack(f=None, limit=None): def format_stack(f=None, limit=None):
"""Shorthand for 'format_list(extract_stack(f, limit))'.""" """Shorthand for 'format_list(extract_stack(f, limit))'."""
......
# allow-warning: converting unicode literal to str
# Generators participate in the notional Python stack just like normal function calls do, # Generators participate in the notional Python stack just like normal function calls do,
# even if we implement them using separate C stacks. # even if we implement them using separate C stacks.
# #
...@@ -5,7 +7,10 @@ ...@@ -5,7 +7,10 @@
# get inherited when we go into a generator # get inherited when we go into a generator
# exc_info gets passed into generators (at both begin and send()) and cleared like normal on the way out: # exc_info gets passed into generators (at both begin and send()) and cleared like normal on the way out:
import sys import sys
import traceback
def f12(): def f12():
print print
print "f12" print "f12"
...@@ -19,6 +24,7 @@ def f12(): ...@@ -19,6 +24,7 @@ def f12():
try: try:
raise KeyError() raise KeyError()
except: except:
traceback.print_stack(file=sys.stdout)
pass pass
print "after KeyError:", sys.exc_info()[0] print "after KeyError:", sys.exc_info()[0]
yield 2 yield 2
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment