Momota.pw別館

Yuki_noeの進捗状況

メソッドを呼び出したあとにNoMethodErrorを返してあたかも自分が定義されていないかのように振る舞えるメソッドを作りました

class Object
  def raise_n_m_error er
    ee = caller[0][/`([^']*)'/, 1]
    ex = NoMethodError.new begin
      self.__send__(?#)
    rescue
      $!.message.sub(?#, ee)
    end
    ex.set_backtrace(er)
    raise ex
  end
end

def test
  raise_n_m_error caller
end

test #=> test.rb:18:in `<main>': undefined method `test' for main:Object (NoMethodError)

これをメソッド内で呼び出すと、絶対に呼ばれないであろうメソッド#が呼ばれます。

で、その後そのメソッド名の置換をし、callerでバックトレースして返します。

これでエラー内容を偽装し、エラー発生位置を偽装することができます

もちろん、define_method#が定義されると呼ばれてしまってなんか変なことになるのでそこら辺はまあ

以上っ!