Skip to content

Instantly share code, notes, and snippets.

@ohnishiakira
Created April 5, 2011 19:27
Show Gist options
  • Save ohnishiakira/904328 to your computer and use it in GitHub Desktop.
Save ohnishiakira/904328 to your computer and use it in GitHub Desktop.
ソースコードリーディング(ruby-1.9.2-p0/lib/irb.rb)
*[ruby][irb]IRBソースコードリーディング
**対象
-ruby 1.9.2-p0
**ファイル構成
今回は以下のファイルを対象とします。
ruby-1.9.2-p0/lib
|-- irb.rb
`-- irb/
** irb.rb (352行)
L.1-10 コメント。
L.11 e2mmapを読み込んでいる。e2mmap = Exception2MessageMapperの略の模様。
L.13 irb/initを読み込んでいる。
L.14 irb/contextを読み込んでいる。
L.15 irb/extend-commandを読み込んでいる。
L.16 コメント。irb/workspaceを読み込んでいるがコメントアウトされている。
L.18 irb/ruby-lexを読み込んでいる。
L.19 irb/input-methodを読み込んでいる。
L.20 irb/localeを読み込んでいる。
L.22 STDOUT.sync = trueとある。よく分からない。
L.24-352 IRBモジュールの定義。
L.25 @RCS_ID。
L.27 Exceptionクラスを継承したAbortクラスの定義。
L.30 空のハッシュ@CONFの定義。
L.32-34 クラスメソッドIRB.confの定義。@CONFを返す。
L.37-43 クラスメソッドIRB.versionの定義。
L.38 if v = @CONF[:VERSION] then return v endとある。これだとL.40-42は絶対に実行されないのでは?
L.40 irb/versionを読み込んでいる。
L.41 インスタンス変数@RELEASE_VERSIONの末尾に.0があれば削除し、rvに代入している。
L.42 @CONF[:VERSION]にrv、@LAST_UPDATE_DATEをirb %s(%s)の形式でフォーマットし代入している。
L.45-47 クラスメソッドIRB.CurrentContextの定義。IRB.conf[:MAIN_CONTEXT]を返す。
L.50-76 クラスメソッドIRB.startの定義。引数にap_pathを取る。
L.51 ap_pathが真であれば、ap_pathから拡張子.rbを取り除いたものを$0に代入する。$0には普通プログラムを実行しているファイル名が入る。別名$PROGRAM_NAME。
L.53 ap_pathを引数に取り、IRB.setupをを呼び出している。
L.55-59 @CONF[:SCRIPT]が真であれば、第1の引数にnil、第2の引数に@CONF[:SCRIPT]を取りIrb.newを呼び出す。偽なら引数を取らずにIrb.newを呼び出す。
L.61 @CONF[:IRB_RC]が真であれば、irb.contextを引数に取り@CONF[:IRB_RC].callを呼び出す。@CONF[:IRB_RC]にはprocが入る?
L.62 @CONF[:MAIN_CONTEXT]にirb.contextを代入する。
L.64-66 プロセスにシグナルSIGINTが送られた場合、irb.signal_handleを呼び出す。
L.68-74 :IRB_EXITがキャッチされた場合、irb.eval_inputを呼び出す。その後、irb_at_exitを呼び出す。
L.75 "\n"を出力しているが、コメントアウトされている。
L.78-80 クラスメソッドIRB.irb_at_exitの定義。@CONF[:AT_EXIT]に登録されている処理を呼び出す?
L.82-84 クラスメソッドIRB.irb_exitの定義。第1の引数にirb、第2の引数にretを取る。:IRB_EXITシンボル例外とブロックretを投げている?
L.86-92 クラスメソッドIRB.irb_abortの定義。第1の引数にirb、第2の引数にexception(初期値はAbort)を取る。異常終了した時用?
L.97-328 Irbクラスの定義。irb interpreter main routineとある。
L.98-105 initializeメソッドの定義。workspace、input_method、output_methodの3つの引数を取る。どれも初期値はnil。
L.99 インスタンス変数@contextにContextクラスのインスタンスを代入する。Contextクラスのコンストラクタは引数としてself、workspace、input_method、output_methodを取る。
L.100 @context.main.extend ExtendCommandBundleとある。よく分からない?
L.101 @signal_statusに:IN_IRBを代入している。
L.103 @scannerにRubyLexクラスのインスタンスを代入している。
L.104 @scanner.exception_on_syntax_errorがfalseと設定されている。構文エラーの際に例外を出さないようにしている?
L.106 @contextのリーダーメソッドの定義
L.107 @scannerのアクセサメソッドの定義
L.109-205 eval_inputメソッドの定義。@scanner.set_prompt、@scanner.set_input(@context.io)、@scanner.each_top_level_statement、の3つのブロックが実行されている。
L.110-135 @scanner.set_promptの実行。
L.111 ブロック引数として、ltype、indent、continue、line_noを取っている。
L.112-120 この部分は一連の条件式となっている。ltypeが真であれば、fに@context.prompt_sを代入している。
L.114 continueが真であれば、fに@context.prompt_cを代入している。
L.116 indent > 0ならば、fに@context.prompt_nを代入している。
L.118 それ以外の場合、fに@context.prompt_iを代入している。
L.121 上記でfがセットされていなければ、""を設定している。
L.122 @context.prompting?が真ならば、@context.io.promptとpにprompt(f, ltype, indent, line_no)を設定している。偽なら""を設定。
L.127 @context.auto_indent_modeが真かつltypeが設定されていない場合、インデントの幅を調整しているものと思われる。
L.137-153 @scanner.set_inputの実行。
**途中まで進めて
-進め方としては、とりあえず一行ずつ順に読み、可能な限りコメントを残すようにした。
-メソッドの引数を見ただけでは、引数として何が来ることが想定されているのか分からない。
-知らないクラスが出てきた場合、そのクラスが何をやっているのか、そのクラスのメソッドがどのような処理を行っているのか分からない。
-知らないものがある状態で読み進めていってもあまり理解が進まない。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment