// Copyright 2006-2009 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef V8_LOG_INL_H_
#define V8_LOG_INL_H_

#include "src/log.h"
#include "src/isolate.h"
#include "src/objects-inl.h"
#include "src/tracing/trace-event.h"

namespace v8 {
namespace internal {

CodeEventListener::LogEventsAndTags Logger::ToNativeByScript(
    CodeEventListener::LogEventsAndTags tag, Script script) {
  if (script->type() != Script::TYPE_NATIVE) return tag;
  switch (tag) {
    case CodeEventListener::FUNCTION_TAG:
      return CodeEventListener::NATIVE_FUNCTION_TAG;
    case CodeEventListener::LAZY_COMPILE_TAG:
      return CodeEventListener::NATIVE_LAZY_COMPILE_TAG;
    case CodeEventListener::SCRIPT_TAG:
      return CodeEventListener::NATIVE_SCRIPT_TAG;
    default:
      return tag;
  }
}

void Logger::CallEventLogger(Isolate* isolate, const char* name, StartEnd se,
                             bool expose_to_api) {
  if (isolate->event_logger()) {
    if (isolate->event_logger() == DefaultEventLoggerSentinel) {
      LOG(isolate, TimerEvent(se, name));
    } else if (expose_to_api) {
      isolate->event_logger()(name, se);
    }
  }
}

template <class TimerEvent>
void TimerEventScope<TimerEvent>::LogTimerEvent(Logger::StartEnd se) {
  Logger::CallEventLogger(isolate_, TimerEvent::name(), se,
                          TimerEvent::expose_to_api());
}

}  // namespace internal
}  // namespace v8

#endif  // V8_LOG_INL_H_
