diff --git a/iOS/SonarKit/FBCxxUtils/FBCxxFollyDynamicConvert.mm b/iOS/SonarKit/FBCxxUtils/FBCxxFollyDynamicConvert.mm index 3cae66d43..77f50c474 100644 --- a/iOS/SonarKit/FBCxxUtils/FBCxxFollyDynamicConvert.mm +++ b/iOS/SonarKit/FBCxxUtils/FBCxxFollyDynamicConvert.mm @@ -11,7 +11,8 @@ namespace cxxutils { * The implementation is taken from RCTFollyConvert(https://fburl.com/vzw8ql2q) */ -id convertFollyDynamicToId(const folly::dynamic &dyn) { +id convertFollyDynamicToId(const folly::dynamic &dyn) +{ // I could imagine an implementation which avoids copies by wrapping the // dynamic in a derived class of NSDictionary. We can do that if profiling // implies it will help. @@ -26,19 +27,24 @@ id convertFollyDynamicToId(const folly::dynamic &dyn) { case folly::dynamic::DOUBLE: return @(dyn.getDouble()); case folly::dynamic::STRING: - return [[NSString alloc] initWithBytes:dyn.c_str() length:dyn.size() - encoding:NSUTF8StringEncoding]; + return [[NSString alloc] initWithBytes:dyn.c_str() length:dyn.size() encoding:NSUTF8StringEncoding]; case folly::dynamic::ARRAY: { NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:dyn.size()]; for (auto &elem : dyn) { - [array addObject:convertFollyDynamicToId(elem)]; + id obj = convertFollyDynamicToId(elem); + if (obj) { + [array addObject:obj]; + } } return array; } case folly::dynamic::OBJECT: { NSMutableDictionary *dict = [[NSMutableDictionary alloc] initWithCapacity:dyn.size()]; for (auto &elem : dyn.items()) { - dict[convertFollyDynamicToId(elem.first)] = convertFollyDynamicToId(elem.second); + id obj = convertFollyDynamicToId(elem.second); + if (obj) { + dict[convertFollyDynamicToId(elem.first)] = obj; + } } return dict; } @@ -54,14 +60,14 @@ folly::dynamic convertIdToFollyDynamic(id json, bool nullifyNanAndInf) switch (objCType[0]) { // This is a c++ bool or C99 _Bool. On some platforms, BOOL is a bool. case _C_BOOL: - return (bool) [json boolValue]; + return (bool)[json boolValue]; case _C_CHR: // On some platforms, objc BOOL is a signed char, but it // might also be a small number. Use the same hack JSC uses // to distinguish them: // https://phabricator.intern.facebook.com/diffusion/FBS/browse/master/fbobjc/xplat/third-party/jsc/safari-600-1-4-17/JavaScriptCore/API/JSValue.mm;b8ee03916489f8b12143cd5c0bca546da5014fc9$901 if ([json isKindOfClass:[@YES class]]) { - return (bool) [json boolValue]; + return (bool)[json boolValue]; } else { const auto value = [json longLongValue]; if (nullifyNanAndInf && (isnan(value) || isinf(value))) { @@ -94,13 +100,12 @@ folly::dynamic convertIdToFollyDynamic(id json, bool nullifyNanAndInf) return value; } - // default: - // fall through + // default: + // fall through } } else if ([json isKindOfClass:[NSString class]]) { NSData *data = [json dataUsingEncoding:NSUTF8StringEncoding]; - return std::string(reinterpret_cast(data.bytes), - data.length); + return std::string(reinterpret_cast(data.bytes), data.length); } else if ([json isKindOfClass:[NSArray class]]) { folly::dynamic array = folly::dynamic::array; for (id element in json) { @@ -111,14 +116,13 @@ folly::dynamic convertIdToFollyDynamic(id json, bool nullifyNanAndInf) __block folly::dynamic object = folly::dynamic::object(); [json enumerateKeysAndObjectsUsingBlock:^(NSString *key, NSString *value, __unused BOOL *stop) { - object.insert(convertIdToFollyDynamic(key, nullifyNanAndInf), - convertIdToFollyDynamic(value, nullifyNanAndInf)); - }]; + object.insert(convertIdToFollyDynamic(key, nullifyNanAndInf), convertIdToFollyDynamic(value, nullifyNanAndInf)); + }]; return object; } return nil; } - -} } +} +}