File "<stdin>", line 5, in factorial
File "<stdin>", line 5, in factorial
File "<stdin>", line 5, in factorial
File "<stdin>", line 5, in factorial
File "<stdin>", line 5, in factorial
File "<stdin>", line 5, in factorial
File "<stdin>", line 5, in factorial
File "<stdin>", line 5, in factorial
File "<stdin>", line 5, in factorial
File "<stdin>", line 5, in factorial
File "<stdin>", line 5, in factorial
File "<stdin>", line 5, in factorial
File "<stdin>", line 5, in factorial
File "<stdin>", line 5, in factorial
File "<stdin>", line 5, in factorial
File "<stdin>", line 5, in factorial
File "<stdin>", line 5, in factorial
File "<stdin>", line 5, in factorial
File "<stdin>", line 5, in factorial
File "<stdin>", line 5, in factorial
File "<stdin>", line 5, in factorial
RuntimeError: maximum recursion depth exceeded
...
c -------------
a | factorial |
l -------------
l | factorial |
-------------
s | factorial |
t -------------
a | factorial |
c -------------
k | REPL | <-- this one counts!
-------------
c -------------
a | factorial | (1) >>> def factorial(n):
l ------------- ... if n == 1:
l | factorial | (2) ... return 1
------------- ... else:
s | factorial | (3) ... return n * factorial(n - 1)
t -------------
a | factorial | (4)
c -------------
k | factorial | (5)
-------------
| REPL |
-------------
File "<stdin>", line 5, in factorial
File "<stdin>", line 5, in factorial
File "<stdin>", line 5, in factorial
File "<stdin>", line 5, in factorial
File "<stdin>", line 5, in factorial
File "<stdin>", line 5, in factorial
File "<stdin>", line 5, in factorial
File "<stdin>", line 5, in factorial
File "<stdin>", line 5, in factorial
File "<stdin>", line 5, in factorial
File "<stdin>", line 5, in factorial
File "<stdin>", line 5, in factorial
File "<stdin>", line 5, in factorial
File "<stdin>", line 5, in factorial
File "<stdin>", line 5, in factorial
File "<stdin>", line 5, in factorial
File "<stdin>", line 5, in factorial
File "<stdin>", line 5, in factorial
File "<stdin>", line 5, in factorial
File "<stdin>", line 5, in factorial
File "<stdin>", line 5, in factorial
RuntimeError: maximum recursion depth exceeded
def tail_recurse(fn):
new_bytecode = []
code_obj = fn.__code__
for byte, arg in consume(code_obj.co_code):
name = opcode.opname[byte]
if name == "LOAD_GLOBAL" and code_obj.co_names[arg] == fn.__name__:
pass
elif name == "CALL_FUNCTION":
for i in range(arg):
new_bytecode.append(opmap["STORE_FAST"])
new_bytecode += split(arg - i - 1)
new_bytecode.append(opmap["JUMP_ABSOLUTE"])
new_bytecode += split(0) # jump to beginning of bytecode
else:
new_bytecode.append(byte)
if arg is not None:
new_bytecode += split(arg)
return "".join([chr(b) for b in new_bytecode])