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

KOF2015 emacs 18.59 and mule 1.1 on NetBSD 7.0

Avatar for Izumi Tsutsui Izumi Tsutsui
November 07, 2015

KOF2015 emacs 18.59 and mule 1.1 on NetBSD 7.0

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

Avatar for Izumi Tsutsui

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バイト側が返るので違う値となる