Setting bridge up for sharing: allowing native modules to register after init

Reviewed By: javache

Differential Revision: D4945784

fbshipit-source-id: 80e7236e9ccd5d5c9a7fba7c96b98fc38b43a2fc
This commit is contained in:
Kathy Gray
2017-06-21 12:08:45 -07:00
committed by Facebook Github Bot
parent 1ae54b5108
commit 5c5410459e
13 changed files with 217 additions and 67 deletions
+27 -5
View File
@@ -30,15 +30,36 @@ std::string normalizeName(std::string name) {
ModuleRegistry::ModuleRegistry(std::vector<std::unique_ptr<NativeModule>> modules)
: modules_(std::move(modules)) {}
void ModuleRegistry::registerModules(std::vector<std::unique_ptr<NativeModule>> modules) {
// TODO: consider relaxing this restriction
CHECK(modulesByName_.empty()) << "Can only register additional modules before NativeModules have been accessed";
void ModuleRegistry::updateModuleNamesFromIndex(size_t index) {
for (; index < modules_.size(); index++ ) {
std::string name = normalizeName(modules_[index]->getName());
modulesByName_[name] = index;
}
}
if (modules_.empty()) {
void ModuleRegistry::registerModules(std::vector<std::unique_ptr<NativeModule>> modules) {
if (modules_.empty() && unknownModules_.empty()) {
modules_ = std::move(modules);
} else {
modules_.reserve(modules_.size() + modules.size());
size_t modulesSize = modules_.size();
size_t addModulesSize = modules.size();
bool addToNames = !modulesByName_.empty();
modules_.reserve(modulesSize + addModulesSize);
std::move(modules.begin(), modules.end(), std::back_inserter(modules_));
if (!unknownModules_.empty()) {
for (size_t index = modulesSize; index < modulesSize + addModulesSize; index++) {
std::string name = normalizeName(modules_[index]->getName());
auto it = unknownModules_.find(name);
if (it != unknownModules_.end()) {
throw std::runtime_error(
folly::to<std::string>("module ", name, " was required without being registered and is now being registered."));
} else if (addToNames) {
modulesByName_[name] = index;
}
}
} else if (addToNames) {
updateModuleNamesFromIndex(modulesSize);
}
}
}
@@ -62,6 +83,7 @@ folly::Optional<ModuleConfig> ModuleRegistry::getConfig(const std::string& name)
auto it = modulesByName_.find(name);
if (it == modulesByName_.end()) {
unknownModules_.insert(name);
return nullptr;
}