On 2012-12-09 22:22, Mark Shannon wrote:
Hi all,
The current CPython bytecode interpreter is rather more complex than it needs to be. A number of bytecodes could be eliminated and a few more simplified by moving the work involved in handling compound statements (loops, try-blocks, etc) from the interpreter to the compiler.
This simplest example of this is the while loop... while cond: body
This currently compiled as
start: if not cond goto end body goto start end:
but it could be compiled as
goto test: start: body if cond goto start
which eliminates one instruction per iteration.
A more complex example is a return in a try-finally block.
try: part1 if cond: return X part2 finally: part3
Currently, handling the return is complex and involves "pseudo exceptions", but if part3 were duplicated by the compiler, then the RETURN bytecode could just perform a simple return. The code above would be compiled thus...
PUSH_BLOCK try part1 if not X goto endif push X POP_BLOCK part3 <<< duplicated RETURN_VALUE endif: part2 POP_BLOCK part3 <<< duplicated
The changes I am proposing are:
[snip] Is it necessary to duplicate part3? Is it possible to put it into a subroutine if it's long? (And I do mean a simple cheap subroutine.)