From 6bf6cebcf09d4a4d70f185c5a8d99dff8385ea1e Mon Sep 17 00:00:00 2001 From: Pieter De Baets Date: Tue, 4 Mar 2025 10:07:09 -0800 Subject: [PATCH] Remove usage of folly::to (#49786) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/49786 Most of these call-sites are only used for exceptional scenarios, so we can just rely on std::to_string and do string concatenation. For a few others that may be more perf-sensitive, I switched over to `snprintf`. Changelog: [Internal] Reviewed By: sammy-SC Differential Revision: D70402439 fbshipit-source-id: 3b90ebb13a7bf1c6cf30722ef636e5e8498a5b26 --- .../src/main/jni/react/jni/JSLoader.cpp | 8 ++- .../main/jni/react/jni/JavaModuleWrapper.cpp | 25 ++++----- .../jni/react/jni/JniJSModulesUnbundle.cpp | 1 + .../src/main/jni/react/jni/MethodInvoker.cpp | 11 ++-- .../ReactCommon/cxxreact/CxxNativeModule.cpp | 54 ++++++++----------- .../ReactCommon/cxxreact/JSExecutor.cpp | 7 ++- .../cxxreact/JSIndexedRAMBundle.cpp | 22 ++++---- .../ReactCommon/cxxreact/JSModulesUnbundle.h | 6 +-- .../cxxreact/JsArgumentHelpers-inl.h | 49 +++++++++-------- .../ReactCommon/cxxreact/JsArgumentHelpers.h | 3 +- .../ReactCommon/cxxreact/MethodCall.cpp | 34 ++++++------ .../ReactCommon/cxxreact/ModuleRegistry.cpp | 27 +++++----- .../cxxreact/RAMBundleRegistry.cpp | 3 +- .../cxxreact/tests/jsarg_helpers.cpp | 4 +- .../jsiexecutor/jsireact/JSIExecutor.cpp | 15 +++--- .../jsiexecutor/jsireact/JSIExecutor.h | 3 +- .../tests/InspectorPackagerConnectionTest.cpp | 3 +- .../tracing/PerformanceTracer.cpp | 5 +- .../core/ReactCommon/TurboCxxModule.cpp | 10 ++-- .../renderer/attributedstring/conversions.h | 7 ++- .../react/renderer/core/ShadowNode.cpp | 6 +-- .../react/renderer/core/graphicsConversions.h | 42 +++++++++------ .../renderer/debug/DebugStringConvertible.cpp | 43 +++++++++------ .../renderer/debug/DebugStringConvertible.h | 19 +++++-- .../react/runtime/ReactInstance.cpp | 2 +- 25 files changed, 215 insertions(+), 194 deletions(-) diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/jni/JSLoader.cpp b/packages/react-native/ReactAndroid/src/main/jni/react/jni/JSLoader.cpp index 03921b543c1..3ba56c93629 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/jni/JSLoader.cpp +++ b/packages/react-native/ReactAndroid/src/main/jni/react/jni/JSLoader.cpp @@ -11,7 +11,6 @@ #include #include #include -#include #ifdef WITH_FBSYSTRACE #include @@ -87,11 +86,10 @@ loadScriptFromAssets(AAssetManager* manager, const std::string& assetName) { } } - throw std::runtime_error(folly::to( + throw std::runtime_error( "Unable to load script. Make sure you're " - "either running Metro (run 'npx react-native start') or that your bundle '", - assetName, - "' is packaged correctly for release.")); + "either running Metro (run 'npx react-native start') or that your bundle '" + + assetName + "' is packaged correctly for release."); } } // namespace facebook::react diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/jni/JavaModuleWrapper.cpp b/packages/react-native/ReactAndroid/src/main/jni/react/jni/JavaModuleWrapper.cpp index 1f4b7c1d495..4be8efe6e81 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/jni/JavaModuleWrapper.cpp +++ b/packages/react-native/ReactAndroid/src/main/jni/react/jni/JavaModuleWrapper.cpp @@ -15,7 +15,6 @@ #include #include #include -#include #ifdef WITH_FBSYSTRACE #include @@ -51,19 +50,16 @@ std::string JavaNativeModule::getName() { std::string JavaNativeModule::getSyncMethodName(unsigned int reactMethodId) { if (reactMethodId >= syncMethods_.size()) { - throw std::invalid_argument(folly::to( - "methodId ", - reactMethodId, - " out of range [0..", - syncMethods_.size(), - "]")); + throw std::invalid_argument( + "methodId " + std::to_string(reactMethodId) + " out of range [0.." + + std::to_string(syncMethods_.size()) + "]"); } auto& methodInvoker = syncMethods_[reactMethodId]; - if (!methodInvoker.has_value()) { - throw std::invalid_argument(folly::to( - "methodId ", reactMethodId, " is not a recognized sync method")); + throw std::invalid_argument( + "methodId " + std::to_string(reactMethodId) + + " is not a recognized sync method"); } return methodInvoker->getMethodName(); @@ -137,12 +133,9 @@ MethodCallResult JavaNativeModule::callSerializableNativeHook( folly::dynamic&& params) { // TODO: evaluate whether calling through invoke is potentially faster if (reactMethodId >= syncMethods_.size()) { - throw std::invalid_argument(folly::to( - "methodId ", - reactMethodId, - " out of range [0..", - syncMethods_.size(), - "]")); + throw std::invalid_argument( + "methodId " + std::to_string(reactMethodId) + " out of range [0.." + + std::to_string(syncMethods_.size()) + "]"); } auto& method = syncMethods_[reactMethodId]; diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/jni/JniJSModulesUnbundle.cpp b/packages/react-native/ReactAndroid/src/main/jni/react/jni/JniJSModulesUnbundle.cpp index 743ba5b3ab6..35952ac647e 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/jni/JniJSModulesUnbundle.cpp +++ b/packages/react-native/ReactAndroid/src/main/jni/react/jni/JniJSModulesUnbundle.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/jni/MethodInvoker.cpp b/packages/react-native/ReactAndroid/src/main/jni/react/jni/MethodInvoker.cpp index 9284dc62772..195ff21ed2a 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/jni/MethodInvoker.cpp +++ b/packages/react-native/ReactAndroid/src/main/jni/react/jni/MethodInvoker.cpp @@ -65,9 +65,9 @@ jint extractInteger(const folly::dynamic& value) { double dbl = value.getDouble(); jint result = static_cast(dbl); if (dbl != result) { - throw std::invalid_argument(folly::to( - "Tried to convert jint argument, but got a non-integral double: ", - dbl)); + throw std::invalid_argument( + "Tried to convert jint argument, but got a non-integral double: " + + std::to_string(dbl)); } return result; } @@ -222,8 +222,9 @@ MethodCallResult MethodInvoker::invoke( #endif if (params.size() != jsArgCount_) { - throw std::invalid_argument(folly::to( - "expected ", jsArgCount_, " arguments, got ", params.size())); + throw std::invalid_argument( + "expected " + std::to_string(jsArgCount_) + " arguments, got " + + std::to_string(params.size())); } auto env = Environment::current(); diff --git a/packages/react-native/ReactCommon/cxxreact/CxxNativeModule.cpp b/packages/react-native/ReactCommon/cxxreact/CxxNativeModule.cpp index d536c474d77..f43873ae78a 100644 --- a/packages/react-native/ReactCommon/cxxreact/CxxNativeModule.cpp +++ b/packages/react-native/ReactCommon/cxxreact/CxxNativeModule.cpp @@ -68,12 +68,8 @@ void CxxNativeModule::emitWarnIfWarnOnUsage( const std::string& method_name, const std::string& module_name) { if (shouldWarnOnUse_) { - std::string message = folly::to( - "Calling ", - method_name, - " on Cxx NativeModule (name = \"", - module_name, - "\")."); + std::string message = "Calling " + method_name + + " on Cxx NativeModule (name = \"" + module_name + "\")."; react_native_log_warn(message.c_str()); } } @@ -84,12 +80,9 @@ std::string CxxNativeModule::getName() { std::string CxxNativeModule::getSyncMethodName(unsigned int reactMethodId) { if (reactMethodId >= methods_.size()) { - throw std::invalid_argument(folly::to( - "methodId ", - reactMethodId, - " out of range [0..", - methods_.size(), - "]")); + throw std::invalid_argument( + "methodId " + std::to_string(reactMethodId) + " out of range [0.." + + std::to_string(methods_.size()) + "]"); } return methods_[reactMethodId].name; } @@ -125,16 +118,14 @@ void CxxNativeModule::invoke( folly::dynamic&& params, int callId) { if (reactMethodId >= methods_.size()) { - throw std::invalid_argument(folly::to( - "methodId ", - reactMethodId, - " out of range [0..", - methods_.size(), - "]")); + throw std::invalid_argument( + "methodId " + std::to_string(reactMethodId) + " out of range [0.." + + std::to_string(methods_.size()) + "]"); } if (!params.isArray()) { - throw std::invalid_argument(folly::to( - "method parameters should be array, but are ", params.typeName())); + throw std::invalid_argument( + std::string("Method parameters should be array, but are ") + + params.typeName()); } CxxModule::Callback first; @@ -143,19 +134,17 @@ void CxxNativeModule::invoke( const auto& method = methods_[reactMethodId]; if (!method.func) { - throw std::runtime_error(folly::to( - "Method ", method.name, " is synchronous but invoked asynchronously")); + throw std::runtime_error( + "Method " + method.name + " is synchronous but invoked asynchronously"); } emitWarnIfWarnOnUsage(method.name, getName()); if (params.size() < method.callbacks) { - throw std::invalid_argument(folly::to( - "Expected ", - method.callbacks, - " callbacks, but only ", - params.size(), - " parameters provided")); + throw std::invalid_argument( + "Expected " + std::to_string(method.callbacks) + + " callbacks, but only " + std::to_string(params.size()) + + " parameters provided"); } if (method.callbacks == 1) { @@ -229,15 +218,16 @@ MethodCallResult CxxNativeModule::callSerializableNativeHook( unsigned int hookId, folly::dynamic&& args) { if (hookId >= methods_.size()) { - throw std::invalid_argument(folly::to( - "methodId ", hookId, " out of range [0..", methods_.size(), "]")); + throw std::invalid_argument( + "methodId " + std::to_string(hookId) + " out of range [0.." + + std::to_string(methods_.size()) + "]"); } const auto& method = methods_[hookId]; if (!method.syncFunc) { - throw std::runtime_error(folly::to( - "Method ", method.name, " is asynchronous but invoked synchronously")); + throw std::runtime_error( + "Method " + method.name + " is asynchronous but invoked synchronously"); } emitWarnIfWarnOnUsage(method.name, getName()); diff --git a/packages/react-native/ReactCommon/cxxreact/JSExecutor.cpp b/packages/react-native/ReactCommon/cxxreact/JSExecutor.cpp index 385bb95abe9..eeca4b3c929 100644 --- a/packages/react-native/ReactCommon/cxxreact/JSExecutor.cpp +++ b/packages/react-native/ReactCommon/cxxreact/JSExecutor.cpp @@ -9,10 +9,10 @@ #include "RAMBundleRegistry.h" -#include #include #include +#include #include namespace facebook::react { @@ -23,7 +23,10 @@ std::string JSExecutor::getSyntheticBundlePath( if (bundleId == RAMBundleRegistry::MAIN_BUNDLE_ID) { return bundlePath; } - return folly::to("seg-", bundleId, ".js"); + + std::array buffer{}; + std::snprintf(buffer.data(), buffer.size(), "seg-%u.js", bundleId); + return buffer.data(); } double JSExecutor::performanceNow() { diff --git a/packages/react-native/ReactCommon/cxxreact/JSIndexedRAMBundle.cpp b/packages/react-native/ReactCommon/cxxreact/JSIndexedRAMBundle.cpp index 1f646bb2451..c9066fc5d01 100644 --- a/packages/react-native/ReactCommon/cxxreact/JSIndexedRAMBundle.cpp +++ b/packages/react-native/ReactCommon/cxxreact/JSIndexedRAMBundle.cpp @@ -24,8 +24,9 @@ JSIndexedRAMBundle::buildFactory() { JSIndexedRAMBundle::JSIndexedRAMBundle(const char* sourcePath) { m_bundle = std::make_unique(sourcePath, std::ifstream::binary); if (!m_bundle) { - throw std::ios_base::failure(folly::to( - "Bundle ", sourcePath, "cannot be opened: ", m_bundle->rdstate())); + throw std::ios_base::failure( + std::string("Bundle ") + sourcePath + + "cannot be opened: " + std::to_string(m_bundle->rdstate())); } init(); } @@ -39,8 +40,9 @@ JSIndexedRAMBundle::JSIndexedRAMBundle( tmpStream->write(script->c_str(), script->size()); m_bundle = std::move(tmpStream); if (!m_bundle) { - throw std::ios_base::failure(folly::to( - "Bundle from string cannot be opened: ", m_bundle->rdstate())); + throw std::ios_base::failure( + "Bundle from string cannot be opened: " + + std::to_string(m_bundle->rdstate())); } init(); } @@ -73,7 +75,7 @@ void JSIndexedRAMBundle::init() { JSIndexedRAMBundle::Module JSIndexedRAMBundle::getModule( uint32_t moduleId) const { Module ret; - ret.name = folly::to(moduleId, ".js"); + ret.name = std::to_string(moduleId) + ".js"; ret.code = getModuleCode(moduleId); return ret; } @@ -92,7 +94,7 @@ std::string JSIndexedRAMBundle::getModuleCode(const uint32_t id) const { moduleData ? folly::Endian::little(moduleData->length) : 0; if (length == 0) { throw std::ios_base::failure( - folly::to("Error loading module", id, "from RAM Bundle")); + "Error loading module" + std::to_string(id) + "from RAM Bundle"); } std::string ret(length - 1, '\0'); @@ -109,8 +111,8 @@ void JSIndexedRAMBundle::readBundle(char* buffer, const std::streamsize bytes) if (m_bundle->rdstate() & std::ios::eofbit) { throw std::ios_base::failure("Unexpected end of RAM Bundle file"); } - throw std::ios_base::failure(folly::to( - "Error reading RAM Bundle: ", m_bundle->rdstate())); + throw std::ios_base::failure( + "Error reading RAM Bundle: " + std::to_string(m_bundle->rdstate())); } } @@ -119,8 +121,8 @@ void JSIndexedRAMBundle::readBundle( const std::streamsize bytes, const std::ifstream::pos_type position) const { if (!m_bundle->seekg(position)) { - throw std::ios_base::failure(folly::to( - "Error reading RAM Bundle: ", m_bundle->rdstate())); + throw std::ios_base::failure( + "Error reading RAM Bundle: " + std::to_string(m_bundle->rdstate())); } readBundle(buffer, bytes); } diff --git a/packages/react-native/ReactCommon/cxxreact/JSModulesUnbundle.h b/packages/react-native/ReactCommon/cxxreact/JSModulesUnbundle.h index 02affba2503..0d793706855 100644 --- a/packages/react-native/ReactCommon/cxxreact/JSModulesUnbundle.h +++ b/packages/react-native/ReactCommon/cxxreact/JSModulesUnbundle.h @@ -11,8 +11,6 @@ #include #include -#include - namespace facebook::react { class JSModulesUnbundle { @@ -27,9 +25,9 @@ class JSModulesUnbundle { class ModuleNotFound : public std::out_of_range { public: using std::out_of_range::out_of_range; - ModuleNotFound(uint32_t moduleId) + explicit ModuleNotFound(uint32_t moduleId) : std::out_of_range::out_of_range( - folly::to("Module not found: ", moduleId)) {} + "Module not found: " + std::to_string(moduleId)) {} }; struct Module { std::string name; diff --git a/packages/react-native/ReactCommon/cxxreact/JsArgumentHelpers-inl.h b/packages/react-native/ReactCommon/cxxreact/JsArgumentHelpers-inl.h index 2efb9943649..3814e3df320 100644 --- a/packages/react-native/ReactCommon/cxxreact/JsArgumentHelpers-inl.h +++ b/packages/react-native/ReactCommon/cxxreact/JsArgumentHelpers-inl.h @@ -6,6 +6,7 @@ */ #pragma once + #include namespace facebook { @@ -13,19 +14,32 @@ namespace xplat { namespace detail { +inline std::string toStringHelper() { + return ""; +} + +template +inline std::string toStringHelper(const T& value, const Rest&... rest) { + return std::to_string(value) + toStringHelper(rest...); +} + +template +inline std::string toStringHelper(const char* value, const Rest&... rest) { + return std::string(value) + toStringHelper(rest...); +} + template R jsArg1(const folly::dynamic& arg, M asFoo, const T&... desc) { try { return (arg.*asFoo)(); } catch (const folly::TypeError& ex) { - throw JsArgumentException(folly::to( - "Error converting javascript arg ", desc..., " to C++: ", ex.what())); + throw JsArgumentException( + "Error converting JavaScript arg " + toStringHelper(desc...) + + " to C++: " + ex.what()); } catch (const std::range_error& ex) { - throw JsArgumentException(folly::to( - "Could not convert argument ", - desc..., - " to required type: ", - ex.what())); + throw JsArgumentException( + "Could not convert argument " + toStringHelper(desc...) + + " to required type: " + ex.what()); } } @@ -54,13 +68,10 @@ typename detail::is_dynamic::type& jsArgAsDynamic(T&& args, size_t n) { return args[n]; } catch (const std::out_of_range& ex) { // Use 1-base counting for argument description. - throw JsArgumentException(folly::to( - "JavaScript provided ", - args.size(), - " arguments for C++ method which references at least ", - n + 1, - " arguments: ", - ex.what())); + throw JsArgumentException( + "JavaScript provided " + std::to_string(args.size()) + + " arguments for C++ method which references at least " + + std::to_string(n + 1) + " arguments: " + ex.what()); } } @@ -95,13 +106,9 @@ typename detail::is_dynamic::type& jsArgAsType( } // Use 1-base counting for argument description. - throw JsArgumentException(folly::to( - "Argument ", - n + 1, - " of type ", - ret.typeName(), - " is not required type ", - required)); + throw JsArgumentException( + "Argument " + std::to_string(n + 1) + " of type " + ret.typeName() + + " is not required type " + required); } } // end namespace detail diff --git a/packages/react-native/ReactCommon/cxxreact/JsArgumentHelpers.h b/packages/react-native/ReactCommon/cxxreact/JsArgumentHelpers.h index 14e357c030c..cd72e825073 100644 --- a/packages/react-native/ReactCommon/cxxreact/JsArgumentHelpers.h +++ b/packages/react-native/ReactCommon/cxxreact/JsArgumentHelpers.h @@ -10,7 +10,6 @@ #include #include -#include #include // When building a cross-platform module for React Native, arguments passed @@ -31,7 +30,7 @@ class JsArgumentException : public std::logic_error { // This extracts a single argument by calling the given method pointer on it. // If an exception is thrown, the additional arguments are passed to -// folly::to<> to be included in the exception string. This will be most +// std::to_string to be included in the exception string. This will be most // commonly used when extracting values from non-scalar argument. The second // overload accepts ref-qualified member functions. diff --git a/packages/react-native/ReactCommon/cxxreact/MethodCall.cpp b/packages/react-native/ReactCommon/cxxreact/MethodCall.cpp index bc354a6d6ea..6e7dd122236 100644 --- a/packages/react-native/ReactCommon/cxxreact/MethodCall.cpp +++ b/packages/react-native/ReactCommon/cxxreact/MethodCall.cpp @@ -25,13 +25,15 @@ std::vector parseMethodCalls(folly::dynamic&& jsonData) { } if (!jsonData.isArray()) { - throw std::invalid_argument(folly::to( - errorPrefix, "input isn't array but ", jsonData.typeName())); + throw std::invalid_argument( + std::string(errorPrefix) + " input isn't array but " + + jsonData.typeName()); } if (jsonData.size() < REQUEST_PARAMS + 1) { throw std::invalid_argument( - folly::to(errorPrefix, "size == ", jsonData.size())); + std::string(errorPrefix) + + "size == " + std::to_string(jsonData.size())); } auto& moduleIds = jsonData[REQUEST_MODULE_IDS]; @@ -40,24 +42,23 @@ std::vector parseMethodCalls(folly::dynamic&& jsonData) { int callId = -1; if (!moduleIds.isArray() || !methodIds.isArray() || !params.isArray()) { - throw std::invalid_argument(folly::to( - errorPrefix, - "not all fields are arrays.\n\n", - folly::toJson(jsonData))); + throw std::invalid_argument( + std::string(errorPrefix) + "not all fields are arrays.\n\n" + + folly::toJson(jsonData)); } if (moduleIds.size() != methodIds.size() || moduleIds.size() != params.size()) { - throw std::invalid_argument(folly::to( - errorPrefix, - "field sizes are different.\n\n", - folly::toJson(jsonData))); + throw std::invalid_argument( + std::string(errorPrefix) + "field sizes are different.\n\n" + + folly::toJson(jsonData)); } if (jsonData.size() > REQUEST_CALLID) { if (!jsonData[REQUEST_CALLID].isNumber()) { - throw std::invalid_argument(folly::to( - errorPrefix, "invalid callId", jsonData[REQUEST_CALLID].typeName())); + throw std::invalid_argument( + std::string(errorPrefix) + "invalid callId" + + jsonData[REQUEST_CALLID].typeName()); } callId = (int)jsonData[REQUEST_CALLID].asInt(); } @@ -65,10 +66,9 @@ std::vector parseMethodCalls(folly::dynamic&& jsonData) { std::vector methodCalls; for (size_t i = 0; i < moduleIds.size(); i++) { if (!params[i].isArray()) { - throw std::invalid_argument(folly::to( - errorPrefix, - "method arguments isn't array but ", - params[i].typeName())); + throw std::invalid_argument( + std::string(errorPrefix) + "method arguments isn't array but " + + params[i].typeName()); } methodCalls.emplace_back( diff --git a/packages/react-native/ReactCommon/cxxreact/ModuleRegistry.cpp b/packages/react-native/ReactCommon/cxxreact/ModuleRegistry.cpp index 4e6b4a4edc8..080e1992ca9 100644 --- a/packages/react-native/ReactCommon/cxxreact/ModuleRegistry.cpp +++ b/packages/react-native/ReactCommon/cxxreact/ModuleRegistry.cpp @@ -66,10 +66,9 @@ void ModuleRegistry::registerModules( std::string name = normalizeName(modules_[index]->getName()); auto it = unknownModules_.find(name); if (it != unknownModules_.end()) { - throw std::runtime_error(folly::to( - "module ", - name, - " was required without being registered and is now being registered.")); + throw std::runtime_error( + "module " + name + + " was required without being registered and is now being registered."); } else if (addToNames) { modulesByName_[name] = index; } @@ -193,8 +192,9 @@ std::optional ModuleRegistry::getConfig(const std::string& name) { std::string ModuleRegistry::getModuleName(unsigned int moduleId) { if (moduleId >= modules_.size()) { - throw std::runtime_error(folly::to( - "moduleId ", moduleId, " out of range [0..", modules_.size(), ")")); + throw std::runtime_error( + "moduleId " + std::to_string(moduleId) + " out of range [0.." + + std::to_string(modules_.size()) + ")"); } return modules_[moduleId]->getName(); @@ -204,8 +204,9 @@ std::string ModuleRegistry::getModuleSyncMethodName( unsigned int moduleId, unsigned int methodId) { if (moduleId >= modules_.size()) { - throw std::runtime_error(folly::to( - "moduleId ", moduleId, " out of range [0..", modules_.size(), ")")); + throw std::runtime_error( + "moduleId " + std::to_string(moduleId) + " out of range [0.." + + std::to_string(modules_.size()) + ")"); } return modules_[moduleId]->getSyncMethodName(methodId); @@ -217,8 +218,9 @@ void ModuleRegistry::callNativeMethod( folly::dynamic&& params, int callId) { if (moduleId >= modules_.size()) { - throw std::runtime_error(folly::to( - "moduleId ", moduleId, " out of range [0..", modules_.size(), ")")); + throw std::runtime_error( + "moduleId " + std::to_string(moduleId) + " out of range [0.." + + std::to_string(modules_.size()) + ")"); } modules_[moduleId]->invoke(methodId, std::move(params), callId); } @@ -228,8 +230,9 @@ MethodCallResult ModuleRegistry::callSerializableNativeHook( unsigned int methodId, folly::dynamic&& params) { if (moduleId >= modules_.size()) { - throw std::runtime_error(folly::to( - "moduleId ", moduleId, "out of range [0..", modules_.size(), ")")); + throw std::runtime_error( + "moduleId " + std::to_string(moduleId) + " out of range [0.." + + std::to_string(modules_.size()) + ")"); } return modules_[moduleId]->callSerializableNativeHook( methodId, std::move(params)); diff --git a/packages/react-native/ReactCommon/cxxreact/RAMBundleRegistry.cpp b/packages/react-native/ReactCommon/cxxreact/RAMBundleRegistry.cpp index 99447e1a0bd..c45be54c8cb 100644 --- a/packages/react-native/ReactCommon/cxxreact/RAMBundleRegistry.cpp +++ b/packages/react-native/ReactCommon/cxxreact/RAMBundleRegistry.cpp @@ -66,8 +66,9 @@ JSModulesUnbundle::Module RAMBundleRegistry::getModule( if (bundleId == MAIN_BUNDLE_ID) { return module; } + return { - folly::to("seg-", bundleId, '_', std::move(module.name)), + "seg-" + std::to_string(bundleId) + '_' + module.name, std::move(module.code), }; } diff --git a/packages/react-native/ReactCommon/cxxreact/tests/jsarg_helpers.cpp b/packages/react-native/ReactCommon/cxxreact/tests/jsarg_helpers.cpp index 26ff85177ba..ba64844f380 100644 --- a/packages/react-native/ReactCommon/cxxreact/tests/jsarg_helpers.cpp +++ b/packages/react-native/ReactCommon/cxxreact/tests/jsarg_helpers.cpp @@ -32,7 +32,7 @@ TEST(JsArgumentHelpersTest, args) { const std::string aString = "word"; const dynamic anArray = dynamic::array("a", "b", "c"); const dynamic anObject = dynamic::object("k1", "v1")("k2", "v2"); - const std::string aNumericString = folly::to(anInt); + const std::string aNumericString = std::to_string(anInt); folly::dynamic args = dynamic::array( aBool, anInt, aDouble, aString, anArray, anObject, aNumericString); @@ -104,7 +104,7 @@ TEST(JsArgumentHelpersTest, args) { "Argument 3 of type double is not required type Array"); EXPECT_JSAE( jsArgAsInt(args, 4), - "Error converting javascript arg 4 to C++: " + "Error converting JavaScript arg 4 to C++: " "TypeError: expected dynamic type 'int/double/bool/string', but had type 'array'"); // type predicate failure EXPECT_JSAE( diff --git a/packages/react-native/ReactCommon/jsiexecutor/jsireact/JSIExecutor.cpp b/packages/react-native/ReactCommon/jsiexecutor/jsireact/JSIExecutor.cpp index 70a361017a0..6b226006768 100644 --- a/packages/react-native/ReactCommon/jsiexecutor/jsireact/JSIExecutor.cpp +++ b/packages/react-native/ReactCommon/jsiexecutor/jsireact/JSIExecutor.cpp @@ -12,7 +12,6 @@ #include #include #include -#include #include #include #include @@ -195,7 +194,7 @@ void JSIExecutor::setBundleRegistry(std::unique_ptr r) { void JSIExecutor::registerBundle( uint32_t bundleId, const std::string& bundlePath) { - const auto tag = folly::to(bundleId); + auto tag = std::to_string(bundleId); ReactMarker::logTaggedMarker( ReactMarker::REGISTER_JS_SEGMENT_START, tag.c_str()); if (bundleRegistry_) { @@ -265,7 +264,7 @@ void JSIExecutor::invokeCallback( *runtime_, callbackId, valueFromDynamic(*runtime_, arguments)); } catch (...) { std::throw_with_nested(std::runtime_error( - folly::to("Error invoking callback ", callbackId))); + "Error invoking callback " + std::to_string(callbackId))); } callNativeModules(ret, true); @@ -436,8 +435,9 @@ Value JSIExecutor::nativeRequire(const Value* args, size_t count) { throw std::invalid_argument("Got wrong number of args"); } - uint32_t moduleId = folly::to(args[0].getNumber()); - uint32_t bundleId = count == 2 ? folly::to(args[1].getNumber()) : 0; + auto moduleId = static_cast(args[0].getNumber()); + uint32_t bundleId = + count == 2 ? static_cast(args[1].getNumber()) : 0; auto module = bundleRegistry_->getModule(bundleId, moduleId); runtime_->evaluateJavaScript( @@ -451,8 +451,7 @@ Value JSIExecutor::nativeCallSyncHook(const Value* args, size_t count) { } if (!args[2].isObject() || !args[2].asObject(*runtime_).isArray(*runtime_)) { - throw std::invalid_argument( - folly::to("method parameters should be array")); + throw std::invalid_argument("method parameters should be array"); } unsigned int moduleId = static_cast(args[0].getNumber()); @@ -541,7 +540,7 @@ void bindNativeLogger(Runtime& runtime, Logger logger) { } logger( args[0].asString(runtime).utf8(runtime), - folly::to(args[1].asNumber())); + static_cast(args[1].asNumber())); return Value::undefined(); })); } diff --git a/packages/react-native/ReactCommon/jsiexecutor/jsireact/JSIExecutor.h b/packages/react-native/ReactCommon/jsiexecutor/jsireact/JSIExecutor.h index f76b66482fd..9234e3a32e5 100644 --- a/packages/react-native/ReactCommon/jsiexecutor/jsireact/JSIExecutor.h +++ b/packages/react-native/ReactCommon/jsiexecutor/jsireact/JSIExecutor.h @@ -7,12 +7,11 @@ #pragma once -#include "JSINativeModules.h" - #include #include #include #include +#include #include #include #include diff --git a/packages/react-native/ReactCommon/jsinspector-modern/tests/InspectorPackagerConnectionTest.cpp b/packages/react-native/ReactCommon/jsinspector-modern/tests/InspectorPackagerConnectionTest.cpp index 22d940d8ac3..e0ed7fcdacb 100644 --- a/packages/react-native/ReactCommon/jsinspector-modern/tests/InspectorPackagerConnectionTest.cpp +++ b/packages/react-native/ReactCommon/jsinspector-modern/tests/InspectorPackagerConnectionTest.cpp @@ -25,8 +25,7 @@ using namespace ::testing; using namespace std::literals::chrono_literals; using namespace std::literals::string_literals; -using folly::dynamic, folly::parseJson, folly::toJson, folly::format, - folly::sformat; +using folly::dynamic, folly::toJson, folly::sformat; namespace facebook::react::jsinspector_modern { diff --git a/packages/react-native/ReactCommon/jsinspector-modern/tracing/PerformanceTracer.cpp b/packages/react-native/ReactCommon/jsinspector-modern/tracing/PerformanceTracer.cpp index 1768fd6f6a4..28aca9ec9aa 100644 --- a/packages/react-native/ReactCommon/jsinspector-modern/tracing/PerformanceTracer.cpp +++ b/packages/react-native/ReactCommon/jsinspector-modern/tracing/PerformanceTracer.cpp @@ -11,6 +11,7 @@ #include +#include #include namespace facebook::react::jsinspector_modern { @@ -304,7 +305,9 @@ folly::dynamic PerformanceTracer::serializeTraceEvent(TraceEvent event) const { folly::dynamic result = folly::dynamic::object; if (event.id.has_value()) { - result["id"] = folly::sformat("0x{:X}", event.id.value()); + std::array buffer{}; + snprintf(buffer.data(), buffer.size(), "0x%08x", event.id.value()); + result["id"] = buffer.data(); } result["name"] = event.name; result["cat"] = event.cat; diff --git a/packages/react-native/ReactCommon/react/nativemodule/core/ReactCommon/TurboCxxModule.cpp b/packages/react-native/ReactCommon/react/nativemodule/core/ReactCommon/TurboCxxModule.cpp index 34e9427f853..84d57bb1155 100644 --- a/packages/react-native/ReactCommon/react/nativemodule/core/ReactCommon/TurboCxxModule.cpp +++ b/packages/react-native/ReactCommon/react/nativemodule/core/ReactCommon/TurboCxxModule.cpp @@ -153,12 +153,10 @@ jsi::Value TurboCxxModule::invokeMethod( CxxModule::Callback second; if (count < method.callbacks) { - throw std::invalid_argument(folly::to( - "Expected ", - method.callbacks, - " callbacks, but only ", - count, - " parameters provided")); + throw std::invalid_argument( + "Expected " + std::to_string(method.callbacks) + + " callbacks, but only " + std::to_string(count) + + " parameters provided"); } if (method.callbacks == 1) { diff --git a/packages/react-native/ReactCommon/react/renderer/attributedstring/conversions.h b/packages/react-native/ReactCommon/react/renderer/attributedstring/conversions.h index 506db4dfbd9..d0271c53acf 100644 --- a/packages/react-native/ReactCommon/react/renderer/attributedstring/conversions.h +++ b/packages/react-native/ReactCommon/react/renderer/attributedstring/conversions.h @@ -7,7 +7,6 @@ #pragma once -#include #include #include #include @@ -250,7 +249,7 @@ inline void fromRawValue( } inline std::string toString(const FontWeight& fontWeight) { - return folly::to((int)fontWeight); + return std::to_string((int)fontWeight); } inline void fromRawValue( @@ -967,8 +966,8 @@ inline void fromRawValue( } inline std::string toString(const AttributedString::Range& range) { - return "{location: " + folly::to(range.location) + - ", length: " + folly::to(range.length) + "}"; + return "{location: " + std::to_string(range.location) + + ", length: " + std::to_string(range.length) + "}"; } #ifdef ANDROID diff --git a/packages/react-native/ReactCommon/react/renderer/core/ShadowNode.cpp b/packages/react-native/ReactCommon/react/renderer/core/ShadowNode.cpp index dc54f04c5c3..4d637853f6a 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/ShadowNode.cpp +++ b/packages/react-native/ReactCommon/react/renderer/core/ShadowNode.cpp @@ -376,8 +376,8 @@ std::string ShadowNode::getDebugName() const { } std::string ShadowNode::getDebugValue() const { - return "r" + folly::to(revision_) + "/sr" + - folly::to(state_ ? state_->getRevision() : 0) + + return "r" + std::to_string(revision_) + "/sr" + + std::to_string(state_ ? state_->getRevision() : 0) + (getSealed() ? "/sealed" : "") + (getProps()->nativeId.empty() ? "" : "/id=" + getProps()->nativeId); } @@ -399,7 +399,7 @@ SharedDebugStringConvertibleList ShadowNode::getDebugChildren() const { SharedDebugStringConvertibleList ShadowNode::getDebugProps() const { return props_->getDebugProps() + SharedDebugStringConvertibleList{ - debugStringConvertibleItem("tag", folly::to(getTag()))}; + debugStringConvertibleItem("tag", std::to_string(getTag()))}; } #endif diff --git a/packages/react-native/ReactCommon/react/renderer/core/graphicsConversions.h b/packages/react-native/ReactCommon/react/renderer/core/graphicsConversions.h index 8e1ff0a0473..2a718584b05 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/graphicsConversions.h +++ b/packages/react-native/ReactCommon/react/renderer/core/graphicsConversions.h @@ -7,12 +7,14 @@ #pragma once +#include #include #include #include #include #include +#include #include #include #include @@ -44,11 +46,16 @@ inline folly::dynamic toDynamic(const SharedColor& color) { inline std::string toString(const SharedColor& value) { ColorComponents components = colorComponentsFromColor(value); - auto ratio = 255.f; - return "rgba(" + folly::to(round(components.red * ratio)) + - ", " + folly::to(round(components.green * ratio)) + ", " + - folly::to(round(components.blue * ratio)) + ", " + - folly::to(round(components.alpha * ratio)) + ")"; + std::array buffer{}; + std::snprintf( + buffer.data(), + buffer.size(), + "rgba(%.0f, %.0f, %.0f, %.0f)", + components.red * 255.f, + components.green * 255.f, + components.blue * 255.f, + components.alpha * 255.f); + return buffer.data(); } #pragma mark - Geometry @@ -208,14 +215,14 @@ inline void fromRawValue( LOG(ERROR) << "Unsupported CornerInsets type"; } +#if RN_DEBUG_STRING_CONVERTIBLE + inline std::string toString(const Point& point) { - return "{" + folly::to(point.x) + ", " + - folly::to(point.y) + "}"; + return "{" + toString(point.x) + ", " + toString(point.y) + "}"; } inline std::string toString(const Size& size) { - return "{" + folly::to(size.width) + ", " + - folly::to(size.height) + "}"; + return "{" + toString(size.width) + ", " + toString(size.height) + "}"; } inline std::string toString(const Rect& rect) { @@ -223,17 +230,18 @@ inline std::string toString(const Rect& rect) { } inline std::string toString(const EdgeInsets& edgeInsets) { - return "{" + folly::to(edgeInsets.left) + ", " + - folly::to(edgeInsets.top) + ", " + - folly::to(edgeInsets.right) + ", " + - folly::to(edgeInsets.bottom) + "}"; + return "{" + toString(edgeInsets.left) + ", " + toString(edgeInsets.top) + + ", " + toString(edgeInsets.right) + ", " + toString(edgeInsets.bottom) + + "}"; } inline std::string toString(const CornerInsets& cornerInsets) { - return "{" + folly::to(cornerInsets.topLeft) + ", " + - folly::to(cornerInsets.topRight) + ", " + - folly::to(cornerInsets.bottomLeft) + ", " + - folly::to(cornerInsets.bottomRight) + "}"; + return "{" + toString(cornerInsets.topLeft) + ", " + + toString(cornerInsets.topRight) + ", " + + toString(cornerInsets.bottomLeft) + ", " + + toString(cornerInsets.bottomRight) + "}"; } +#endif + } // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/renderer/debug/DebugStringConvertible.cpp b/packages/react-native/ReactCommon/react/renderer/debug/DebugStringConvertible.cpp index dd987800797..65971a62f2f 100644 --- a/packages/react-native/ReactCommon/react/renderer/debug/DebugStringConvertible.cpp +++ b/packages/react-native/ReactCommon/react/renderer/debug/DebugStringConvertible.cpp @@ -7,8 +7,11 @@ #include "DebugStringConvertible.h" -#include -#include +#include +#include +#include + +#include namespace facebook::react { @@ -125,26 +128,34 @@ SharedDebugStringConvertibleList DebugStringConvertible::getDebugProps() const { /* * `toString`-family implementation. */ -std::string toString(const std::string& value) { - return value; -} -std::string toString(const int& value) { - return folly::to(value); -} -std::string toString(const bool& value) { - return folly::to(value); -} -std::string toString(const float& value) { - return folly::to(value); -} std::string toString(const double& value) { - return folly::to(value); + // Format taken from folly's toString + static double_conversion::DoubleToStringConverter conv( + 0, + "Infinity", + "NaN", + 'E', + -6, // detail::kConvMaxDecimalInShortestLow, + 21, // detail::kConvMaxDecimalInShortestHigh, + 6, // max leading padding zeros + 1); // max trailing padding zeros + std::array buffer{}; + double_conversion::StringBuilder builder(buffer.data(), buffer.size()); + conv.ToShortest(value, &builder); + return builder.Finalize(); } + std::string toString(const void* value) { if (value == nullptr) { return "null"; } - return folly::sformat("0x{0:016x}", reinterpret_cast(value)); + std::array buffer{}; + std::snprintf( + buffer.data(), + buffer.size(), + "0x%" PRIXPTR, + reinterpret_cast(value)); + return buffer.data(); } #endif diff --git a/packages/react-native/ReactCommon/react/renderer/debug/DebugStringConvertible.h b/packages/react-native/ReactCommon/react/renderer/debug/DebugStringConvertible.h index 10843c87d87..e94972813fb 100644 --- a/packages/react-native/ReactCommon/react/renderer/debug/DebugStringConvertible.h +++ b/packages/react-native/ReactCommon/react/renderer/debug/DebugStringConvertible.h @@ -90,15 +90,24 @@ class DebugStringConvertible {}; /* * Set of particular-format-opinionated functions that convert base types to - * `std::string`; practically incapsulate `folly:to<>` and `folly::format`. + * `std::string` */ -std::string toString(const std::string& value); -std::string toString(const int& value); -std::string toString(const bool& value); -std::string toString(const float& value); std::string toString(const double& value); std::string toString(const void* value); +inline std::string toString(const std::string& value) { + return value; +} +inline std::string toString(const int& value) { + return std::to_string(value); +} +inline std::string toString(const bool& value) { + return value ? "true" : "false"; +} +inline std::string toString(const float& value) { + return toString(static_cast(value)); +} + template std::string toString(const std::optional& value) { if (!value) { diff --git a/packages/react-native/ReactCommon/react/runtime/ReactInstance.cpp b/packages/react-native/ReactCommon/react/runtime/ReactInstance.cpp index 8c2c0840ac7..94ae9fe18b1 100644 --- a/packages/react-native/ReactCommon/react/runtime/ReactInstance.cpp +++ b/packages/react-native/ReactCommon/react/runtime/ReactInstance.cpp @@ -330,7 +330,7 @@ void ReactInstance::registerSegment( << segmentId; runtimeScheduler_->scheduleWork([=](jsi::Runtime& runtime) { TraceSection s("ReactInstance::registerSegment"); - const auto tag = folly::to(segmentId); + auto tag = std::to_string(segmentId); auto script = JSBigFileString::fromPath(segmentPath); if (script->size() == 0) { throw std::invalid_argument(