その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月19日月曜日
2012年3月16日金曜日
AdLintを読む その3
ちょっと開いたけど、続けてSingleModuleAnalyzer#executeを読んでいく。
executeは他のSingleModuleAnalyzerクラスのメソッド同様、analyzer.rbにある。
まずLanguage#ofを呼んで、言語を設定している。ここで言っているのは日本語とか英語とかのことではなく、CとC++の切り替えだ。Languageクラスはlang.rb内にあり、ofは現状ハードコードでCを指定している。まぁC++のパースとか大変だもんな……
実際に返しているのは以下のようなもの。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class C | |
include AdLint::C::ScannerConstants | |
extend AdLint::C::Scanner | |
class << self | |
def single_module_phases | |
[ | |
AdLint::Cpp::PreparePhase, | |
# Snip... | |
].freeze | |
end | |
def check_phases | |
[ | |
AdLint::Cpp::PreparePhase, | |
# Snip... | |
].freeze | |
end | |
end | |
end |
続けてProgressMonitorのインスタンスを用意しReport#newにブロックを渡して内部で処理をやっている。PhaseContextのインスタンスを作り、ソースのパスとシンボルテーブルを用意してから、Langから取得したモジュール群を、次のようなコードで順にexecuteしていっている。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
begin | |
lang.single_module_phases.each do |phase_class| | |
phase_class.new(context).execute | |
end | |
ensure | |
# snip... | |
end |
なかなか実際の中身に入れんなー。
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を追いかければいいということになる。
入力ファイルごとに出力のためのフォルダを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のモジュール関数群を順に呼んで処理を行なっている。具体的には以下の順。
AdLint.setup正直、最初のやつ以外は関数名だけでは何をしているやらさっぱり。
AdLint.sma
AdLint.sma_met_fpath
AdLint.cma
2012年3月7日水曜日
AdLintを読む その0
せっかくRuby製だしソースも公開されているし、読んでみようかと。
実行順に従って。まずはadlintizeから
コマンドラインから
けっきょくlibの下、インストールされたバージョンのgemのbinフォルダのadlintizeを見ればいいことになる。
丁寧なコマンドライン処理の後、環境毎に用意された元ファイル群をERbに通して、ビルド環境の設定ファイルとして出力して終了。
やっぱりadlint本体からが本番らしい。
実行順に従って。まずはadlintizeから
コマンドラインから
where adlintizeとすると、Rubyのbinにパスにadlintizeとadlintize.batがいるのが判るが、これらはplace holderで、以下のようなことをして実体を別の所に置いている。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require 'rubygems' | |
# ...snip... | |
gem 'adlint', version | |
load Gem.bin_path('adlint', 'adlintize', version) |
けっきょくlibの下、インストールされたバージョンのgemのbinフォルダのadlintizeを見ればいいことになる。
丁寧なコマンドライン処理の後、環境毎に用意された元ファイル群をERbに通して、ビルド環境の設定ファイルとして出力して終了。
やっぱりadlint本体からが本番らしい。
登録:
投稿 (Atom)