faith's blog

気まぐれ日記

もう少しな気がするんです

おはようございます。

結局、この週末もcrosswalkと格闘でした。 惨敗ですけどね。

しかも、金曜にボーリング からの 飲み会で、 腕は痛いは、頭は痛いはで、結局土曜日は半日ぐらいぶっ倒れてましたから、 あまり進んでないんですよね・・・。

肉体は、強制的にHybernation(というか、Halt?)させたので、 休息にはなったかも?ということで良しとします。

で、本題ですが、 crosswalk for tegra Ubuntuは、ビルドが通ったんですけど、結局動かず。 Tizen と同じところでこけてる感じです。

Tizen の方は、Abortがかかっている箇所の意図が意味不明だったので、 とりあえず、コメントアウトしたら、先に進んで、セグりました。 (SIGSEGV=セグるって、方言なのかな)

void IMEStateChangeHandler::SetInstance(IMEStateChangeHandler* impl) {
  CHECK(!impl_) << "Replacing set IMEStateChangeHandler implementation.";
  impl_ = impl;
}

↑この、CHECKマクロが意味不明で、引数がfalseだと、Abortします。 しかし、メンバ変数implは初期値NULLなので、最初にSetInstanceした時点で、Abortするんです。 がついているのが間違いかと(引数のチェックをするつもりかと)おもって、修正してみたら、 もっと早いタイミングでAbort。

・・・意味がわかりません!

何なんでしょうか、Intel版ではここでAbortで止まったなんてことはないので、 ここに処理がきた時点でアウトなんでしょうか。 後で何か問題があるかもしれませんが、そんなことは未来の私が何とかするので、良しとします。

ということで、とりあえず外してみたら、以下の箇所でセグりました。

void WaylandWindow::RealizeAcceleratedWidget() {
  if (!shell_surface_) {
    LOG(ERROR) << "Shell type not set. Setting it to TopLevel";
    SetShellAttributes(TOPLEVEL);
  }

  if (!window_)
    window_ = new EGLWindow(shell_surface_->GetWLSurface(),
                            allocation_.width(),
                            allocation_.height());
}

thisポインタがNULLらしいです。 メモリ破壊って訳じゃなく、

window->RealizeAcceleratedWidget();

を実行したときに、windowがNULLだった場合、 thisポインタにアクセスしたときに初めてセグるらしいですね。 初めて知りました。

pythonのselfみたいなものでしょうか。

Wayland周りまで降りてきたので、解析が進むんじゃないだろうかと思い・・・ たいですが、仕事してきます。