Fix SignalHandlerTest with ASAN
[folly.git] / folly / Format-inl.h
index 7cea87a4b5e07cc2f4ab39a7adbb206898d07ea9..b97375c1f8e6e9b4660fa531af74075872c8d78c 100644 (file)
@@ -27,6 +27,7 @@
 
 #include <folly/Exception.h>
 #include <folly/FormatTraits.h>
+#include <folly/MapUtil.h>
 #include <folly/Traits.h>
 #include <folly/portability/Windows.h>
 
@@ -180,7 +181,7 @@ void BaseFormatter<Derived, containerMode, Args...>::operator()(
       p = q;
 
       if (p == end || *p != '}') {
-        throw BadFormatArg("folly::format: single '}' in format string");
+        throwBadFormatArg("folly::format: single '}' in format string");
       }
       ++p;
     }
@@ -202,7 +203,7 @@ void BaseFormatter<Derived, containerMode, Args...>::operator()(
     p = q + 1;
 
     if (p == end) {
-      throw BadFormatArg("folly::format: '}' at end of format string");
+      throwBadFormatArg("folly::format: '}' at end of format string");
     }
 
     // "{{" -> "{"
@@ -215,7 +216,7 @@ void BaseFormatter<Derived, containerMode, Args...>::operator()(
     // Format string
     q = static_cast<const char*>(memchr(p, '}', size_t(end - p)));
     if (q == nullptr) {
-      throw BadFormatArg("folly::format: missing ending '}'");
+      throwBadFormatArg("folly::format: missing ending '}'");
     }
     FormatArg arg(StringPiece(p, q));
     p = q + 1;
@@ -264,7 +265,7 @@ void BaseFormatter<Derived, containerMode, Args...>::operator()(
     }
 
     if (hasDefaultArgIndex && hasExplicitArgIndex) {
-      throw BadFormatArg(
+      throwBadFormatArg(
           "folly::format: may not have both default and explicit arg indexes");
     }
 
@@ -290,10 +291,10 @@ namespace format_value {
 template <class FormatCallback>
 void formatString(StringPiece val, FormatArg& arg, FormatCallback& cb) {
   if (arg.width != FormatArg::kDefaultWidth && arg.width < 0) {
-    throw BadFormatArg("folly::format: invalid width");
+    throwBadFormatArg("folly::format: invalid width");
   }
   if (arg.precision != FormatArg::kDefaultPrecision && arg.precision < 0) {
-    throw BadFormatArg("folly::format: invalid precision");
+    throwBadFormatArg("folly::format: invalid precision");
   }
 
   if (arg.precision != FormatArg::kDefaultPrecision &&
@@ -931,7 +932,7 @@ template <>
 struct KeyFromStringPiece<fbstring> : public FormatTraitsBase {
   typedef fbstring key_type;
   static fbstring convert(StringPiece s) {
-    return s.toFbstring();
+    return s.to<fbstring>();
   }
 };
 
@@ -950,7 +951,10 @@ struct KeyableTraitsAssoc : public FormatTraitsBase {
   typedef typename T::key_type key_type;
   typedef typename T::value_type::second_type value_type;
   static const value_type& at(const T& map, StringPiece key) {
-    return map.at(KeyFromStringPiece<key_type>::convert(key));
+    if (auto ptr = get_ptr(map, KeyFromStringPiece<key_type>::convert(key))) {
+      return *ptr;
+    }
+    detail::throwFormatKeyNotFoundException(key);
   }
   static const value_type&
   at(const T& map, StringPiece key, const value_type& dflt) {