Naive interpretation of the bytecode (not even pre-decoded, just a switch statement).
And almost everything is resolved in the dynamic environment. for example,
a = foo.bar(b)
is actually ldict = locals()
ldict['a'] = ldict['foo'].__getattribute__('bar')(ldict['b'])