1
0
Fork 0
mirror of https://github.com/rubyjs/therubyrhino synced 2023-03-27 23:21:34 -04:00
therubyrhino/lib/rhino/error.rb
kares ce41ff6206 fix a regression introduced in db54adc223
+ make sure bundler does not require 'less'
2012-08-24 13:26:04 +02:00

95 lines
No EOL
2.6 KiB
Ruby

module Rhino
class JSError < StandardError
def initialize(native)
@native = native # NativeException wrapping a Java Throwable
if ( value = self.value(true) ) != nil
super value.is_a?(Exception) ? "#{value.class.name}: #{value.message}" : value
else
super cause ? cause.details : @native
end
end
def inspect
"#<#{self.class.name}: #{message}>"
end
# Returns the error message, in case of a native JavaScript value, will
# return that value converted to a String.
def message
super.to_s # since 1.9.x message is expected to allways be a string
end
# Returns the (nested) cause of this error if any, most likely a
# #Rhino::JS::JavaScriptException instance.
def cause
return @cause if defined?(@cause)
if @native.respond_to?(:cause) && @native.cause
@native.cause
else
@native.is_a?(JS::RhinoException) ? @native : nil
end
end
# Attempts to unwrap the (native) JavaScript/Java exception.
def unwrap
return @unwrap if defined?(@unwrap)
cause = self.cause
if cause && cause.is_a?(JS::WrappedException)
e = cause.getWrappedException
if e && e.is_a?(Java::OrgJrubyExceptions::RaiseException)
@unwrap = e.getException
else
@unwrap = e
end
else
@unwrap = nil
end
end
# Return the thown (native) JavaScript value.
def value(unwrap = false)
return @value if defined?(@value) && ! unwrap
@value = get_value unless defined?(@value)
return @value.unwrap if unwrap && @value.respond_to?(:unwrap)
@value
end
# The backtrace is constructed using #javascript_backtrace + the Ruby part.
def backtrace
if js_backtrace = javascript_backtrace
js_backtrace.push(*super)
else
super
end
end
# Returns the JavaScript back-trace part for this error (the script stack).
def javascript_backtrace(keep_elements = false)
if cause.is_a?(JS::RhinoException)
cause.getScriptStack.map do |element| # ScriptStackElement[]
keep_elements ? element : element.to_s
end
else
nil
end
end
Rhino::JS::RhinoException.useMozillaStackStyle(false)
private
def get_value
if ( cause = self.cause ) && cause.respond_to?(:value)
cause.value # e.g. JavaScriptException.getValue
elsif ( unwrap = self.unwrap ) && unwrap.respond_to?(:value)
unwrap.value
else
nil
end
end
end
end