2012年3月19日月曜日

Adlintを読む その4

その3で読んだsingle_module_phasesの中身に入っていく。

最初に実行されるのはcpp/phrase.rbに書かれているCpp::ParsePhrase。contextハッシュに、処理内容をひたすら積んでいってる。
積まれた処理は、次のCpp::EvalPhaseでシステム固有の.h、プロジェクト固有の.h、そして.cへと順に適用される。

各処理は、それぞれ次の順番で処理される。まずPreprocessedSourceで結果のソースファイルを用意し、Preprocesserがプリプロセス処理を実行していく。処理途中に定義されたマクロは、Cpp::MacroTableに格納されていく。

ざっと読む限り、まっとうにCのプリプロセッサをRubyで実装しているようだ。ここだけ切り出したいって要求もあると思う。レガシーなソースだと、#ifdefの嵐でどこが有効か判らなくなることもあって、マクロ展開をせず#ifdefだけ処理するカスタム版のプリプロセッサが欲しいこともあるからだ。時間があったらそっちもトライしてみたい。

2012年3月16日金曜日

AdLintを読む その3

ちょっと開いたけど、続けてSingleModuleAnalyzer#executeを読んでいく。

executeは他のSingleModuleAnalyzerクラスのメソッド同様、analyzer.rbにある。

まずLanguage#ofを呼んで、言語を設定している。ここで言っているのは日本語とか英語とかのことではなく、CとC++の切り替えだ。Languageクラスはlang.rb内にあり、ofは現状ハードコードでCを指定している。まぁC++のパースとか大変だもんな……
実際に返しているのは以下のようなもの。

続けてProgressMonitorのインスタンスを用意しReport#newにブロックを渡して内部で処理をやっている。PhaseContextのインスタンスを作り、ソースのパスとシンボルテーブルを用意してから、Langから取得したモジュール群を、次のようなコードで順にexecuteしていっている。

なかなか実際の中身に入れんなー。

2012年3月11日日曜日

AdLintを読む その2

次に来るのはsmaメソッド。

入力ファイルごとに出力のためのフォルダをsma_output_dpathメソッドで作り、SingleModuleAnalyzerクラスのインスタンスを生成してrunメソッドを呼んでいる。つまりsmaとはSingle Module Analyzerのアクロニムだったわけだ。

SingleModuleAnalyzerの定義はanalyze.rbにあり、Analyzerから継承されている。SingleModuleAnalyzer自体にはnewとprivateメソッド群はあるが、runはsuperのAnalyzerで定義されている。

Analyzerもおなじくanalyzer.rbにある。runメソッドではまずlogの準備をし、Analyzer.currentにselfをセットしてからexecuteを呼び出している。この辺の作りは、なんかrubyっぽくないなー。

次はSingleModuleAnalyzer#executeを追いかければいいということになる。


2012年3月8日木曜日

AdLintを読む その1

adlint も adlintizeと同様、Rubyのbinにあるのはplace holderで、本体はgemの下にある。

コマンドラインを処理した後、AdLintのモジュール関数群を順に呼んで処理を行なっている。具体的には以下の順。


AdLint.setup
AdLint.sma
AdLint.sma_met_fpath
AdLint.cma
正直、最初のやつ以外は関数名だけでは何をしているやらさっぱり。

2012年3月7日水曜日

AdLintを読む その0

せっかくRuby製だしソースも公開されているし、読んでみようかと。

実行順に従って。まずはadlintizeから

コマンドラインから
where adlintize
とすると、Rubyのbinにパスにadlintizeとadlintize.batがいるのが判るが、これらはplace holderで、以下のようなことをして実体を別の所に置いている。


けっきょくlibの下、インストールされたバージョンのgemのbinフォルダのadlintizeを見ればいいことになる。


丁寧なコマンドライン処理の後、環境毎に用意された元ファイル群をERbに通して、ビルド環境の設定ファイルとして出力して終了。

やっぱりadlint本体からが本番らしい。

2012年3月6日火曜日

AdLint

間隔空きすぎ。いくらなんでもLazyにすぎるだろうと。


というわけで、AdLintを軽く試してみる。
このあたりを外部でやってくれるなら、中途でほっぽってあったアレの続きをやってみるかなぁ……