A.2 Patched functions

When Psyco starts, it replaces a few functions from the __builtin__ and sys modules with a version of its own. This trick fails if you made a copy of one of these functions elsewhere before Psyco has a chance to replace it, because the old copy will not behave properly in the presence of Psyco.

Built-in function Notes
locals (1)
vars (1) when called with no argument
dir (1) when called with no argument
eval (1)(2) when called with a single argument
execfile (1) when called with a single argument
input (1)
sys._getframe (3)


A function run by Psyco has no native locals dictionary. Psyco 1.3 and above can emulate it properly if a certain optimization (early dead variable deletion) is disabled. Psyco should turn off this optimization automatically for functions where it detects a call to one of the above built-in functions, but this detection is a guess over the function's bytecode. It means that certain indirect calls can be missed. If this occurs at run-time, a psyco.warning is issued and the emulated locals dictionary is empty.
Note that it is common to find Python programs that use dynamic code evaluation for an effect that can be obtained by calling an ad-hoc built-in function instead. For example, eval('self.'+attr) is better written as getattr(self, attr) and exec 'import '+module is better written as __import__(module, globals(), locals(), []).
Frames corresponding to Psyco-evaluated functions are incomplete, as described in section A.1.

Additionally, the exec statement is not supported yet, as seen in section A.3.