PyPyのPyObjectの実装が謎い

全部同じ実装しててどういう事かと追いかけたら続きはRPythonで!かと思いきやPython2.7との互換性のためごにょごにょ
9
くまぎ @kumagi

http://t.co/iW7u4rm1 PyPyの各種構造体の宣言がかつて無いほどよく分からない。みんな全く実装同じとかどうなってるんだこれ。

2012-02-23 17:25:22
しょーま @shomah4a

んー、 PyObject_HEAD さえ見えていればいいならそれでいいのかもなあ。 CPython でもメモリ確保と解放は Python API 側で用意した関数を使うわけだし

2012-02-23 17:32:34
しょーま @shomah4a

外に見せるインタフェイスとしてそれだけで十分ということなのかもしれない

2012-02-23 17:32:54
くまぎ @kumagi

それ以前にPyPyの人たちは「C拡張書くときはctypesかRPythonか使え」と言ってるようで、そもそも生Cで書かせる事はあまり想定していないらしい。

2012-02-23 17:42:40
Yutaka Matsubara @mopemope

PyPy追いかけてる人はやくまとめてくれないかなー

2012-02-23 17:43:09
モヒカンではない @m0h1can

@kumagi なるほど、ありがとうございます(たしかにインターフェースはctypesで決着させる指針は良いかも)

2012-02-23 17:53:11
くまぎ @kumagi

@shomah4a PyObject_HEADは参照カウンタとクラスへのポインタしか持ってないので、intさえもimmutableになってしまうような。

2012-02-23 17:44:53
しょーま @shomah4a

@kumagi Python の int は immutable ですよ

2012-02-23 17:47:24
くまぎ @kumagi

@shomah4a Python2.6の実装読んでるのですが、PyIntObjectのob_ivalはそのまま数値を非constで持っているので変動しようがありましたが、PyLongObjectとの統合で可変長で持つようになってから変わったんでしょうね。なるほど。

2012-02-23 17:51:47
しょーま @shomah4a

@kumagi 小さな値だと PyIntObject は複数参照で使いまわされるので PyIntObject が持っている数値を直接書き換えるのはまずいですよ。PyObject に対する演算はクラスが持つメソッドテーブルに登録された関数で処理するようになっています。

2012-02-23 18:04:40
しょーま @shomah4a

CPython Code Reading の資料があるといいんだけどなー

2012-02-23 18:05:46
しょーま @shomah4a

@kumagi http://t.co/UDhKgDSV これの資料が参考になると思います

2012-02-23 18:07:13
くまぎ @kumagi

@shomah4a なるほど、ありがとうございます。読みます。

2012-02-23 18:13:14
しょーま @shomah4a

実装じゃなくて概念、だなあ

2012-02-23 18:12:31
しょーま @shomah4a

@kumagi Python のオブジェクトシステムの実装概念の解説なので、外に見せるデータが HEAD だけでいい理由もなんとなくわかると思います

2012-02-23 18:21:52
くまぎ @kumagi

@mayahjpさんと@cocoatomoさんのCPython読書会の資料読んだ。ふむむ。

2012-02-23 18:20:59
くまぎ @kumagi

@shomah4a キャストで取り回していくというのは理解出来るのですが、C言語としてはお行儀が良くないですし(速度の為に仕方ないんだけど)、実体が同じ物に別名を付けてもコンパイラチェックの恩恵を受けれないので意義的にもにょってます…。全部typedefでええやん、と。

2012-02-23 18:24:43
しょーま @shomah4a

@kumagi それは確かにそうですね…。 CPython でも同じだからそうなっているだけ、なのかもしれませんが

2012-02-23 18:32:04
しょーま @shomah4a

CPython だと HEAD だけじゃなくて実体の定義も入ってるけど

2012-02-23 18:32:40
くまぎ @kumagi

@shomah4a CPythonならobj->ob_type->tp_nameを見て、それで適切な形にスイッチしてキャストして例えばPyLongObjectになった瞬間にob_digitが可視になりますし明快なのですが…。

2012-02-23 18:38:15
tomo🐧@learning @cocoatomo

@kumagi @shomah4a コンパイラチェックの恩恵云々は, 動的に型が判明するプログラミング言語を使っている以上しょうがないと思います. CPython はある型にダウンキャストするときは, 型チェック用のマクロに食わせてからキャストしてます.

2012-02-23 18:39:03
tomo🐧@learning @cocoatomo

@kumagi @shomah4a たぶん, 全部 typedef にしてないのは見栄えの問題じゃないかと. ほんとのとこは知りませんが.

2012-02-23 18:40:22
tomo🐧@learning @cocoatomo

@kumagi @shomah4a 余談ですが, tuple の制約条件は C API から壊すことができた気がします. なので, Python 仕様は CPython のレベルで守っているのであって, C API のレベルでは破ることができたりします. そんな感じ.

2012-02-23 18:41:04