// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "gin/try_catch.h"

#include <sstream>

#include "gin/converter.h"

namespace {

v8::Local<v8::String> GetSourceLine(v8::Isolate* isolate,
                                    v8::Local<v8::Message> message) {
  auto maybe = message->GetSourceLine(isolate->GetCurrentContext());
  v8::Local<v8::String> source_line;
  return maybe.ToLocal(&source_line) ? source_line : v8::String::Empty(isolate);
}

}  // namespace

namespace gin {

TryCatch::TryCatch(v8::Isolate* isolate)
    : isolate_(isolate), try_catch_(isolate) {
}

TryCatch::~TryCatch() = default;

bool TryCatch::HasCaught() {
  return try_catch_.HasCaught();
}

std::string TryCatch::GetStackTrace() {
  if (!HasCaught()) {
    return "";
  }

  std::stringstream ss;
  v8::Local<v8::Message> message = try_catch_.Message();
  ss << V8ToString(message->Get()) << std::endl
     << V8ToString(GetSourceLine(isolate_, message)) << std::endl;

  v8::Local<v8::StackTrace> trace = message->GetStackTrace();
  if (trace.IsEmpty())
    return ss.str();

  int len = trace->GetFrameCount();
  for (int i = 0; i < len; ++i) {
    v8::Local<v8::StackFrame> frame = trace->GetFrame(i);
    ss << V8ToString(frame->GetScriptName()) << ":"
       << frame->GetLineNumber() << ":"
       << frame->GetColumn() << ": "
       << V8ToString(frame->GetFunctionName())
       << std::endl;
  }
  return ss.str();
}

}  // namespace gin
