lib/raven/backtrace.rb in sentry-raven-0.13.3 vs lib/raven/backtrace.rb in sentry-raven-0.14.0
- old
+ new
@@ -7,12 +7,15 @@
# Handles backtrace parsing line by line
class Line
# regexp (optionnally allowing leading X: for windows support)
- INPUT_FORMAT = %r{^((?:[a-zA-Z]:)?[^:]+|<.*>):(\d+)(?::in `([^']+)')?$}.freeze
+ RUBY_INPUT_FORMAT = %r{^((?:[a-zA-Z]:)?[^:]+|<.*>):(\d+)(?::in `([^']+)')?$}.freeze
+ # org.jruby.runtime.callsite.CachingCallSite.call(CachingCallSite.java:170)
+ JAVA_INPUT_FORMAT = %r{^(.+)\.([^\.]+)\(([^\:]+)\:(\d+)\)$}.freeze
+
APP_DIRS_PATTERN = /(bin|app|config|lib|test)/
# The file portion of the line (such as app/models/user.rb)
attr_reader :file
@@ -20,20 +23,31 @@
attr_reader :number
# The method of the line (such as index)
attr_reader :method
+ # The module name (JRuby)
+ attr_reader :module_name
+
# Parses a single line of a given backtrace
# @param [String] unparsed_line The raw line from +caller+ or some backtrace
# @return [Line] The parsed backtrace line
def self.parse(unparsed_line)
- _, file, number, method = unparsed_line.match(INPUT_FORMAT).to_a
- new(file, number, method)
+ ruby_match = unparsed_line.match(RUBY_INPUT_FORMAT)
+ if ruby_match
+ _, file, number, method = ruby_match.to_a
+ module_name = nil
+ else
+ java_match = unparsed_line.match(JAVA_INPUT_FORMAT)
+ _, module_name, method, file, number = java_match.to_a
+ end
+ new(file, number, method, module_name)
end
- def initialize(file, number, method)
+ def initialize(file, number, method, module_name)
self.file = file
+ self.module_name = module_name
self.number = number.to_i
self.method = method
end
def in_app
@@ -64,10 +78,10 @@
"<Line:#{self}>"
end
private
- attr_writer :file, :number, :method
+ attr_writer :file, :number, :method, :module_name
end
# holder for an Array of Backtrace::Line instances
attr_reader :lines