「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 での最
大バッファサイズ。