class V8::Error

def bilingual_backtrace(trace_ruby = true, trace_javascript = true)

def bilingual_backtrace(trace_ruby = true, trace_javascript = true)
  backtrace = causes.reduce(:backtrace => [], :ruby => -1, :javascript => -1) { |accumulator, cause|
    accumulator.tap do
      if trace_ruby
        backtrace_selector = cause.respond_to?(:standard_error_backtrace) ? :standard_error_backtrace : :backtrace
        ruby_frames = cause.send(backtrace_selector)[0..accumulator[:ruby]]
        accumulator[:backtrace].unshift *ruby_frames
        accumulator[:ruby] -= ruby_frames.length
      end
      if trace_javascript && cause.respond_to?(:javascript_backtrace)
        javascript_frames = cause.javascript_backtrace.to_a[0..accumulator[:javascript]].map(&:to_s)
        accumulator[:backtrace].unshift *javascript_frames
        accumulator[:javascript] -= javascript_frames.length
      end
    end
  }[:backtrace]
end