ヽ(´・肉・`)ノログ

How do we fighting without fighting?

xmpfilterを読む(4)

Xmpfilter#prepare_line の続き,multi_line ではない場合を追っている.

Xmpfilter#prepare_line(expr, idx, multi_line=false)

xmpfilter.rb#L180-L181

pp = ''
result = "#{v}.inspect"
VAR = "_xmp_#{Time.new.to_i}_#{Process.pid}_#{rand(1000000)}"
v = "#{VAR}"

なので

result = "#{v}.inspect"

result = "_xmp_1374454986_5139_492504.inspect"

というような文字列になるみたい.

xmpfilter.rb#L183-L200

重そうなのが出てきてしまった. 冷静にみていこう.

oneline_ize(<<-EOF).chomp
#{pp}
#{v} = (#{expr})
$stderr.puts("#{MARKER}[#{idx}] => " + #{v}.class.to_s + " " + #{result}) || begin
  $stderr.puts local_variables
  local_variables.each{|#{blocal}|
    #{blocal2} = eval(#{blocal})
    if #{v} == #{blocal2} && #{blocal} != %{expr}.strip
      $stderr.puts("#{MARKER}[#{idx}] ==> " + #{blocal})
    elsif [#{blocal2}] == #{v}
      $stderr.puts("#{MARKER}[#{idx}] ==> [" + #{blocal} + "]")
  end
  }
  nil
  rescue Exception
  nil
end || #{v}
EOF

online_ize は xmpfilter.rb#L364-L366 にある.以下のように文字列の改行を’;’に置換して,1行にまとめる処理をしている.名前通り. 最後の chomp は online_ize でついた最後の改行を削除している. つまりこれらは処理には直接関係ない.

def oneline_ize(code)
  "((" + code.gsub(/\r?\n|\r/, ';') + "));#{@postfix}\n"
end

残りは明日以降に追っていこう.