2011-08-30

25MB程度のDLLをPGOで作ろうとするとLINK.EXEがクラッシュしてしまう

25MB程度ってのは、FirefoxのコアモジュールであるXUL.DLL。Mozillaでは現在Win32 (x86)はVC8を使ってて、Win64 (x64)はVC9を使ってるんだけど (なんでWin64だけVC9使ってるかというとコンパイラのバグのせいで生成したコードが正しくないから)、現在ビルドチームでVC10に移行することを計画してる。

FirefoxというかGeckoでは、メモリ関連のモジュールは、VCのCRT内部のメモリ関数じゃなくて、jemallocというFreeBSD由来のモジュールを差し替えてる。VC8とかVC9だと、CRT (MSVCRT*.DLL) のソースコードがコンパイラに付属しているので、それをコンパイルしてメモリ関連だけ置き換えて使ってるんだけど、VC10からはビルド可能なソースコードが付かなくなった。その関係で未だにVC8とかVC9を使ってたんだけど、Kyleがハッキーな方法を見つけたんで、VC10を使ってもjemallocが動くようになった。そのため、今VC10で動く (=自動テストがちゃんと通る) ように一部のメンバでいろいろと動いてる。

Win64版はVC9を使ってビルドしてて未だオフィシャルではないけど (Nightlyはある)、自動テストが毎回走ってて、JavaScript周りの一部のIssueを残して問題なくはなってる (多分GC周りっぽいんだけど、手元で再現できなくてホント困ってる)。当然Win64版もVC10に移行する計画があって、ビルドチームのArmenはツール周りで、その他はほぼ僕の仕事でもあるんだけど、最近というか今週テストしてみて、PGOを有効にした状態でビルドができないという問題にぶち当たった。

でなんでかとそのデータを見てみると、Win64版のリンカ (LINK.EXE) がクラッシュして内部エラーで終了してる。でさ、Win32版のリンカ (Win32版のリンカでもWin64の実行イメージは生成できる) で試すと問題なくパスする訳だ。

ということで、mozilla-buildを直せばビルドは可能にはなるんでとりあえず回避方法は見つかったけど、これって直してもらえないかなぁってホント思う。関数のエントリ探しにいって、Access Violation起きてるみたいだけどさ。

2011-08-09

大人女子スマケーにおける残念なDOM実装

テスト端末として、"大人女子スマケー" 007SH Jを入手した。

Androidへプリインストールされた標準ブラウザでいろいろテストした結果、これはDOMの実装として残念な状態になってる。

ハードウェアキーボードといっても、実際は常にIMEを経由するような実装になってるので、テキストボックスとかでは、常にIMEがオンの状態で動く。

でさ、keydownとかのイベントってのは、DOMでは以下のように定義されてる

A user agent must dispatch this event when a key is pressed down. The keydown event type is device dependent and relies on the capabilities of the input devices and how they are mapped in the operating system. This event type must be generated after the key mapping but before the processing of an input method editor, normally associated with the dispatching of a compositionstart, compositionupdate, or compositionend event. This event type must be dispatched before the keypress and keyup events event associated with the same key.

IMEがオンであっても、今のブラウザはkeydownイベントは発生してるんだけど、残念な事に日本語入力 (入力方式: 漢字) の時には、keydownイベントが発生しない。まずこれはどうかと思う。(Firefox for Linuxも同じなんでどうかと思う)

もっとすごいのは、入力方式を半角アルファベットにしたとき。その場合はkeydownイベントが発生するんだけど、その際にIMEがオンになってることを示すような特殊なkeycodeを返さずに、その今入力しようとした文字が入る。10キーだから[a]って押しても、未確定の状態でaが入力されるのに、keydownイベントで[a]のキーコードがkeyCodeに指定されて、その後keypressイベントも発生して、"a"が入力される。

入力モードが半角アルファベット

  1. [a]を入力
  2. keydownイベントが発生。keyCodeは"a"のキーコード
  3. keypressイベントが発生。keyCode/charCodeはaの文字
  4. もう一度[a]を入力
  5. keydownイベントが発生。keyCodeは"b"のキーコード
  6. keypressイベントが発生。keyCode/charCodeはbの文字

keydownのkeyCodeがおかしいのはまぁいいとして、文字を確定もしてないのにkeypressイベントを発行してるってのは、DOM的にどうよ?。DOM3的には、textinputがあるけど、過去との互換性どうするの?

で、Fennecはというと、、、うーん、ハードウェアキーボードの実装に致命的な問題があるので、Android Market上で、この端末はブラックリストに入れると思う。Firefox 8か9で直すから、その時にはブラックリスト解除するけどさ。