diff --git a/React/Executors/RCTJSCExecutor.h b/React/Executors/RCTJSCExecutor.h index 50c55761f..96dd1f6cf 100644 --- a/React/Executors/RCTJSCExecutor.h +++ b/React/Executors/RCTJSCExecutor.h @@ -51,13 +51,19 @@ RCT_EXTERN NSString *const RCTFBJSValueClassKey; */ @interface RCTJSContextProvider : NSObject -- (instancetype)initWithUseCustomJSCLibrary:(BOOL)useCustomJSCLibrary; +- (instancetype)initWithUseCustomJSCLibrary:(BOOL)useCustomJSCLibrary + tryBytecode:(BOOL)tryBytecode; /** * Marks whether the provider uses the custom implementation of JSC and not the system one. */ @property (nonatomic, readonly, assign) BOOL useCustomJSCLibrary; +/** + * Marks whether it is safe to try and run bytecode if given the choice. + */ +@property (nonatomic, readonly) BOOL tryBytecode; + @end /** @@ -89,6 +95,15 @@ RCT_EXTERN NSString *const RCTFBJSValueClassKey; */ - (instancetype)initWithUseCustomJSCLibrary:(BOOL)useCustomJSCLibrary; +/** + * @experimental + * Inits a new executor instance with given configuration flags. Please refer to + * the documentation for `RCTJSContextProvider` for more information as to their + * purpose. + */ +- (instancetype)initWithUseCustomJSCLibrary:(BOOL)useCustomJSCLibrary + tryBytecode:(BOOL)tryBytecode; + /** * @experimental * Pass a RCTJSContextProvider object to use an NSThread/JSContext pair that have already been created. diff --git a/React/Executors/RCTJSCExecutor.mm b/React/Executors/RCTJSCExecutor.mm index 0a889462f..f01669999 100644 --- a/React/Executors/RCTJSCExecutor.mm +++ b/React/Executors/RCTJSCExecutor.mm @@ -83,6 +83,7 @@ struct TaggedScript { struct RCTJSContextData { BOOL useCustomJSCLibrary; + BOOL tryBytecode; NSThread *javaScriptThread; JSContext *context; RCTJSCWrapper *jscWrapper; @@ -154,6 +155,7 @@ RCT_NOT_IMPLEMENTED(-(instancetype)init) { // Set at init time: BOOL _useCustomJSCLibrary; + BOOL _tryBytecode; NSThread *_javaScriptThread; // Set at setUp time: @@ -238,11 +240,19 @@ static NSThread *newJavaScriptThread(void) } - (instancetype)initWithUseCustomJSCLibrary:(BOOL)useCustomJSCLibrary +{ + return [self initWithUseCustomJSCLibrary:useCustomJSCLibrary + tryBytecode:NO]; +} + +- (instancetype)initWithUseCustomJSCLibrary:(BOOL)useCustomJSCLibrary + tryBytecode:(BOOL)tryBytecode { RCT_PROFILE_BEGIN_EVENT(0, @"-[RCTJSCExecutor init]", nil); if (self = [super init]) { _useCustomJSCLibrary = useCustomJSCLibrary; + _tryBytecode = tryBytecode; _valid = YES; _javaScriptThread = newJavaScriptThread(); } @@ -265,6 +275,7 @@ static NSThread *newJavaScriptThread(void) { if (self = [super init]) { _useCustomJSCLibrary = data.useCustomJSCLibrary; + _tryBytecode = data.tryBytecode; _valid = YES; _javaScriptThread = data.javaScriptThread; _jscWrapper = data.jscWrapper; @@ -502,7 +513,9 @@ static void installBasicSynchronousHooksOnContext(JSContext *context) - (int32_t)bytecodeFileFormatVersion { - return _jscWrapper->JSBytecodeFileFormatVersion; + return _tryBytecode + ? _jscWrapper->JSBytecodeFileFormatVersion + : JSNoBytecodeFileFormatVersion; } - (NSString *)contextName @@ -978,10 +991,12 @@ static NSData *loadRAMBundle(NSURL *sourceURL, NSError **error, RandomAccessBund } - (instancetype)initWithUseCustomJSCLibrary:(BOOL)useCustomJSCLibrary + tryBytecode:(BOOL)tryBytecode { if (self = [super init]) { _semaphore = dispatch_semaphore_create(0); _useCustomJSCLibrary = useCustomJSCLibrary; + _tryBytecode = tryBytecode; _javaScriptThread = newJavaScriptThread(); [self performSelector:@selector(_createContext) onThread:_javaScriptThread withObject:nil waitUntilDone:NO]; } @@ -1003,6 +1018,7 @@ static NSData *loadRAMBundle(NSURL *sourceURL, NSError **error, RandomAccessBund dispatch_semaphore_wait(_semaphore, DISPATCH_TIME_FOREVER); return { .useCustomJSCLibrary = _useCustomJSCLibrary, + .tryBytecode = _tryBytecode, .javaScriptThread = _javaScriptThread, .context = _context, .jscWrapper = _jscWrapper,