Not only is the Internet dead, it's starting to smell really bad.:2007年11月分

2007/11/01(Thu)

残念です

NetBSD developerの末席を汚す私(I18N下働き)ですが
itojunさんの

からは本当に多くを学ばせて頂きました。

プログラミングのプの字も知らなかった私(元は営業...)が
コの業界に不時着してから数年、今こうしてささやかながらも飯が食えてるのは
氏をはじめとするhacker方に学ばせていただいたお陰です。
生前、メーリングリストや OpenBSDで日本語環境設定スレでお相手して戴いたことを
深く感謝するとともに、故人のご功績を偲び、謹んで哀悼の意を表します。

2007/11/04(Sun)

[NetBSD] lib/36938

PRくれた方から完全に直ってないぜこらメール届く。
mbtowc(3)が-1を返した場合、internal mbstate_tが初期化されないっての*も*
バグじゃないか? とのこと。

01 #include <assert.h>
02 #include <locale.h>
03 #include <stdlib.h>
04 
05 const char sjis[] = "\x95\x5c";
06 const char space[] = " ";
07 
08 int
09 main(void)
10 {
11 	wchar_t wc;
12 	setlocale(LC_CTYPE, "ja_JP.UTF-8");
13 	assert(mbtowc(&wc, 0, 1) == 0);
14 	assert(mbtowc(&wc, space, sizeof(space)) == 1);
15 	assert(mbtowc(&wc, sjis, sizeof(sjis)) == -1);
16 #if 0
17 	assert(mbtowc(&wc, 0, 1) == 0);
18 #endif
19 	assert(mbtowc(&wc, space, sizeof(space)) == 1);
20 	return 0;
21 }

if 0して再初期化を省いても動かなきゃ変ということらしい。
今は19行目のassertにひっかかる。

でもこれ 仕様読む限り、-1を返す場合、internal stateがどうなるかって記述なし(=未定義動作)だよな。
mbrtowc(3)の場合には(size_t)-1を返す場合errnoにEILSEQをセットして
mbstate_tは未定義とする、とはっきり書かれている。

なのでわざわざ初期化する必要もないので let it be なのだが
glibcはこの未定義動作は``初期化する'' として実装してるみたい。

さてどうしよかね...他の実装もちょっと調べてから返事しようか。

2007/11/05(Mon)

[NetBSD] lib/36938 その2

glibcが``初期化する''として実装しているというか、これmbstate_tの使い方の問題だな。
今のcitrus_utf8.cの実装では

219	/* make sure we have the first byte in the buffer */
220	if (psenc->chlen == 0) {
221		if (n-- < 1)
222			goto restart;
223		psenc->ch[psenc->chlen++] = *s0++;
224	}
225
226	c = _UTF8_count[psenc->ch[0] & 0xff];
227	if (c < 1 || c < psenc->chlen)
228		goto ilseq;

としてるので、223行目でmbstate_tにmulti-byteの先頭1byte読み込んでから
(つまり非initial stateになる)226行目でUTF-8の1byte目かのチェック行うからなんだけど
glibcはおそらく、最初の1byte目のチェックが終わるまでmbstate_tに保存しないので
illegal byte sequenceの場合でもinitiail stateのままになるるっぽい。
ちなみにSolarisもVC++も同様の動きするね。

どっちみちこれ実装依存の未定義動作だと思うので
stateless encodingだからって初期化をサボっていいなんて理由はないはずなんだがな。
こんなとこまでglibcに動作あわせる必要はないと思うが、それを英語で説明書けるほど今頭が働いてない。

週末

草津白根で遊ぼうと思ってたんだけど、風邪こじらせてキャンセル。
ぷらっとから届いたSolaris 10 8/7 MediaKitも放置して寝込んでた。

名札は縦書きなのでtnozaki@併記は無理らしい、multiscriptは難しいとしみじみ。

2007/11/07(Wed)

今日

会社から2駅の距離なので、告別式に参列してきました。

参列者の方々も誰が誰やら状態. の私みたいな人間は
遠慮するべきだったかもしれないくらいの人数。

[NetBSD] lib/37290

lib/37290なんというタイミング(;_;)

これ、こないだrunglue.cにつっこんだwctob()で落ちてるんだけど、
どうやらcitrus_iso2022.cでVARIABLEにMAX2を指定してると
wctob((wchar_t)0xA0)以上では、WEOFを返すのでなくabort()に落ちる模様。
fixはなるべく早めに書く。

2007/11/09(Fri)

[NetBSD] runetable.c

libhack向け修正が入った、まあとりあえずはこれでお茶濁しましょ。
uwsconsの続きがkernelに入るまではi18n sysinst(8)の為に
libhackでmultibyte locale使える必要はないからね。

今日

Sony α-700本日発売、その影響からかα-100の黒ボディが6万切ってた。
まあ6万持っていたならMinolta α-9のSSM改造なし中古買いますが。
デジイチは充電がめんどくてな。

2007/11/12(Mon)

[NetBSD] 4.99.35 hangup during multi-user boot process.

lib/37290のPR処理するのに、最新の環境にすべくkernelを4.99.35に更新したら
multi userでbootする途中で固まるんだな、どうやら4.99.32あたりからの症状みたいね。
/etc/rc.d/ttysまでは実行できてるので、rcorder(8)でそれより後に
実行されるscriptを調べて/etc/rc.confからコメントしていくと
犯人はどうやらlkm=YESにいるっぽい。
そこまで判ったとこで時間切れ、そのうち続く。

[NetBSD] pkgsrc/www/firefox-linux

isakiさんとこより。
~/.mozilla/firefox/*/.parentlockだと思います。
あと flashもpkgsrc/multimedia/ns-flash + pkgsrc/www/nspluginwrapperを使えばいいかと。

2007/11/13(Tue)

[NetBSD] 4.99.35 hangup during multi-user boot process その2

lkm=YESは無実でした、間違えて4.99.31でbootしてたぜ。
/etc/rc.d/ttysの"/sbin/ttyflags -a"で固まってる模様、なんだろね。

今日

SONY α-700を店頭でお触りしてきた、読売巨人軍を連想させる例のカラー以外はとても良いボディ。
でも中級機の発売でレンズのラインナップの幅の狭さがより一層目立つ結果になったよな。
普及価格帯の35mm/F2、50mm/F1.7、50mm/F3.5MACRO、100mm/F2、135mm/F2.8あたりが復活しないと
安ズーム一本に飽きた時、次はいきなりGレンズ沼 or CarlZwiss沼だとさすがに敷居が高過ぎると思う。

Kodak EPNなどを販売終了ですか、選択肢がどんどんなくなるなぁ。
AdobeRGBでキャリブレータ付きのHDTVにン十万円注ぎ込まずとも
1万ちょいのライトボックスでリバーサルフィルムの美しさに感動できるのも
あと何年許される贅沢なんだろうか。

[NetBSD] 4.99.35 hangup during multi-user boot process その3

これmodem card差しっぱだと固まるのね、そいやcurrent-userでtty_lock failureなんて
話でてるけどこいつかな? 今日はもう試す気力ないけど。

[NetBSD] lib/37290 その2

patchは書いてあるんだがtestcase書かんとな...まあ今日はもう寝る。

ja_JP.ISO-2022-JP-2.srcの定義ってこれでいいのかな?
KSC5601とかGB2312をincludeしてないんだけど。

2007/11/15(Thu)

[NetBSD] 4.99.35 hangup during multi-user boot process その3

sys/net/ppp_tty.cをr1.50にしても駄目だな。
sys/dev/ic/com.cのcomopen()にdebug printいれて調べてみるか。

昨日

テレビないので某量販店家電コーナーの50inch大画面でかぐや(SELENE)特番のさわりだけ見てた。

ゲストはカメラ運の悪いAlan Bean(Apollo12)、これハイビジョン壊れませんよーにという験担ぎ?
EarthriseネタならBill Anders(Apollo8)あたりも出演してほしかった。

それにしても興味うすげな芸人にダラダラ司会進行させる神経、さすが紅白脳。
これなら「血にも肉にもならないとお前が言うな」立花隆+イタコをゲストに
故Jim Irwin(Apollo15)とスピリチュアルに霊界通信する企画とか
副島隆彦 with Moon Hoax'sに今回の映像を語ってもらう方がまだマシ。
やはりWalter Cronkite(CBS)は偉大だった。

(C)JAXA/NHK 邪魔だよな、 NASAの太っ腹ぶりは望むべくもないのか。
JAXA単体でも利用条件( 1 2)はかなり厳しい。

ja.wikipedia.orgの 画像:SELENEもNASA提供でロンダリングしてんのね。
NASA→JAXAだと(元はパブドメなのに)NASA提供と書くのが義務になり
JAXA→NASAだと(元は制約の多いのに)パブドメになるって、月の起源より謎。

Apolloは交信音を通じて38万km先の世界にいる3人に感情移入できるんだが
無人探査機だとそれがないので味気ないやな、Mars Exploration Roverも同じく。

その後寄った本屋で20前半くらいの女性がFreeBSDコマンドブックビギナーズを
買う瞬間を目撃しかぐや以上の衝撃を(以下略

2007/11/16(Fri)

[pcc] pcc(1) _Bool type bug その12

後置++の為にINCR/DECRをpass2に渡すのはとてもめんどくさそうなので後回し。
先にLSEQとRSEQが変な動作してるのを修正することにしますか。

前回のpatchで{PLUS,MINUS,MUL,DIV}EQであれば

#include <stdbool.h>
_Bool x;
int y;
main(void)
{
	x *= y;
}
0xbb901290) =, bool, REG %eax, SU= 0(@REG,,,,)
    0xbb901080) NAME x, bool, REG %eax, SU= 0(@REG,,,,)
    0xbb9012bc) SCONV, bool, REG %eax, SU= 0(@REG,,,,)
        0xbb9011d0) *, int, REG %eax, SU= 0(@REG,,,,)
            0xbb901264) SCONV, int, REG %eax, SU= 0(@REG,,,,)
                0xbb90111c) NAME x, bool, REG %eax, SU= 0(@REG,,,,)
            0xbb9011fc) NAME y, int, REG %eax, SU= 0(@REG,,,,)

と正しく整数拡張されたツリーが出来上がるんだけど、{LS,RS}EQだけは

#include <stdbool.h>
_Bool x;
int y;
main(void)
{
	x <<= y;
}
0xbb901290) =, bool, REG %eax, SU= 0(@REG,,,,)
    0xbb901080) NAME x, bool, REG %eax, SU= 0(@REG,,,,)
    0xbb9011d0) <<, bool, REG %eax, SU= 0(@REG,,,,)
        0xbb90111c) NAME x, bool, REG %eax, SU= 0(@REG,,,,)
        0xbb901264) SCONV, char, REG %eax, SU= 0(@REG,,,,)
            0xbb9011fc) NAME y, int, REG %eax, SU= 0(@REG,,,,)

という問題があったのよね。

暫定的にcc/ccom/trees.cに↓の変更を加えると

@@ -424,7 +435,8 @@
 		case RS: /* must make type size at least int... */
 		if (p->n_type == CHAR || p->n_type == SHORT) {
 			p->n_left = makety(l, INT, 0, 0, MKSUE(INT));
-		} else if (p->n_type == UCHAR || p->n_type == USHORT) {
+		} else if (p->n_type == BOOL ||
+		    p->n_type == UCHAR || p->n_type == USHORT) {
 			p->n_left = makety(l, UNSIGNED, 0, 0,
 			    MKSUE(UNSIGNED));
 		}

pass2でコケる問題は解消するみたい。

0xbb9012bc) =, bool, REG %eax, SU= 0(@REG,,,,)
    0xbb901080) NAME x, bool, REG %eax, SU= 0(@REG,,,,)
    0xbb9012e8) SCONV, bool, REG %eax, SU= 0(@REG,,,,)
        0xbb9011d0) <<, unsigned, REG %eax, SU= 0(@REG,,,,)
            0xbb901264) SCONV, unsigned, REG %eax, SU= 0(@REG,,,,)
                0xbb90111c) NAME x, bool, REG %eax, SU= 0(@REG,,,,)
            0xbb901290) SCONV, char, REG %eax, SU= 0(@REG,,,,)
                0xbb9011fc) NAME y, int, REG %eax, SU= 0(@REG,,,,)
...
movl y,%eax
movb %al,%cl
movzbl x,%eax
sall %cl,%eax
cmpl $0,%eax
setne %al
movb %al,x
...

でもこれ{LS,RS}EQの場合のopact()の処理から見直した方がいいのかもしれない。

[NetBSD] 4.99.35 hangup during multi-user boot process その4

src/sys/dev/pci/pccbb.cのpccbb_power()、1315行目のtsleep(9)が戻ってこないとこまでは調べた。
tsleep(9)ってobsoleteだよね?

2007/11/17(Sat)

今日

奥日光で焼き鮎と揚げ湯葉饅頭食ってきた。

紅葉はすっかり終わってて初冬の荒涼とした光景、それもまた由。
東照宮から中禅寺湖のあたりは朱に金に染まって豪華絢爛だったけど
今回はそっちまで回る時間が無かったので来年リベンジということで。

[NetBSD] lib/36938

comp.std.cで白黒つけようぜということらしい。

2007/11/18(Sun)

今日

天気崩れると思ってたから日光は日帰りにしたのに今日も快晴、がっくし。

NikonScan 4は無圧縮TIFFを吐くので14bit/4000dpiだと1枚131-5MB程度なのだが
このサイズだと36枚撮りフィルムが4.7GBの片面DVD-Rにはギリギリ入らない大きさ。
LZWは写真の場合には逆効果だし、ZIPはサポートするアプリが少ないからしょうがないけど。

RAW(=NEF Nikon Electronic Format)も吐けるんだけど、ファイル圧縮非対応版なので
しょせんNEFの中身はTIFF + EXIFだからディスク容量節約の目的には使えないのよね。

DNG(Adobe Digital Negative)も他社のRAW同様TIFFの拡張みたいだけど、Adobeの配布してる
DNG Converterはファイル圧縮対応してるようなので、こいつに変換しちゃおうか。

2007/11/19(Mon)

lib/37290 その3

tsleep(9)がwakeup(9)してくれないので最新のHEADに更新できない状態なんだけど
あまり長いこと放置もしてらんないんで、あとでcommitしちまおう。
patchは ここ

そのうちja_JP.ISO-2022-JP-2.srcにGB2312とかKSC5601なんかも追加してかんとね。

$ cvs log -r1.2 share/i18n/esdb/ISO-2022/ISO-2022-JP-2.src
add GB2312 after JIS0208/0213, then there's no confusion.

some chinese chars may get converted into JIS0208/0213 on
"iconv -f utf-8 -t iso-2022-jp-2".  but anyway, it's iso-2022-*jp*-2 so
japanese chars should take precedence.
XXX what should we do about X11 ctext?

i really hate unicode han unification.
do we really need to support language tags?

Xutf8のUTF-8 -> CompoundText変換はこんなかんじ。

$ cat >text.c
#include <stdio.h>
#include <stdlib.h>
#include <X11/Xlocale.h>
#include <X11/Xutil.h>

int
main(void)
{
        Display *d;
        XTextProperty tp;
        char *u8 = "\xe3\x80\x80"; // U+3000

        printf("%s\n", setlocale(LC_CTYPE, ""));
        d = XOpenDisplay(NULL);
        Xutf8TextListToTextProperty(d, &u8, 1,
            XCompoundTextStyle, &tp);
        printf("%.*s\n", tp.nitems, tp.value);
        XCloseDisplay(d);
}
^D
$ cc -I/usr/X11R6/include -L/usr/X11R6/lib -lX11 -Wl,-rpath,/usr/X11R6/lib -o test test.c

$ LC_CTYPE=ja_JP.eucJP ./test
ja_JP.eucJP
ESC$(B!!

$ LC_CTYPE=zh_CN.eucCN ./test
zh_CN.eucCN
ESC$(A!!

へぇ、現在のロケールでJISX0208使うかGB2312使うか決めるのね。
XFree86 4.0.2の当時からこんな動作したっけ?

異体字セレクタの登録状況って全然知らんのだけど
JISX0208とGB2312のそれぞれのU+3000(IDEOGRAPHIC SPACE)は異体字扱いになるんだろか?
そこまではさすがに想定してない気がするのだが。

異体字セレクタが使えないとなると

$ iconv -f UTF-8 -t CTEXT

ではなく

$ iconv -f UTF-8 -t ja_JP.CTEXT

という解決策くらいしかないよな気がするのだが、どうしたものか。

2007/11/20(Tue)

GNU libiconv

libiconv-1.12でてたのね、ChangeLogだけ読んだけど

くらいが外から見える変更かな、というわけでCitrus iconvで足りてないのは

MACHEBREW (※1)
MACARABIC (※1)
DEC-KANJI (※2)

※1 GNU libiconv程度の実装ならcsmapper/esdbファイル書くだけ
真面目に実装しようとするとM:N変換モジュールが必要
※2 citrus_euc.cをベースに簡単に実装できそう、やる気の問題

と変化なしだと思う。

2007/11/21(Wed)

[NetBSD] lib/36938 その4くらい

うーん、改めてISO/IEC9899読んでみると
mbtowc(3)がmbrtowc(3)であったなら(size_t)-2を返すケース(restartableね)でも
敢えて-1を返す(restartableではない)って事は
変換途中のpartial charaterは(mbrtowc + mbstate_tとは違い)
internal-stateには一切保持しない、と言ってるような気がしてきた。
だからstateless encodingは一切internal-stateを汚さない、ってことで
Neil氏が正しいということになる。

するってーと世の中の

int
mbtowc(wchar_t *wc, const char *s, size_t n)
{
    static mbstate_t mbtowc_st = { 0 };
    size_t ret;

    ret = mbrtowc(wc, s, n, &mbtowc_st);
    if (ret == (size_t)-2) {
        ret = (size_t)-1;
        errno = EILSEQ;
    }
    return (int)ret;
}

と似たことをやっている実装(Citrusも実質はこれ)は全部アウトということだ:-)

glibc2も駄目だね、22行目でaseert(3)に引っかかる。

01 #include <assert.h>
02 #include <locale.h>
03 #include <stdlib.h>
04
05 /* partial UTF-8 string, mbtowc may return -1(mbrtowc may -2)*/
06 const char partial_utf8[2] = { 0xe3, 0x80 };
07 /* valid UTF-8 string */
08 const char good_utf8[1] = { 0x20 };
09
10 int
11 main(void)
12 {
13     wchar_t wc;
14
15     setlocale(LC_CTYPE, "en_US.UTF-8");
16     assert(mbtowc(&wc, NULL, 0) == 0);
17     assert(mbtowc(&wc, good_utf8, sizeof(good_utf8)) == 1);
18     assert(mbtowc(&wc, partial_utf8, sizeof(partial_utf8)) == -1);
19 #if 0 /* omit re-initialzation */
20     assert(mbtowc(&wc, NULL, 0) == 0);
21 #endif
22     assert(mbtowc(&wc, good_utf8, sizeof(good_utf8)) == 1);
23     return 0;
24 }

ちゃんと直すには_citrus_mbrtowc_${ENCODING}_priv()のインタフェース変更が
必至なんだけども、もっと手軽な方法ないかね(ぉ。

lib/libc/citrus/citrus_ctype_template.hの
mbtowc_priv()でpsenc->chlenを0にリセットするのは凶悪過ぎるよなー。
でも似たようなことctype_mbsinit()でやってんだよな。

[NetBSD] lib/37290 その4

とりあえずcommitしといた。

[NetBSD] lib/36938 その5だと思う

わはー、どっちにしろコメント書いとけ指令きた。
それは猿にシェークスピアを書けと(以下略、英誤とかEngrishでいいですか?

そいやiconv(3)のprototype問題もコメント入れとけ言われて放置してたな。

2007/11/22(Thu)

[NetBSD] lib/36938 その6じゃないかな

Solarisはちゃんとstateless encodingの場合、internal-stateを汚さず初期状態のままだ。
というわけでNetBSDとglibc2のバグですわ、こりゃ。

昨日も書いたけど

Index: citrus_ctype_template.h
===================================================================
RCS file: /cvsroot/src/lib/libc/citrus/citrus_ctype_template.h,v
retrieving revision 1.33
diff -u -r1.33 citrus_ctype_template.h
--- citrus_ctype_template.h	18 Sep 2007 15:12:07 -0000	1.33
+++ citrus_ctype_template.h	22 Nov 2007 04:11:35 -0000
@@ -209,6 +209,7 @@

 	state = *psenc;
 	err = _FUNCNAME(mbrtowc_priv)(ei, pwc, (const char **)&s, n, psenc, &nr);
+	psenc->chlen = 0; /* XXX FIXME */
 	if (err) {
 		*nresult = -1;
 		return (err);

というとってもevilな修正入れておいて、後々_citrus_${ENCODING}_mbrtowc_priv()の
インタフェースを再考するとかかなぁ。

まあABIは問題にならないのでそれだけは良かったな。

2007/11/23(Fri)

[NetBSD] lib/36938 その7

塩崎さんからつっこみが。
mbtowc(3)はinternal-stateにpartial characterを保持しない、とか小難しいことなしに
単純にerrorの場合はinternal-stateを呼出前の状態に戻す、でいいですかね。
んじゃnetbsd-bugsにこういうfixいれるよってメール書きますか。

mbtowc(3)より先にmbrtowc(3)の仕様を読んだせいで、それが先入観になり
-1の場合はinternal-stateの状態は不定だと思い込んでしまう私も修行が足りないな。
動かないコンピュータ級の事故起こす前に、SIから足を洗った方がいいかもしれない。

凶^H 今日

先週ちょっと物足りなかったので再び日光へ。
今回は東照宮の周りをぶらぶらしようと思ったんだけど、着いたしょっぱなに
400年の風雪に耐えた石畳の上にα-807si + 17-35mm/F2.8-4(D)を落っことした。

17-35mm/F2.8-4(D)の方はマウント部からポッキリと折れて真っ二つ。
α-807siもミラーあがりっぱでシャッターが切れない状態、どっちも修理不能だな。
被害総額は中古相場で5-6万ってとこか、はう。

世の中にはEOS-1DsMkIIIとL IS USMレンズをぶっといカーボン三脚ごと
谷底に落とした人もきっといることだろうし、そんな不幸な人に比べれば
こんな被害額なんてかわいいもんだ、とか不穏な事考えながら
うわの空で帰路についたら、どうやら観音様の罰があたったらしく
とどめにキャッシュカードとSUICA定期を紛失しましたわ。
あまりに悲惨な一日で乾いた笑いが止まりません、あっははは。

SUICAは利用停止のみという処理はできないのね。
する場合は再発行手続と同時で手数料 + デポジットの1000円必要だと。
駅員さんも届けられるかもしれないしMOTTAINAIから1-2日待ったほうがいいですよと。
そりゃ定期券の方は記名だし、払戻されるリスクは無いけど
チャージしてたお金の方は使われてしまう可能性あるよなぁ。
たかだか2万上限とはいえ、お金預かってるという意識に欠けてるような気がしないでも。

キャッシュカードの方は、SMBCの電話番号メモってなかったので
最寄りのATMに駆け込み、そこのチラシにあった番号にTELして利用停止手続。
しかしこのチラシが実はphishingだったらとか一瞬ひるんでしまったぜ。
このオレオレなご時世、電話にも証明書欲しいぜ。
よいこはもしもの時の為にメモしとこうね。

それにしてもひでぇ一日だった。
最近コード書かずに外で遊んでばかりなので神様が三連休は家に閉じ篭って
さっさとTODO消化しろとお怒りになってるに違いない。

いや神様はα-700買えといいたいのかもしれねぇ、でもそんな金ないっす。

2007/11/26(Mon)

今日

SMBCでキャッシュカードの再発行依頼。
生体認証のやつにしてもらおうかと思ったのだけど
まだ全国どこでも使えるわけではなさそうなので今回は見送り。

SUICA再発行、定期の区間については確認を求められたけど
チャージ金額については確認ないのねやっぱり、ふーん。

カメラはSONYに電話して修理見積依頼、明日pickupしてもらうことに。
まあ中古探して買うほうが安いとは思うけど。

<エスカレーター> 横浜地下鉄「歩かないで」構造上想定外
エスカレーターの片側を空ける為に皆じーっと並んで待ってるせいで
乗り口周辺が長時間混雑してるのは危険だと皆そろそろ気づくべきだよな。
市営地下鉄は転落防止の ホームドアといい安全対策は仕事してそうだ、運賃はとてもアレだが。

江ノ島電鉄のエスカーはとてもよくできたトロンプ・ルイユだよね。
あの改札口から驚愕の正体を想像できる人はエスパーに違いない。

[NetBSD] lib/36938 その8

塩崎さんから戴いたpatchをcommitしてnetbsd-bugs@にメール投げた。
多分wctomb(3)も同様の対策が必要だと思うのでまた後日。

macromanサポート済ですね。

2007/11/28(Wed)

昨日

AERA、表紙に釣られて立ち読み。
ラウル・ミドンはウドン好き」ってそれ絶対中吊り広告用に考えてたネタだろ。
さぞファンキーにズルズル汁すするんだろな。

Nikon D300とOLIMPUS E-3お触りしてきた。

2007/11/30(Fri)

[pcc] pcc(1) _Bool type bug (reprise)

どこまで作業してたのかすっかり忘れてしまった。

はいはい、INCR/DECR(後置++/--)はpass2で処理すんべかってとこまでね。
なぜこういう結論になったのか作業を再開する前におさらいしておくか。

現行コードのpass1では

$ cat >test.c
int x;
_Bool y;
main(void)
{
	x = y++;
}
^D
$ cpp test.c | /usr/pkg/libexec/ccom -Xb

0xbb9019c4) =, bool, 0x0, 0x8081830
    0xbb90119c) NAME, 0, 0, bool, 0x0, 0x8081830
    0xbb9011c8) ++, bool, 0x0, 0x8081830
        0xbb9019f0) NAME, 0, 0, bool, 0x0, 0x8081830
        0xbb901080) ICON, 1, 0, bool, 0x0, 0x8081830
...

というツリーになるんだけど、これをpass2に渡す直前に

pcc/cc/ccom/trees.c
...
1927 static NODE *
1928 delasgop(NODE *p)
1929 {
1930 	NODE *q, *r;
1931 	int tval;
1932 
1933 	if (p->n_op == INCR || p->n_op == DECR) {
1934 		/*
1935 		 * Rewrite x++ to (x += 1) -1; and deal with it furtherdown.
1936 		 * Pass2 will remove -1 if unneccessary.
1937 		 */
...

の部分で

0xbb9019c4) =, bool, REG %eax, SU= 0(@REG,,,,)
    0xbb90119c) NAME x, bool, REG %eax, SU= 0(@REG,,,,)
    0xbb9011c8) -, bool, REG %eax, SU= 0(@REG,,,,)
        0xbb901924) =, bool, REG %eax, SU= 0(@REG,,,,)
            0xbb901b64) NAME y, bool, REG %eax, SU= 0(@REG,,,,)
            0xbb901b90) +, bool, REG %eax, SU= 0(@REG,,,,)
                0xbb9019f0) NAME y, bool, REG %eax, SU= 0(@REG,,,,)
                0xbb901950) ICON $1, bool, REG %eax, SU= 0(@REG,,,,)
        0xbb901080) ICON $1, bool, REG %eax, SU= 0(@REG,,,,)

というツリー、つまりは

int x;
_Bool y;
main(void)
{
	x = (y += 1) - 1;
}

というコードに書換えてるわけ、i386 assemblerを吐かせると

movb y,%al
addb $1,%al
movb %al,y
subb $1,%al
movb %al,x

となる。

他の整数型ならこんなkludgeでも正しい答えが得られるんだけど
_Bool型の場合は完全にNG、理由は その7をもいっかい読んでくだし。

そもそもpass1でツリー書換を行うのであれば

int x;
_Bool y;
main(void)
{
	x = y;
	y += 1;
}

という書換をまず考えると思うんだけど、困ったことにこれ複文なのよね。
x = yとy += 1という別々の文をいっこのツリーで表現しようとすると破綻するし
ツリーを2つ作成すれば++/--による副作用は直後であることの保証が難しいかもしれない。
だから現行のソースではx = (y += 1) - 1とむりくり単文にしてるんだと予想。

つーわけで根本的な解決はINCR/DECRをpass2までスルーさせて
arch/*/tables.cに対応するassemblerを定義するしかなさそうというとこですな。

そもそもvaxのtable.cみるとINCR/DECRはpass2で処理してた痕跡がある。
オリジナルもそうなってますな、どうして変更したんだろ。

まずはこうか。

--- cc/ccom/pass1.h.orig        2007-11-29 19:05:35.000000000 +0900
+++ cc/ccom/pass1.h     2007-11-29 21:58:57.000000000 +0900
@@ -384,8 +384,6 @@

 #define	UNASG		(-(PLUSEQ-PLUS))+

-#define	INCR		(MAXOP+26)
-#define	DECR		(MAXOP+27)
 /*
  * The following types are only used in pass1.
  */
--- mip/node.h.orig     2007-07-22 21:50:56.000000000 +0900
+++ mip/node.h  2007-11-29 22:19:50.000000000 +0900
@@ -191,4 +191,7 @@
 #define	FUNARG	57
 #define	ADDROF	58

-#define	MAXOP	58
+#define	INCR	59
+#define	DECR	60
+
+#define	MAXOP	60

うはー先は長そうだ。

今日

17-35mm/F2.8-4(D)のマウント部破損、修理見積で1万5千円ナリ。
予想より安く済みそうなので、そのまま本修理をお願い。
中古相場だとここんとこ3万前後で高止まりしてたしね。

このレンズはAPS-Cデジでも標準ズーム代替(換算28-55mm)として使えるし
なにより値段が手頃なのよね、SONYでも復活させてくれんかね。

まあこいつの光学系は TAMRON A05と同じ(OEMだか共同開発だか)なので
そっちを新品(4~5万)で買えばいいのかもしれんが。
ただA05は7枚羽根の非円形絞りってーとこが残念ではある。