The poison-pills are implementation dependent. At the end of the day it is just a matter of the JIT not optimizing a certain programming pattern. Sometimes it is just because the authors didn't get around to that yet. Sometimes there is a more fundamental reason why optimizing that pattern would be hard.
I am most familiar with LuaJIT. It has wiki page with a list of things that force it to fall back to the interpreter
http://wiki.luajit.org/NYI