errors/backtrace/native_frames_no_parens.rb

tests/_examples/errors/backtrace/native_frames_no_parens.rb in the metorex repository.

# A backtrace lists the native methods running between the raise and the
# rescue, inside blocks run against another receiver, inside threads and
# inside a Ractor.
def entries_of(raised)
  raised.backtrace.map { |entry| entry[entry.index(File.basename __FILE__)..] }
end

class Plain
  def converts = Integer "x"
end

def calls_missing = nil.no_such_method

begin
  Plain.new.converts
rescue ArgumentError => raised
  p entries_of raised
end

begin
  Object.new.instance_exec { Integer "x" }
rescue ArgumentError => raised
  p entries_of raised
end

begin
  Plain.new.instance_eval { Integer "x" }
rescue ArgumentError => raised
  p entries_of raised
end

begin
  Plain.class_eval { Integer "x" }
rescue ArgumentError => raised
  p entries_of raised
end

[1].each do
  Plain.class_exec 2 do |number| Integer "x" end
rescue ArgumentError => raised
  p entries_of raised
end

[1].each do
  [2].each { calls_missing }
rescue NoMethodError => raised
  p entries_of raised
end

begin
  [1].map { |number| number / 0 }
rescue ZeroDivisionError => raised
  p entries_of raised
end

thread = Thread.new { Object.new.instance_exec { Integer "x" } }
thread.report_on_exception = false
begin
  thread.join
rescue ArgumentError => raised
  p entries_of raised
end

def returns_from_class_eval
  Plain.class_eval { return 5 }
  6
end
p returns_from_class_eval

Warning[:experimental] = false
ractor = Ractor.new { Integer "x" }
begin
  ractor.value
rescue Ractor::RemoteError => raised
  p entries_of raised.cause
end

Output:

["native_frames_no_parens.rb:9:in 'Kernel#Integer'", "native_frames_no_parens.rb:9:in 'Plain#converts'", "native_frames_no_parens.rb:15:in '<main>'"]
["native_frames_no_parens.rb:21:in 'Kernel#Integer'", "native_frames_no_parens.rb:21:in 'block in <main>'", "native_frames_no_parens.rb:21:in 'BasicObject#instance_exec'", "native_frames_no_parens.rb:21:in '<main>'"]
["native_frames_no_parens.rb:27:in 'Kernel#Integer'", "native_frames_no_parens.rb:27:in 'block in <main>'", "native_frames_no_parens.rb:27:in 'BasicObject#instance_eval'", "native_frames_no_parens.rb:27:in '<main>'"]
["native_frames_no_parens.rb:33:in 'Kernel#Integer'", "native_frames_no_parens.rb:33:in 'block in <main>'", "native_frames_no_parens.rb:33:in 'Module#class_eval'", "native_frames_no_parens.rb:33:in '<main>'"]
["native_frames_no_parens.rb:39:in 'Kernel#Integer'", "native_frames_no_parens.rb:39:in 'block (2 levels) in <main>'", "native_frames_no_parens.rb:39:in 'Module#class_exec'", "native_frames_no_parens.rb:39:in 'block in <main>'", "native_frames_no_parens.rb:38:in 'Array#each'", "native_frames_no_parens.rb:38:in '<main>'"]
["native_frames_no_parens.rb:12:in 'Object#calls_missing'", "native_frames_no_parens.rb:45:in 'block (2 levels) in <main>'", "native_frames_no_parens.rb:45:in 'Array#each'", "native_frames_no_parens.rb:45:in 'block in <main>'", "native_frames_no_parens.rb:44:in 'Array#each'", "native_frames_no_parens.rb:44:in '<main>'"]
["native_frames_no_parens.rb:51:in 'Integer#/'", "native_frames_no_parens.rb:51:in 'block in <main>'", "native_frames_no_parens.rb:51:in 'Array#map'", "native_frames_no_parens.rb:51:in '<main>'"]
["native_frames_no_parens.rb:56:in 'Kernel#Integer'", "native_frames_no_parens.rb:56:in 'block (2 levels) in <main>'", "native_frames_no_parens.rb:56:in 'BasicObject#instance_exec'", "native_frames_no_parens.rb:56:in 'block in <main>'"]
5
["native_frames_no_parens.rb:71:in 'Kernel#Integer'", "native_frames_no_parens.rb:71:in 'block in <main>'"]