Upgrade to Pro — share decks privately, control downloads, hide ads and more …

KOF2015 emacs 18.59 and mule 1.1 on NetBSD 7.0

KOF2015 emacs 18.59 and mule 1.1 on NetBSD 7.0

KOF2015 関西オープンソースの「BSDなひととき」のセミナーで発表した
「emacs 18.59 / mule 1.1 を NetBSD 7.0 で動かした話」
のスライドです。

Izumi Tsutsui

November 07, 2015
Tweet

More Decks by Izumi Tsutsui

Other Decks in Programming

Transcript

  1. なぜ mule 1.1なのか • 某サークルの386BSD機に入ってた • 機能的にあんまり困ってなかった • Emacs19で動かない *.el

    があった • 1996年頃のNetBSD 1.2でも ビルドできてしまった • NetBSDの後方互換性が高過ぎて 気がつくと20年近く経っていた
  2. /* 92.7.10 modified for Mule Ver.0.9.5 by T.Enami In compile_pattern(),

    set bufp->buffer to 0 for forcing re_compile_pattern() to alloc (not realloc) it. In set_pattern(), last_regexp is set to Qnil. */ https://twitter.com/tsutsuii/status/571003158199021569
  3. Lisp_Object とは • 整数、ポインタ、その他の 内部値を保持する整数型 • emacs 18 では int型で定義

    • mule 1.1は alpha OSF/1対応で long型でも定義できるように なっている?
  4. ポインタキャストの罠? for (offset = (char *)&buffer_local_flags.name - (char *)&buffer_local_flags; offset

    < sizeof (struct buffer); offset += sizeof (Lisp_Object)) /* sizeof int == sizeof Lisp_Object */ if (*(int *)(offset + (char *) &buffer_local_flags) > 0 || *(int *)(offset + (char *) &buffer_local_flags) == -2) *(Lisp_Object *)(offset + (char *)b) = *(Lisp_Object *)(offset + (char *)&buffer_defaults); Lisp_Objectっぽい領域に intでアクセスしている。 明らかにクサい https://github.com/tsutsui/emacs-18.59-netbsd/blob/0a7383dcb7b9dbc863fa4adf6c7ae3330ec551d5/src/buffer.c#L270
  5. LP64LEでの動作 (LSB) 02 00 00 00 00 00 00 00

    (MSB) 64ビットのLisp_Objectを 32ビットの (int *) でアクセスした場合、 先頭から4バイトの値を読み 32ビット整数として返す ⇒4バイトに収まる整数なら同じ値になる Lisp_Object (1) = 2 Lisp_Object (2) = 0 (LSB) 00 00 00 00 00 00 00 00 (MSB)
  6. LP64BEでの動作 (MSB) 00 00 00 00 00 00 00 02

    (LSB) Lisp_Object (1) = 2 0 Lisp_Object (2) = 0 (MSB) 00 00 00 00 00 00 00 00 (LSB) 64ビットのLisp_Objectを 32ビットの (int *) でアクセスした場合、 先頭から4バイトの値を読み 32ビット整数として返す ⇒上位4バイト側が返るので違う値となる