2013年3月1日金曜日

pythonのバイトコード命令の比較(2)

ドキュメントにバイトコード命令の説明があったので比較。

pymite での実装 interp.c interp.h を見てみると、
引数 は GET_ARG()、TOS[-i] は STACK(i)、バイトコードカウンタは PM_IP、
スタックのポップは PM_SP-- に相当するらしい。

stdlib src/__bi.py を 2.7 でコンパイルしてみたところ、i=2 LIST_APPEND(2) だけが使われている。
2.6 ではスタック2個取り除いているが、2.7 では1個TOSだけを取り除く意味なのかわからないです。


Python2.5 : 30.10.1 Pythonバイトコード命令
Python2.6 : 31.12.1. Pythonバイトコード命令

LIST_APPEND list.append(TOS1, TOS)を呼びます。リスト内包表記を実装するために使われます。

JUMP_IF_FALSE(delta) TOSが偽ならば、deltaだけバイトコードカウンタを増加させます。TOSは変更されません。

Python2.7 : 31.12.1. Python バイトコード命令

LIST_APPEND(i) list.append(TOS[-i], TOS)を呼びます。リスト内包表記を実装するために使われます。要素が取り除かれる間、リストオブジェクトはスタックに残るので、ループの反復をさらに行えます。

JUMP_IF_FALSE_OR_POP(target) TOS が偽ならば、バイトコードカウンタを target に設定し、TOS はスタックに残されます。そうでない (TOS が真) なら、TOS はポップされます。


(2013/3/1)
---

0 件のコメント: