「Emacs23.2が更に1ビット稼いだ秘密 — ありえるえりあ
」の理解に時間
がかかったので、自分用にメモしておく。
Emacs23.1 の enum Lisp_Type は以下のように定義されていた。
| 000 | Lisp_Int |
| 001 | 空き |
| 010 | Lisp_Symbol |
| 011 | Lisp_Misc |
| 100 | Lisp_String |
| 101 | Lisp_Vectorlike |
| 110 | Lisp_Cons |
| 111 | Lisp_Float |
enum Lisp_Type は オブジェクト変数(でいいのかな?) 32bit のうち、
下位 3bit に対応する。
Lisp_Int(= 下位 3bit 全てがゼロ)の時は、整数オブジェクトと判断する。
この場合、残り 29bit を符号と整数長として使える。
printf("Emacs23.1(%0.0fMB)\n", ((double)(0xffffffff >> (3 + 1)) / 1024 / 1024));
=> Emacs23.1(256MB)
整数長を計算すると 256MB になる。これが Emacs23.1 での最大バッファ
サイズ。
Emacs23.2 から enum Lisp_Type はこのように変更された。
| 000 | Lisp_Int0★変更 |
| 001 | Lisp_String★変更 |
| 010 | Lisp_Symbol |
| 011 | Lisp_Misc |
| 100 | Lisp_Int1★変更 |
| 101 | Lisp_Vectorlike |
| 110 | Lisp_Cons |
| 111 | Lisp_Float |
整数オブジェクトを 2 つ (Lisp_Int0 と Lisp_Int1。両者は同じ意味) に
増やし、メンバーの並びを変えた。
これにより、下位 2bit がゼロかどうかで、整数オブジェクトと判断でき
るようになった。残り 30bit を符号と整数長として使える。
printf("Emacs23.2(%0.0fMB)\n", ((double)(0xffffffff >> (2 + 1)) / 1024 / 1024));
=> Emacs23.2(512MB)
同じように整数長を計算すると 512MB になる。これが Emacs23.2 での最
大バッファサイズ。