// Copyright 2015 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 "sky/engine/tonic/dart_builtin.h"

#include <stdlib.h>
#include <string.h>

#include "base/logging.h"
#include "sky/engine/tonic/dart_converter.h"

namespace blink {

DartBuiltin::DartBuiltin(const Natives* natives, size_t count)
    : natives_(natives), count_(count) {
}

DartBuiltin::~DartBuiltin() {
}

Dart_NativeFunction DartBuiltin::Resolver(Dart_Handle name,
                                          int argument_count,
                                          bool* auto_setup_scope) const {
  const char* function_name = nullptr;
  Dart_Handle result = Dart_StringToCString(name, &function_name);
  DART_CHECK_VALID(result);
  DCHECK(function_name != nullptr);
  DCHECK(auto_setup_scope != nullptr);
  *auto_setup_scope = true;
  for (size_t i = 0; i < count_; ++i) {
    const Natives& entry = natives_[i];
    if (!strcmp(function_name, entry.name) &&
        (entry.argument_count == argument_count)) {
      return entry.function;
    }
  }
  return nullptr;
}

const uint8_t* DartBuiltin::Symbolizer(Dart_NativeFunction native_function) const {
  for (size_t i = 0; i < count_; ++i) {
    const Natives& entry = natives_[i];
    if (entry.function == native_function)
      return reinterpret_cast<const uint8_t*>(entry.name);
  }
  return nullptr;
}

Dart_Handle DartBuiltin::LookupLibrary(const char* name) {
    Dart_Handle library = Dart_LookupLibrary(ToDart(name));
    DCHECK(!Dart_IsError(library));
    return library;
}

}  // namespace blink
