RC3の日記

とくにないです

krollの起動シーケンス

  krollというcompact microkernelが変数やメソッドを変換してくれています。

  〜Appcelerator Titanium DesktopはRubyやPython,PHPをなぜ使えるのか?(仙台 Rails Vim JavaScript社長)〜

へー。ソース読むか。

ソースコードリーディングの前に

Gitクライアントとか入れてないので、ページ右上のDownload Sourceからダウンロード。


おもむろにDoxygenを起動して・・・のはずが、インストールしてなかったので、インストールから。Graphvizはインストール済みだったが。


krollのフォルダを指定し、Doxygenを全力疾走させること1時間ちょい。HTMLドキュメント完成。ファイル数:13670、フォルダ数:4114、150Mb。ぱねえ。

はじまりはメイン

どこから手え付けるんだよ・・と途方に暮れる。・・・。そうだメインだ!!

 (かくだい)  [せいかい]

以下、本筋でないコードは削除で。

boot\boot_win32.cpp

        int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR command_line, int)
        {
        #ifdef USE_BREAKPAD
                // Don't install a handler if we are just handling an error.
                if (__argc > 2 && !strcmp(CRASH_REPORT_OPT, __argv[1]))
                {
                        return KrollBoot::SendCrashReport(); // これ?
                }

                KrollBoot::breakpad = new google_breakpad::ExceptionHandler();
        #endif

                return KrollBoot::Bootstrap(); // つぎ
        }

 これ?と関係あんのかな〜。[バージョンアップで安定すると思うからあえて調べない]

boot\boot.cpp

        int Bootstrap()
        {
                // マニュフェストファイルとか
                // アップデート検索とか
                // インストールすんのかとか
                // ライブラリとか
                // 環境変数の設定とか

                Blastoff(); // つぎ
        }
boot\boot_win32.cpp

        string Blastoff()
        {
                // Windows boot does not normally need to restart itself,  so just
                // launch the host here and exit with the appropriate return value.

                // This may have been an install, so ensure that KR_HOME is correct
                EnvironmentUtils::Set("KR_HOME", app->path);
                exit(KrollBoot::StartHost()); // つぎ
        }

コメント訳そうと思って残しておいたけど、よくわかんね。

boot\boot_win32.cpp

        typedef int Executor(HINSTANCE, int, const char **);
        int StartHost()
        {
                string runtimePath(EnvironmentUtils::Get("KR_RUNTIME"));
                string dll(FileUtils::Join(runtimePath.c_str(), "kroll.dll", NULL));
                HMODULE khost = SafeLoadRuntimeDLL(dll);
                Executor *executor = (Executor*) GetProcAddress(khost, "Execute");
                return executor(::GetModuleHandle(NULL), argc,(const char**)argv); // つぎ
        }

なーんか、Win32の臭いがしてきたぞ。てか、これ、kroll.dllのExecuteを実行してるよな。


というわけで、bootディレクトリを離れて、libディレクトリへ。

libkroll\win32\win32_host.cpp

        int Execute(HINSTANCE hInstance, int argc, const char **argv)
        {
                instance = hInstance;
                Host host(argc, argv);
                return host.Run(); // つぎ
        }
libkroll\host.cpp

        int Host::Run()
        {
                while (this->RunLoop()) {} // つぎ
        }

恐怖の無限ループ。

libkroll\win32\win32_host.cpp

        bool Host::RunLoop()
        {
                MSG message;
                if (GetMessage(&message, NULL, 0, 0))
                {
                        TranslateMessage(&message);
                        DispatchMessage(&message);
                        return true;
                }
        }

GetMessage、TranslateMessage、DispatchMessageってまんまWin32すなあ。

生のWin32を見ると、隔世の感があるわあ。

ワンポイント

と、正直どうでもいいw

はあ

 (拡大
こっちが本編。ほんと、起動なんてどうでもいいww こっちはいつになるのやらね。ちょっと後々になりそうな予感。