mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
eb2a561ecb
Summary: ## Motivation This rename will fix the following CircleCI build failures: - [test_ios_unit_frameworks](https://circleci.com/gh/facebook/react-native/150473?utm_campaign=vcs-integration-link&utm_medium=referral&utm_source=github-build-link) - [test_ios_detox_frameworks](https://circleci.com/gh/facebook/react-native/150474?utm_campaign=vcs-integration-link&utm_medium=referral&utm_source=github-build-link) ## Investigation We have 4 podspec targets that map to the same header namespace (i.e: `header_dir`) `ReactCommon`: - **New:** `React-perflogger`: Directory is `ReactCommon/preflogger`, and contains `NativeModulePerfLogger.{h,cpp}`. - `React-runtimeexecutor`: Directory is `ReactCommon/runtimeexecutor`, and contains only `RuntimeExecutor.h` - `React-callinvoker`: Directory is `ReactCommon/callinvoker`, and contains only `CallInvoker.h` - `ReactCommon/turbomodule/core`: Directory is `ReactCommon/turbomodule`, and contains C++ files, as well has header files. **The problem:** We couldn't import headers from `React-perflogger` in `ReactCommon/turbomodule/core` files. **The cause:** I'm not entirely sure why, but I was able to discern the following two rules by playing around with the podspecs: 1. If your podspec target has a cpp file, it'll generate a framework when `USE_FRAMEWORKS=1`. 2. Two different frameworks cannot map to the same `module_name` or `header_dir`. (Why? No clue. But something breaks silently when this is the case). So, this is what happened when I landed `React-perflogger` (D21443610): 1. The TurboModules code generates the `ReactCommon` framework that uses the `ReactCommon` header namespace. 2. `React-runtimeexecutor` and `React-callinvoker` also used the `ReactCommon` header namespace. However, neither generate a framework because of Rule 1. 3. When I comitted `React-perflogger`, I introduced a second framework that competed with the `ReactCommon` framework (i.e: TurboModules code) for the `ReactCommon` header namespace. Rule 2 violation. ## Thoughts on renaming - `<perflogger/NativeModulePerfLogger.h>` is too generic, and the `perflogger` namepsace is used internally within FB. - `<react/perflogger/NativeModulePerfLogger.h>` matches our fabric header format, but I'm pretty sure that slashes aren't allowed in `header_dir`: I tested this and it didn't work. IIRC, only alphanumeric and underscore are valid characters for `header_dir` or `module_name`. So, I opted to just use `reactperflogger`. Changelog: [Internal] Reviewed By: fkgozali Differential Revision: D21598852 fbshipit-source-id: 60da5d0f7758eaf13907a080b7d8756688f40723
108 lines
2.8 KiB
C++
108 lines
2.8 KiB
C++
/*
|
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*/
|
|
|
|
#include "jsireact/JSINativeModules.h"
|
|
#include <reactperflogger/NativeModulePerfLogger.h>
|
|
|
|
#include <glog/logging.h>
|
|
|
|
#include <cxxreact/ReactMarker.h>
|
|
|
|
#include <jsi/JSIDynamic.h>
|
|
|
|
#include <string>
|
|
|
|
using namespace facebook::jsi;
|
|
|
|
namespace facebook {
|
|
namespace react {
|
|
|
|
JSINativeModules::JSINativeModules(
|
|
std::shared_ptr<ModuleRegistry> moduleRegistry)
|
|
: m_moduleRegistry(std::move(moduleRegistry)) {}
|
|
|
|
Value JSINativeModules::getModule(Runtime &rt, const PropNameID &name) {
|
|
if (!m_moduleRegistry) {
|
|
return nullptr;
|
|
}
|
|
|
|
std::string moduleName = name.utf8(rt);
|
|
|
|
NativeModulePerfLogger::getInstance().moduleJSRequireBeginningStart(
|
|
moduleName.c_str());
|
|
|
|
const auto it = m_objects.find(moduleName);
|
|
if (it != m_objects.end()) {
|
|
NativeModulePerfLogger::getInstance().moduleJSRequireBeginningCacheHit(
|
|
moduleName.c_str());
|
|
NativeModulePerfLogger::getInstance().moduleJSRequireBeginningEnd(
|
|
moduleName.c_str());
|
|
return Value(rt, it->second);
|
|
}
|
|
|
|
auto module = createModule(rt, moduleName);
|
|
if (!module.hasValue()) {
|
|
NativeModulePerfLogger::getInstance().moduleJSRequireEndingFail(
|
|
moduleName.c_str());
|
|
// Allow lookup to continue in the objects own properties, which allows for
|
|
// overrides of NativeModules
|
|
return nullptr;
|
|
}
|
|
|
|
auto result =
|
|
m_objects.emplace(std::move(moduleName), std::move(*module)).first;
|
|
|
|
Value ret = Value(rt, result->second);
|
|
NativeModulePerfLogger::getInstance().moduleJSRequireEndingEnd(
|
|
moduleName.c_str());
|
|
return ret;
|
|
}
|
|
|
|
void JSINativeModules::reset() {
|
|
m_genNativeModuleJS = folly::none;
|
|
m_objects.clear();
|
|
}
|
|
|
|
folly::Optional<Object> JSINativeModules::createModule(
|
|
Runtime &rt,
|
|
const std::string &name) {
|
|
bool hasLogger(ReactMarker::logTaggedMarker);
|
|
if (hasLogger) {
|
|
ReactMarker::logTaggedMarker(
|
|
ReactMarker::NATIVE_MODULE_SETUP_START, name.c_str());
|
|
}
|
|
|
|
if (!m_genNativeModuleJS) {
|
|
m_genNativeModuleJS =
|
|
rt.global().getPropertyAsFunction(rt, "__fbGenNativeModule");
|
|
}
|
|
|
|
auto result = m_moduleRegistry->getConfig(name);
|
|
if (!result.hasValue()) {
|
|
return folly::none;
|
|
}
|
|
|
|
Value moduleInfo = m_genNativeModuleJS->call(
|
|
rt,
|
|
valueFromDynamic(rt, result->config),
|
|
static_cast<double>(result->index));
|
|
CHECK(!moduleInfo.isNull()) << "Module returned from genNativeModule is null";
|
|
|
|
folly::Optional<Object> module(
|
|
moduleInfo.asObject(rt).getPropertyAsObject(rt, "module"));
|
|
|
|
if (hasLogger) {
|
|
ReactMarker::logTaggedMarker(
|
|
ReactMarker::NATIVE_MODULE_SETUP_STOP, name.c_str());
|
|
}
|
|
|
|
return module;
|
|
}
|
|
|
|
} // namespace react
|
|
} // namespace facebook
|