Commit b939def1 authored by Yedidya Feldblum's avatar Yedidya Feldblum Committed by Facebook Github Bot 1

Avoid std::initializer_list ctor in folly::dynamic::array

Summary:
[Folly] Avoid `std::initializer_list` ctor in `folly::dynamic::array`.

This will help deprecate the dangerous initializer-list constructor. The init-list construction is dangerous because its semantics vary by compiler and by compiler version.

Reviewed By: ot

Differential Revision: D3333148

fbshipit-source-id: 031e7593b7e28b299d5eeeb5ce7aed9216dd3a5c
parent 0f76e090
...@@ -209,8 +209,7 @@ inline void dynamic::array(EmptyArrayTag) {} ...@@ -209,8 +209,7 @@ inline void dynamic::array(EmptyArrayTag) {}
template <class... Args> template <class... Args>
inline dynamic dynamic::array(Args&& ...args) { inline dynamic dynamic::array(Args&& ...args) {
return dynamic(std::initializer_list<dynamic>{std::forward<Args>(args)...}, return dynamic(Array{std::forward<Args>(args)...}, PrivateTag());
PrivateTag());
} }
// This looks like a case for perfect forwarding, but our use of // This looks like a case for perfect forwarding, but our use of
...@@ -308,17 +307,10 @@ inline dynamic::dynamic(std::string&& s) : type_(STRING) { ...@@ -308,17 +307,10 @@ inline dynamic::dynamic(std::string&& s) : type_(STRING) {
} }
inline dynamic::dynamic(std::initializer_list<dynamic> il) inline dynamic::dynamic(std::initializer_list<dynamic> il)
: dynamic(std::move(il), PrivateTag()) { : dynamic(Array(std::move(il)), PrivateTag()) {}
}
inline dynamic::dynamic(std::initializer_list<dynamic> il, PrivateTag)
: type_(ARRAY)
{
new (&u_.array) Array(il.begin(), il.end());
}
inline dynamic& dynamic::operator=(std::initializer_list<dynamic> il) { inline dynamic& dynamic::operator=(std::initializer_list<dynamic> il) {
(*this) = dynamic(il, PrivateTag()); (*this) = dynamic(Array(std::move(il)), PrivateTag());
return *this; return *this;
} }
...@@ -668,6 +660,10 @@ inline void dynamic::pop_back() { ...@@ -668,6 +660,10 @@ inline void dynamic::pop_back() {
////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////
inline dynamic::dynamic(Array&& r, PrivateTag) : type_(ARRAY) {
new (&u_.array) Array(std::move(r));
}
#define FOLLY_DYNAMIC_DEC_TYPEINFO(T, str, val) \ #define FOLLY_DYNAMIC_DEC_TYPEINFO(T, str, val) \
template <> struct dynamic::TypeInfo<T> { \ template <> struct dynamic::TypeInfo<T> { \
static constexpr const char* name = str; \ static constexpr const char* name = str; \
......
...@@ -179,7 +179,6 @@ public: ...@@ -179,7 +179,6 @@ public:
FOLLY_DEPRECATED( FOLLY_DEPRECATED(
"Initializer list syntax is deprecated (#10300209). Use dynamic::array.") "Initializer list syntax is deprecated (#10300209). Use dynamic::array.")
/* implicit */ dynamic(std::initializer_list<dynamic> il); /* implicit */ dynamic(std::initializer_list<dynamic> il);
dynamic(std::initializer_list<dynamic> il, PrivateTag);
FOLLY_DEPRECATED( FOLLY_DEPRECATED(
"Initializer list syntax is deprecated (#10300209). Use dynamic::array.") "Initializer list syntax is deprecated (#10300209). Use dynamic::array.")
dynamic& operator=(std::initializer_list<dynamic> il); dynamic& operator=(std::initializer_list<dynamic> il);
...@@ -536,6 +535,8 @@ private: ...@@ -536,6 +535,8 @@ private:
template<class T> struct GetAddrImpl; template<class T> struct GetAddrImpl;
template<class T> struct PrintImpl; template<class T> struct PrintImpl;
dynamic(Array&& array, PrivateTag);
template<class T> T const& get() const; template<class T> T const& get() const;
template<class T> T& get(); template<class T> T& get();
template<class T> T* get_nothrow() & noexcept; template<class T> T* get_nothrow() & noexcept;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment