class V8::JSError

def backtrace(*modifiers)

def backtrace(*modifiers)
  trace_framework = modifiers.include?(:framework)
  trace_ruby = modifiers.length == 0 || modifiers.include?(:ruby)
  trace_javascript = modifiers.length == 0 || modifiers.include?(:javascript)
  mixed = []
  rbcontext = []
  jscontext = []
  @boundaries.each do |b|
    rbframes = b.rbframes.dup
    rbcontext.reverse_each do |frame|
      if frame == rbframes.last
        rbframes.pop
      else
        break
      end
    end if trace_ruby
    jsframes = b.jsframes.dup
    jscontext.reverse_each do |frame|
      if frame == jsframes.last
        jsframes.pop
      else
        break
      end
    end if trace_javascript
    rbcontext = b.rbframes
    jscontext = b.jsframes
    rbframes.reject! {|f| f =~ /lib\/v8\/.*\.rb/} unless trace_framework
    mixed.unshift(*rbframes) if trace_ruby
    mixed.unshift(*jsframes) if trace_javascript
  end
  return mixed
end

def in_javascript?

def in_javascript?
  !in_ruby?
end

def in_ruby?

def in_ruby?
  @value.kind_of?(Exception)
end

def initialize(try, to)

def initialize(try, to)
  @to = to
  begin
    super(initialize_unsafe(try))
  rescue Exception => e
    @boundaries = Boundary.new(:rbframes => e.backtrace)
    @value = e
    super("BUG! please report. JSError#initialize failed!: #{e.message}")
  end
end

def initialize_unsafe(try)

def initialize_unsafe(try)
  message = nil
  ex = @to.rb(try.Exception())
  @boundaries = [Boundary.new(:rbframes => caller(3), :jsframes => parse_js_frames(try))]
  if V8::Object === ex
    if msg = ex['message']
      message = msg
    else
      message = ex.to_s
    end
    if cause = ex.instance_variable_get(:@native).GetHiddenValue("TheRubyRacer::Cause")
      if !cause.IsEmpty()
        prev = cause.Value()
        if prev.kind_of?(JSError)
          @boundaries.concat prev.boundaries
          @value = prev.value
        else
          @value = prev
          @boundaries.concat [Boundary.new(:rbframes => prev.backtrace)]
        end
      else
        @value = ex
      end
    end
  else
    @value = ex
    message = ex.to_s
    @boundaries.first.jsframes << 'at [???].js'
  end
  return message
end

def parse_js_frames(try)

def parse_js_frames(try)
  raw = @to.rb(try.StackTrace())
  if raw && !raw.empty?
    raw.split("\n")[1..-1].tap do |frames|
      frames.each {|frame| frame.strip!.chomp!(",")}
    end
  else
    []
  end
end