blob: d211ab36c5b09b3455b4b004e21b043cd3aa6793 [file] [log] [blame]
// Copyright 2015 The Fuchsia 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 "tonic/dart_class_library.h"
#include "tonic/common/macros.h"
#include "tonic/dart_wrapper_info.h"
namespace tonic {
DartClassLibrary::DartClassLibrary() {}
DartClassLibrary::~DartClassLibrary() {
// Note that we don't need to delete these persistent handles because this
// object lives as long as the isolate. The handles will get deleted when the
// isolate dies.
}
Dart_PersistentHandle DartClassLibrary::GetClass(const DartWrapperInfo& info) {
const auto& result = info_cache_.insert(std::make_pair(&info, nullptr));
if (!result.second) {
// Already present, return value.
return result.first->second;
}
return GetAndCacheClass(info.library_name, info.interface_name,
&result.first->second);
}
Dart_PersistentHandle DartClassLibrary::GetClass(
const std::string& library_name,
const std::string& interface_name) {
auto key = std::make_pair(library_name, interface_name);
const auto& result = name_cache_.insert(std::make_pair(key, nullptr));
if (!result.second) {
// Already present, return value.
return result.first->second;
}
return GetAndCacheClass(library_name.c_str(), interface_name.c_str(),
&result.first->second);
}
Dart_PersistentHandle DartClassLibrary::GetAndCacheClass(
const char* library_name,
const char* interface_name,
Dart_PersistentHandle* cache_slot) {
auto it = providers_.find(library_name);
TONIC_DCHECK(it != providers_.end());
Dart_Handle class_handle = it->second->GetClassByName(interface_name);
*cache_slot = Dart_NewPersistentHandle(class_handle);
return *cache_slot;
}
} // namespace tonic