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