// 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);
    }
  }
}

}  // namespace internal
}  // namespace v8

#endif  // V8_LOG_INL_H_
