From 53b387638e71256a0716751274a6a435611c7f0a Mon Sep 17 00:00:00 2001 From: Pieter De Baets Date: Thu, 16 Feb 2017 06:45:41 -0800 Subject: [PATCH] Move JSBigString to its own header Reviewed By: mhorowitz Differential Revision: D4551162 fbshipit-source-id: 2374e05e60942211e50af86ed42eb194e5e82bbe --- React/ReactCxx.xcodeproj/project.pbxproj | 88 +++++++- ReactCommon/cxxreact/BUCK | 1 + ReactCommon/cxxreact/Executor.h | 227 +-------------------- ReactCommon/cxxreact/JSBigString.h | 235 ++++++++++++++++++++++ ReactCommon/cxxreact/JSIndexedRAMBundle.h | 3 +- 5 files changed, 324 insertions(+), 230 deletions(-) create mode 100644 ReactCommon/cxxreact/JSBigString.h diff --git a/React/ReactCxx.xcodeproj/project.pbxproj b/React/ReactCxx.xcodeproj/project.pbxproj index 5c8b7a720..04966707e 100644 --- a/React/ReactCxx.xcodeproj/project.pbxproj +++ b/React/ReactCxx.xcodeproj/project.pbxproj @@ -170,7 +170,6 @@ 13EBC63B1E284D8700880AC5 /* JSCUtils.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 3D92B0C31E03699D0018521A /* JSCUtils.h */; }; 13EBC63C1E284D8700880AC5 /* JSCWebWorker.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 3D92B0C51E03699D0018521A /* JSCWebWorker.h */; }; 13EBC63D1E284D8700880AC5 /* JSIndexedRAMBundle.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 3D92B0C71E03699D0018521A /* JSIndexedRAMBundle.h */; }; - 13EBC63E1E284D8700880AC5 /* JSModulesUnbundle.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 3D92B0C81E03699D0018521A /* JSModulesUnbundle.h */; }; 13EBC63F1E284D8700880AC5 /* MessageQueueThread.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 3D92B0C91E03699D0018521A /* MessageQueueThread.h */; }; 13EBC6401E284D8700880AC5 /* MethodCall.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 3D92B0CB1E03699D0018521A /* MethodCall.h */; }; 13EBC6411E284D8700880AC5 /* ModuleRegistry.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 3D92B0CD1E03699D0018521A /* ModuleRegistry.h */; }; @@ -486,6 +485,46 @@ 3D3CD9441DE5FC6500167DC4 /* libjschelpers.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3D3CD9181DE5FBD800167DC4 /* libjschelpers.a */; }; 3D3CD9451DE5FC7100167DC4 /* JSBundleType.h in Headers */ = {isa = PBXBuildFile; fileRef = 3D3CD8F51DE5FB2300167DC4 /* JSBundleType.h */; }; 3D3CD9471DE5FC7800167DC4 /* oss-compat-util.h in Headers */ = {isa = PBXBuildFile; fileRef = AC70D2EE1DE48AC5002E6351 /* oss-compat-util.h */; }; + 3D74547C1E54758900E74ADD /* JSBigString.h in Headers */ = {isa = PBXBuildFile; fileRef = 3D7454781E54757500E74ADD /* JSBigString.h */; }; + 3D74547D1E54758900E74ADD /* JSBigString.h in Headers */ = {isa = PBXBuildFile; fileRef = 3D7454781E54757500E74ADD /* JSBigString.h */; }; + 3D74547E1E54759A00E74ADD /* JSModulesUnbundle.h in Headers */ = {isa = PBXBuildFile; fileRef = 3D92B0C81E03699D0018521A /* JSModulesUnbundle.h */; }; + 3D74547F1E54759E00E74ADD /* JSModulesUnbundle.h in Headers */ = {isa = PBXBuildFile; fileRef = 3D92B0C81E03699D0018521A /* JSModulesUnbundle.h */; }; + 3D7454801E5475AF00E74ADD /* RecoverableError.h in Headers */ = {isa = PBXBuildFile; fileRef = 3D7454791E54757500E74ADD /* RecoverableError.h */; }; + 3D7454811E5475AF00E74ADD /* RecoverableError.h in Headers */ = {isa = PBXBuildFile; fileRef = 3D7454791E54757500E74ADD /* RecoverableError.h */; }; + 3D7454821E5475DA00E74ADD /* JSBigString.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 3D7454781E54757500E74ADD /* JSBigString.h */; }; + 3D7454831E5475DA00E74ADD /* JSModulesUnbundle.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 3D92B0C81E03699D0018521A /* JSModulesUnbundle.h */; }; + 3D7454841E5475DA00E74ADD /* RecoverableError.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 3D7454791E54757500E74ADD /* RecoverableError.h */; }; + 3D7454851E5475E800E74ADD /* CxxMessageQueue.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 3D92B0A61E03699D0018521A /* CxxMessageQueue.h */; }; + 3D7454861E5475E800E74ADD /* CxxModule.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 3D92B0A71E03699D0018521A /* CxxModule.h */; }; + 3D7454871E5475E800E74ADD /* CxxNativeModule.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 3D92B0A91E03699D0018521A /* CxxNativeModule.h */; }; + 3D7454881E5475E800E74ADD /* Executor.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 3D92B0AB1E03699D0018521A /* Executor.h */; }; + 3D7454891E5475E800E74ADD /* ExecutorToken.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 3D92B0AC1E03699D0018521A /* ExecutorToken.h */; }; + 3D74548A1E5475E800E74ADD /* ExecutorTokenFactory.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 3D92B0AD1E03699D0018521A /* ExecutorTokenFactory.h */; }; + 3D74548B1E5475E800E74ADD /* Instance.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 3D92B0AF1E03699D0018521A /* Instance.h */; }; + 3D74548C1E5475E800E74ADD /* JsArgumentHelpers-inl.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 3D92B0B01E03699D0018521A /* JsArgumentHelpers-inl.h */; }; + 3D74548D1E5475E800E74ADD /* JsArgumentHelpers.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 3D92B0B11E03699D0018521A /* JsArgumentHelpers.h */; }; + 3D74548E1E5475E800E74ADD /* JSBigString.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 3D7454781E54757500E74ADD /* JSBigString.h */; }; + 3D74548F1E5475E800E74ADD /* JSCExecutor.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 3D92B0B31E03699D0018521A /* JSCExecutor.h */; }; + 3D7454901E5475E800E74ADD /* JSCLegacyProfiler.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 3D92B0B51E03699D0018521A /* JSCLegacyProfiler.h */; }; + 3D7454911E5475E800E74ADD /* JSCLegacyTracing.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 3D92B0B71E03699D0018521A /* JSCLegacyTracing.h */; }; + 3D7454921E5475E800E74ADD /* JSCMemory.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 3D92B0B91E03699D0018521A /* JSCMemory.h */; }; + 3D7454931E5475E800E74ADD /* JSCNativeModules.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 3D92B0BB1E03699D0018521A /* JSCNativeModules.h */; }; + 3D7454941E5475E800E74ADD /* JSCPerfStats.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 3D92B0BD1E03699D0018521A /* JSCPerfStats.h */; }; + 3D7454951E5475E800E74ADD /* JSCSamplingProfiler.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 3D92B0BF1E03699D0018521A /* JSCSamplingProfiler.h */; }; + 3D7454961E5475E800E74ADD /* JSCUtils.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 3D92B0C31E03699D0018521A /* JSCUtils.h */; }; + 3D7454971E5475E800E74ADD /* JSCWebWorker.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 3D92B0C51E03699D0018521A /* JSCWebWorker.h */; }; + 3D7454981E5475E800E74ADD /* JSIndexedRAMBundle.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 3D92B0C71E03699D0018521A /* JSIndexedRAMBundle.h */; }; + 3D7454991E5475E800E74ADD /* JSModulesUnbundle.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 3D92B0C81E03699D0018521A /* JSModulesUnbundle.h */; }; + 3D74549A1E5475E800E74ADD /* MessageQueueThread.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 3D92B0C91E03699D0018521A /* MessageQueueThread.h */; }; + 3D74549B1E5475E800E74ADD /* MethodCall.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 3D92B0CB1E03699D0018521A /* MethodCall.h */; }; + 3D74549C1E5475E800E74ADD /* ModuleRegistry.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 3D92B0CD1E03699D0018521A /* ModuleRegistry.h */; }; + 3D74549D1E5475E800E74ADD /* NativeModule.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 3D92B0CE1E03699D0018521A /* NativeModule.h */; }; + 3D74549E1E5475E800E74ADD /* NativeToJsBridge.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 3D92B0D01E03699D0018521A /* NativeToJsBridge.h */; }; + 3D74549F1E5475E800E74ADD /* oss-compat-util.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = AC70D2EE1DE48AC5002E6351 /* oss-compat-util.h */; }; + 3D7454A01E5475E800E74ADD /* Platform.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 3D92B0D21E03699D0018521A /* Platform.h */; }; + 3D7454A11E5475E800E74ADD /* RecoverableError.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 3D7454791E54757500E74ADD /* RecoverableError.h */; }; + 3D7454A21E5475E800E74ADD /* SampleCxxModule.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 3D92B0D41E03699D0018521A /* SampleCxxModule.h */; }; + 3D7454A31E5475E800E74ADD /* SystraceSection.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 3D92B0D51E03699D0018521A /* SystraceSection.h */; }; 3D7749441DC1065C007EC8D8 /* RCTPlatform.m in Sources */ = {isa = PBXBuildFile; fileRef = 3D7749431DC1065C007EC8D8 /* RCTPlatform.m */; }; 3D7A27E21DE325B7002E3F95 /* RCTJSCErrorHandling.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3D7A27E11DE325B7002E3F95 /* RCTJSCErrorHandling.mm */; }; 3D7A27E31DE325DA002E3F95 /* RCTJSCErrorHandling.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3D7A27E11DE325B7002E3F95 /* RCTJSCErrorHandling.mm */; }; @@ -756,7 +795,6 @@ 3D92B0F41E03699D0018521A /* JSCUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 3D92B0C31E03699D0018521A /* JSCUtils.h */; }; 3D92B0F61E03699D0018521A /* JSCWebWorker.h in Headers */ = {isa = PBXBuildFile; fileRef = 3D92B0C51E03699D0018521A /* JSCWebWorker.h */; }; 3D92B0F81E03699D0018521A /* JSIndexedRAMBundle.h in Headers */ = {isa = PBXBuildFile; fileRef = 3D92B0C71E03699D0018521A /* JSIndexedRAMBundle.h */; }; - 3D92B0F91E03699D0018521A /* JSModulesUnbundle.h in Headers */ = {isa = PBXBuildFile; fileRef = 3D92B0C81E03699D0018521A /* JSModulesUnbundle.h */; }; 3D92B0FA1E03699D0018521A /* MessageQueueThread.h in Headers */ = {isa = PBXBuildFile; fileRef = 3D92B0C91E03699D0018521A /* MessageQueueThread.h */; }; 3D92B0FC1E03699D0018521A /* MethodCall.h in Headers */ = {isa = PBXBuildFile; fileRef = 3D92B0CB1E03699D0018521A /* MethodCall.h */; }; 3D92B0FE1E03699D0018521A /* ModuleRegistry.h in Headers */ = {isa = PBXBuildFile; fileRef = 3D92B0CD1E03699D0018521A /* ModuleRegistry.h */; }; @@ -920,6 +958,37 @@ dstPath = include/cxxreact; dstSubfolderSpec = 16; files = ( + 3D7454851E5475E800E74ADD /* CxxMessageQueue.h in Copy Headers */, + 3D7454861E5475E800E74ADD /* CxxModule.h in Copy Headers */, + 3D7454871E5475E800E74ADD /* CxxNativeModule.h in Copy Headers */, + 3D7454881E5475E800E74ADD /* Executor.h in Copy Headers */, + 3D7454891E5475E800E74ADD /* ExecutorToken.h in Copy Headers */, + 3D74548A1E5475E800E74ADD /* ExecutorTokenFactory.h in Copy Headers */, + 3D74548B1E5475E800E74ADD /* Instance.h in Copy Headers */, + 3D74548C1E5475E800E74ADD /* JsArgumentHelpers-inl.h in Copy Headers */, + 3D74548D1E5475E800E74ADD /* JsArgumentHelpers.h in Copy Headers */, + 3D74548E1E5475E800E74ADD /* JSBigString.h in Copy Headers */, + 3D74548F1E5475E800E74ADD /* JSCExecutor.h in Copy Headers */, + 3D7454901E5475E800E74ADD /* JSCLegacyProfiler.h in Copy Headers */, + 3D7454911E5475E800E74ADD /* JSCLegacyTracing.h in Copy Headers */, + 3D7454921E5475E800E74ADD /* JSCMemory.h in Copy Headers */, + 3D7454931E5475E800E74ADD /* JSCNativeModules.h in Copy Headers */, + 3D7454941E5475E800E74ADD /* JSCPerfStats.h in Copy Headers */, + 3D7454951E5475E800E74ADD /* JSCSamplingProfiler.h in Copy Headers */, + 3D7454961E5475E800E74ADD /* JSCUtils.h in Copy Headers */, + 3D7454971E5475E800E74ADD /* JSCWebWorker.h in Copy Headers */, + 3D7454981E5475E800E74ADD /* JSIndexedRAMBundle.h in Copy Headers */, + 3D7454991E5475E800E74ADD /* JSModulesUnbundle.h in Copy Headers */, + 3D74549A1E5475E800E74ADD /* MessageQueueThread.h in Copy Headers */, + 3D74549B1E5475E800E74ADD /* MethodCall.h in Copy Headers */, + 3D74549C1E5475E800E74ADD /* ModuleRegistry.h in Copy Headers */, + 3D74549D1E5475E800E74ADD /* NativeModule.h in Copy Headers */, + 3D74549E1E5475E800E74ADD /* NativeToJsBridge.h in Copy Headers */, + 3D74549F1E5475E800E74ADD /* oss-compat-util.h in Copy Headers */, + 3D7454A01E5475E800E74ADD /* Platform.h in Copy Headers */, + 3D7454A11E5475E800E74ADD /* RecoverableError.h in Copy Headers */, + 3D7454A21E5475E800E74ADD /* SampleCxxModule.h in Copy Headers */, + 3D7454A31E5475E800E74ADD /* SystraceSection.h in Copy Headers */, 3D302F1C1DF8264000D6DDAE /* JSBundleType.h in Copy Headers */, ); name = "Copy Headers"; @@ -1089,6 +1158,9 @@ dstPath = include/cxxreact; dstSubfolderSpec = 16; files = ( + 3D7454821E5475DA00E74ADD /* JSBigString.h in Copy Headers */, + 3D7454831E5475DA00E74ADD /* JSModulesUnbundle.h in Copy Headers */, + 3D7454841E5475DA00E74ADD /* RecoverableError.h in Copy Headers */, 13EBC62A1E284D8700880AC5 /* CxxMessageQueue.h in Copy Headers */, 13EBC62B1E284D8700880AC5 /* CxxModule.h in Copy Headers */, 13EBC62C1E284D8700880AC5 /* CxxNativeModule.h in Copy Headers */, @@ -1108,7 +1180,6 @@ 13EBC63B1E284D8700880AC5 /* JSCUtils.h in Copy Headers */, 13EBC63C1E284D8700880AC5 /* JSCWebWorker.h in Copy Headers */, 13EBC63D1E284D8700880AC5 /* JSIndexedRAMBundle.h in Copy Headers */, - 13EBC63E1E284D8700880AC5 /* JSModulesUnbundle.h in Copy Headers */, 13EBC63F1E284D8700880AC5 /* MessageQueueThread.h in Copy Headers */, 13EBC6401E284D8700880AC5 /* MethodCall.h in Copy Headers */, 13EBC6411E284D8700880AC5 /* ModuleRegistry.h in Copy Headers */, @@ -1399,6 +1470,8 @@ 3D3CD9181DE5FBD800167DC4 /* libjschelpers.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libjschelpers.a; sourceTree = BUILT_PRODUCTS_DIR; }; 3D3CD9251DE5FBEC00167DC4 /* libcxxreact.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libcxxreact.a; sourceTree = BUILT_PRODUCTS_DIR; }; 3D3CD9321DE5FBEE00167DC4 /* libcxxreact.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libcxxreact.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 3D7454781E54757500E74ADD /* JSBigString.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSBigString.h; sourceTree = ""; }; + 3D7454791E54757500E74ADD /* RecoverableError.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RecoverableError.h; sourceTree = ""; }; 3D7749421DC1065C007EC8D8 /* RCTPlatform.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RCTPlatform.h; sourceTree = ""; }; 3D7749431DC1065C007EC8D8 /* RCTPlatform.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RCTPlatform.m; sourceTree = ""; }; 3D7A27DC1DE32541002E3F95 /* JavaScriptCore.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JavaScriptCore.h; sourceTree = ""; }; @@ -2122,6 +2195,7 @@ 3D92B0AF1E03699D0018521A /* Instance.h */, 3D92B0B01E03699D0018521A /* JsArgumentHelpers-inl.h */, 3D92B0B11E03699D0018521A /* JsArgumentHelpers.h */, + 3D7454781E54757500E74ADD /* JSBigString.h */, AC70D2EB1DE48A22002E6351 /* JSBundleType.cpp */, 3D3CD8F51DE5FB2300167DC4 /* JSBundleType.h */, 3D92B0B21E03699D0018521A /* JSCExecutor.cpp */, @@ -2156,6 +2230,7 @@ AC70D2EE1DE48AC5002E6351 /* oss-compat-util.h */, 3D92B0D11E03699D0018521A /* Platform.cpp */, 3D92B0D21E03699D0018521A /* Platform.h */, + 3D7454791E54757500E74ADD /* RecoverableError.h */, 3D92B0D31E03699D0018521A /* SampleCxxModule.cpp */, 3D92B0D41E03699D0018521A /* SampleCxxModule.h */, 3D92B0D51E03699D0018521A /* SystraceSection.h */, @@ -2336,7 +2411,10 @@ isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( + 3D74547E1E54759A00E74ADD /* JSModulesUnbundle.h in Headers */, + 3D7454811E5475AF00E74ADD /* RecoverableError.h in Headers */, 3D3030221DF8294C00D6DDAE /* JSBundleType.h in Headers */, + 3D74547D1E54758900E74ADD /* JSBigString.h in Headers */, 3D3030231DF8294C00D6DDAE /* oss-compat-util.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; @@ -2378,7 +2456,10 @@ isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( + 3D74547F1E54759E00E74ADD /* JSModulesUnbundle.h in Headers */, + 3D7454801E5475AF00E74ADD /* RecoverableError.h in Headers */, 3D3CD9471DE5FC7800167DC4 /* oss-compat-util.h in Headers */, + 3D74547C1E54758900E74ADD /* JSBigString.h in Headers */, 3D3CD9451DE5FC7100167DC4 /* JSBundleType.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; @@ -2495,7 +2576,6 @@ 3D80DA601DF820620028D040 /* RCTActivityIndicatorViewManager.h in Headers */, 3D80DA611DF820620028D040 /* RCTAnimationType.h in Headers */, 3D80DA621DF820620028D040 /* RCTAutoInsetsProtocol.h in Headers */, - 3D92B0F91E03699D0018521A /* JSModulesUnbundle.h in Headers */, 3D80DA631DF820620028D040 /* RCTBorderDrawing.h in Headers */, 3D80DA641DF820620028D040 /* RCTBorderStyle.h in Headers */, 130443A11E3FEAA900D93A67 /* RCTFollyConvert.h in Headers */, diff --git a/ReactCommon/cxxreact/BUCK b/ReactCommon/cxxreact/BUCK index 1c732a1cf..d96217ffb 100644 --- a/ReactCommon/cxxreact/BUCK +++ b/ReactCommon/cxxreact/BUCK @@ -134,6 +134,7 @@ CXXREACT_PUBLIC_HEADERS = [ 'JSCExecutor.h', 'JSCNativeModules.h', 'JSCWebWorker.h', + 'JSBigString.h', 'JSBundleType.h', 'JSIndexedRAMBundle.h', 'JSModulesUnbundle.h', diff --git a/ReactCommon/cxxreact/Executor.h b/ReactCommon/cxxreact/Executor.h index a3c3cdd57..a2aa450ab 100644 --- a/ReactCommon/cxxreact/Executor.h +++ b/ReactCommon/cxxreact/Executor.h @@ -2,19 +2,16 @@ #pragma once -#include -#include #include #include -#include -#include -#include -#include +#include #include #include +#ifndef RN_EXPORT #define RN_EXPORT __attribute__((visibility("default"))) +#endif namespace facebook { namespace react { @@ -61,224 +58,6 @@ public: virtual ~JSExecutorFactory() {} }; -// JSExecutor functions sometimes take large strings, on the order of -// megabytes. Copying these can be expensive. Introducing a -// move-only, non-CopyConstructible type will let the compiler ensure -// that no copies occur. folly::MoveWrapper should be used when a -// large string needs to be curried into a std::function<>, which must -// by CopyConstructible. - -class JSBigString { -public: - JSBigString() = default; - - // Not copyable - JSBigString(const JSBigString&) = delete; - JSBigString& operator=(const JSBigString&) = delete; - - virtual ~JSBigString() {} - - virtual bool isAscii() const = 0; - virtual const char* c_str() const = 0; - virtual size_t size() const = 0; -}; - -// Concrete JSBigString implementation which holds a std::string -// instance. -class JSBigStdString : public JSBigString { -public: - JSBigStdString(std::string str, bool isAscii=false) - : m_isAscii(isAscii) - , m_str(std::move(str)) {} - - bool isAscii() const override { - return m_isAscii; - } - - const char* c_str() const override { - return m_str.c_str(); - } - - size_t size() const override { - return m_str.size(); - } - -private: - bool m_isAscii; - std::string m_str; -}; - -// Concrete JSBigString implementation which holds a heap-allocated -// buffer, and provides an accessor for writing to it. This can be -// used to construct a JSBigString in place, such as by reading from a -// file. -class JSBigBufferString : public facebook::react::JSBigString { -public: - JSBigBufferString(size_t size) - : m_data(new char[size + 1]) - , m_size(size) { - // Guarantee nul-termination. The caller is responsible for - // filling in the rest of m_data. - m_data[m_size] = '\0'; - } - - ~JSBigBufferString() { - delete[] m_data; - } - - bool isAscii() const override { - return true; - } - - const char* c_str() const override { - return m_data; - } - - size_t size() const override { - return m_size; - } - - char* data() { - return m_data; - } - -private: - char* m_data; - size_t m_size; -}; - -// JSBigString interface implemented by a file-backed mmap region. -class RN_EXPORT JSBigFileString : public JSBigString { -public: - - JSBigFileString(int fd, size_t size, off_t offset = 0) - : m_fd {-1} - , m_data {nullptr} - { - folly::checkUnixError( - m_fd = dup(fd), - "Could not duplicate file descriptor"); - - // Offsets given to mmap must be page aligend. We abstract away that - // restriction by sending a page aligned offset to mmap, and keeping track - // of the offset within the page that we must alter the mmap pointer by to - // get the final desired offset. - auto ps = getpagesize(); - auto d = lldiv(offset, ps); - - m_mapOff = d.quot; - m_pageOff = d.rem; - m_size = size + m_pageOff; - } - - ~JSBigFileString() { - if (m_data) { - munmap((void *)m_data, m_size); - } - close(m_fd); - } - - bool isAscii() const override { - return true; - } - - const char *c_str() const override { - if (!m_data) { - m_data = (const char *)mmap(0, m_size, PROT_READ, MAP_SHARED, m_fd, m_mapOff); - CHECK(m_data != MAP_FAILED) - << " fd: " << m_fd - << " size: " << m_size - << " offset: " << m_mapOff - << " error: " << std::strerror(errno); - } - return m_data + m_pageOff; - } - - size_t size() const override { - return m_size - m_pageOff; - } - - int fd() const { - return m_fd; - } - - static std::unique_ptr fromPath(const std::string& sourceURL); - -private: - int m_fd; // The file descriptor being mmaped - size_t m_size; // The size of the mmaped region - size_t m_pageOff; // The offset in the mmaped region to the data. - off_t m_mapOff; // The offset in the file to the mmaped region. - mutable const char *m_data; // Pointer to the mmaped region. -}; - -class JSBigOptimizedBundleString : public JSBigString { -public: - enum class Encoding { - Unknown, - Ascii, - Utf8, - Utf16, - }; - - JSBigOptimizedBundleString(int fd, size_t size, const uint8_t sha1[20], Encoding encoding) : - m_fd(-1), - m_size(size), - m_encoding(encoding), - m_str(nullptr) - { - folly::checkUnixError( - m_fd = dup(fd), - "Could not duplicate file descriptor"); - - memcpy(m_hash, sha1, 20); - } - - ~JSBigOptimizedBundleString() { - if (m_str) { - CHECK(munmap((void *)m_str, m_size) != -1); - } - close(m_fd); - } - - bool isAscii() const override { - return m_encoding == Encoding::Ascii; - } - - const char* c_str() const override { - if (!m_str) { - m_str = (const char *)mmap(0, m_size, PROT_READ, MAP_SHARED, m_fd, 0); - CHECK(m_str != MAP_FAILED); - } - return m_str; - } - - size_t size() const override { - return m_size; - } - - int fd() const { - return m_fd; - } - - const uint8_t* hash() const { - return m_hash; - } - - Encoding encoding() const { - return m_encoding; - } - - static std::unique_ptr fromOptimizedBundle(const std::string& bundlePath); - -private: - int m_fd; - size_t m_size; - uint8_t m_hash[20]; - Encoding m_encoding; - mutable const char *m_str; -}; - class JSExecutor { public: /** diff --git a/ReactCommon/cxxreact/JSBigString.h b/ReactCommon/cxxreact/JSBigString.h new file mode 100644 index 000000000..63cc981a3 --- /dev/null +++ b/ReactCommon/cxxreact/JSBigString.h @@ -0,0 +1,235 @@ +// Copyright 2004-present Facebook. All Rights Reserved. + +#pragma once + +#include +#include + +#include + +#ifndef RN_EXPORT +#define RN_EXPORT __attribute__((visibility("default"))) +#endif + +namespace facebook { +namespace react { + +// JSExecutor functions sometimes take large strings, on the order of +// megabytes. Copying these can be expensive. Introducing a +// move-only, non-CopyConstructible type will let the compiler ensure +// that no copies occur. folly::MoveWrapper should be used when a +// large string needs to be curried into a std::function<>, which must +// by CopyConstructible. + +class JSBigString { +public: + JSBigString() = default; + + // Not copyable + JSBigString(const JSBigString&) = delete; + JSBigString& operator=(const JSBigString&) = delete; + + virtual ~JSBigString() {} + + virtual bool isAscii() const = 0; + virtual const char* c_str() const = 0; + virtual size_t size() const = 0; +}; + +// Concrete JSBigString implementation which holds a std::string +// instance. +class JSBigStdString : public JSBigString { +public: + JSBigStdString(std::string str, bool isAscii=false) + : m_isAscii(isAscii) + , m_str(std::move(str)) {} + + bool isAscii() const override { + return m_isAscii; + } + + const char* c_str() const override { + return m_str.c_str(); + } + + size_t size() const override { + return m_str.size(); + } + +private: + bool m_isAscii; + std::string m_str; +}; + +// Concrete JSBigString implementation which holds a heap-allocated +// buffer, and provides an accessor for writing to it. This can be +// used to construct a JSBigString in place, such as by reading from a +// file. +class JSBigBufferString : public JSBigString { +public: + JSBigBufferString(size_t size) + : m_data(new char[size + 1]) + , m_size(size) { + // Guarantee nul-termination. The caller is responsible for + // filling in the rest of m_data. + m_data[m_size] = '\0'; + } + + ~JSBigBufferString() { + delete[] m_data; + } + + bool isAscii() const override { + return true; + } + + const char* c_str() const override { + return m_data; + } + + size_t size() const override { + return m_size; + } + + char* data() { + return m_data; + } + +private: + char* m_data; + size_t m_size; +}; + +// JSBigString interface implemented by a file-backed mmap region. +class RN_EXPORT JSBigFileString : public JSBigString { +public: + + JSBigFileString(int fd, size_t size, off_t offset = 0) + : m_fd {-1} + , m_data {nullptr} + { + folly::checkUnixError( + m_fd = dup(fd), + "Could not duplicate file descriptor"); + + // Offsets given to mmap must be page aligend. We abstract away that + // restriction by sending a page aligned offset to mmap, and keeping track + // of the offset within the page that we must alter the mmap pointer by to + // get the final desired offset. + auto ps = getpagesize(); + auto d = lldiv(offset, ps); + + m_mapOff = d.quot; + m_pageOff = d.rem; + m_size = size + m_pageOff; + } + + ~JSBigFileString() { + if (m_data) { + munmap((void *)m_data, m_size); + } + close(m_fd); + } + + bool isAscii() const override { + return true; + } + + const char *c_str() const override { + if (!m_data) { + m_data = (const char *)mmap(0, m_size, PROT_READ, MAP_SHARED, m_fd, m_mapOff); + CHECK(m_data != MAP_FAILED) + << " fd: " << m_fd + << " size: " << m_size + << " offset: " << m_mapOff + << " error: " << std::strerror(errno); + } + return m_data + m_pageOff; + } + + size_t size() const override { + return m_size - m_pageOff; + } + + int fd() const { + return m_fd; + } + + static std::unique_ptr fromPath(const std::string& sourceURL); + +private: + int m_fd; // The file descriptor being mmaped + size_t m_size; // The size of the mmaped region + size_t m_pageOff; // The offset in the mmaped region to the data. + off_t m_mapOff; // The offset in the file to the mmaped region. + mutable const char *m_data; // Pointer to the mmaped region. +}; + +class JSBigOptimizedBundleString : public JSBigString { +public: + enum class Encoding { + Unknown, + Ascii, + Utf8, + Utf16, + }; + + JSBigOptimizedBundleString(int fd, size_t size, const uint8_t sha1[20], Encoding encoding) : + m_fd(-1), + m_size(size), + m_encoding(encoding), + m_str(nullptr) + { + folly::checkUnixError( + m_fd = dup(fd), + "Could not duplicate file descriptor"); + + memcpy(m_hash, sha1, 20); + } + + ~JSBigOptimizedBundleString() { + if (m_str) { + CHECK(munmap((void *)m_str, m_size) != -1); + } + close(m_fd); + } + + bool isAscii() const override { + return m_encoding == Encoding::Ascii; + } + + const char* c_str() const override { + if (!m_str) { + m_str = (const char *)mmap(0, m_size, PROT_READ, MAP_SHARED, m_fd, 0); + CHECK(m_str != MAP_FAILED); + } + return m_str; + } + + size_t size() const override { + return m_size; + } + + int fd() const { + return m_fd; + } + + const uint8_t* hash() const { + return m_hash; + } + + Encoding encoding() const { + return m_encoding; + } + + static std::unique_ptr fromOptimizedBundle(const std::string& bundlePath); + +private: + int m_fd; + size_t m_size; + uint8_t m_hash[20]; + Encoding m_encoding; + mutable const char *m_str; +}; + +} } diff --git a/ReactCommon/cxxreact/JSIndexedRAMBundle.h b/ReactCommon/cxxreact/JSIndexedRAMBundle.h index 54df3eb10..6768ccdce 100644 --- a/ReactCommon/cxxreact/JSIndexedRAMBundle.h +++ b/ReactCommon/cxxreact/JSIndexedRAMBundle.h @@ -7,14 +7,13 @@ #include #include +#include namespace facebook { namespace react { class JSBigString; -#include - class JSIndexedRAMBundle : public facebook::react::JSModulesUnbundle { public: // Throws std::runtime_error on failure.