123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- /*
- * 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.
- */
- #import "RCTCxxUtils.h"
- #import <React/RCTFollyConvert.h>
- #import <React/RCTModuleData.h>
- #import <React/RCTUtils.h>
- #import <cxxreact/CxxNativeModule.h>
- #import <jsi/jsi.h>
- #import "DispatchMessageQueueThread.h"
- #import "RCTCxxModule.h"
- #import "RCTNativeModule.h"
- namespace facebook {
- namespace react {
- using facebook::jsi::JSError;
- std::vector<std::unique_ptr<NativeModule>>
- createNativeModules(NSArray<RCTModuleData *> *modules, RCTBridge *bridge, const std::shared_ptr<Instance> &instance)
- {
- std::vector<std::unique_ptr<NativeModule>> nativeModules;
- for (RCTModuleData *moduleData in modules) {
- if ([moduleData.moduleClass isSubclassOfClass:[RCTCxxModule class]]) {
- nativeModules.emplace_back(std::make_unique<CxxNativeModule>(
- instance,
- [moduleData.name UTF8String],
- [moduleData] { return [(RCTCxxModule *)(moduleData.instance) createModule]; },
- std::make_shared<DispatchMessageQueueThread>(moduleData)));
- } else {
- nativeModules.emplace_back(std::make_unique<RCTNativeModule>(bridge, moduleData));
- }
- }
- return nativeModules;
- }
- static NSError *errorWithException(const std::exception &e)
- {
- NSString *msg = @(e.what());
- NSMutableDictionary *errorInfo = [NSMutableDictionary dictionary];
- const auto *jsError = dynamic_cast<const JSError *>(&e);
- if (jsError) {
- errorInfo[RCTJSRawStackTraceKey] = @(jsError->getStack().c_str());
- msg = [@"Unhandled JS Exception: " stringByAppendingString:msg];
- }
- NSError *nestedError;
- try {
- std::rethrow_if_nested(e);
- } catch (const std::exception &e) {
- nestedError = errorWithException(e);
- } catch (...) {
- }
- if (nestedError) {
- msg = [NSString stringWithFormat:@"%@\n\n%@", msg, [nestedError localizedDescription]];
- }
- errorInfo[NSLocalizedDescriptionKey] = msg;
- return [NSError errorWithDomain:RCTErrorDomain code:1 userInfo:errorInfo];
- }
- NSError *tryAndReturnError(const std::function<void()> &func)
- {
- try {
- @try {
- func();
- return nil;
- } @catch (NSException *exception) {
- NSString *message = [NSString stringWithFormat:@"Exception '%@' was thrown from JS thread", exception];
- return RCTErrorWithMessage(message);
- } @catch (id exception) {
- // This will catch any other ObjC exception, but no C++ exceptions
- return RCTErrorWithMessage(@"non-std ObjC Exception");
- }
- } catch (const std::exception &ex) {
- return errorWithException(ex);
- } catch (...) {
- // On a 64-bit platform, this would catch ObjC exceptions, too, but not on
- // 32-bit platforms, so we catch those with id exceptions above.
- return RCTErrorWithMessage(@"non-std C++ exception");
- }
- }
- NSString *deriveSourceURL(NSURL *url)
- {
- NSString *sourceUrl;
- if (url.isFileURL) {
- // Url will contain only path to resource (i.g. file:// will be removed)
- sourceUrl = url.path;
- } else {
- // Url will include protocol (e.g. http://)
- sourceUrl = url.absoluteString;
- }
- return sourceUrl ?: @"";
- }
- }
- }
|