Demarcate code added due to lack of NSDMI for aggregates
authordbates@webkit.org <dbates@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 25 Aug 2017 23:42:02 +0000 (23:42 +0000)
committerdbates@webkit.org <dbates@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 25 Aug 2017 23:42:02 +0000 (23:42 +0000)
https://bugs.webkit.org/show_bug.cgi?id=175990

Reviewed by Andy Estes.

Source/bmalloc:

* bmalloc/BPlatform.h:
* bmalloc/List.h: Be explicit when initializing m_node to improve readability.
(bmalloc::ListNode::ListNode):

Source/JavaScriptCore:

* domjit/DOMJITEffect.h:
(JSC::DOMJIT::Effect::Effect):
(JSC::DOMJIT::Effect::forWrite):
(JSC::DOMJIT::Effect::forRead):
(JSC::DOMJIT::Effect::forReadWrite):
(JSC::DOMJIT::Effect::forPure):
(JSC::DOMJIT::Effect::forDef):
* runtime/HasOwnPropertyCache.h:
(JSC::HasOwnPropertyCache::Entry::Entry):
(JSC::HasOwnPropertyCache::Entry::operator=): Deleted.
* wasm/WasmFormat.h: Modernize some of the code while I am here. Also
make some comments read well.
(JSC::Wasm::CallableFunction::CallableFunction):
* wasm/js/WebAssemblyFunction.cpp:
(JSC::WebAssemblyFunction::WebAssemblyFunction):
* wasm/js/WebAssemblyWrapperFunction.cpp:
(JSC::WebAssemblyWrapperFunction::create):

Source/WebCore:

* html/canvas/CanvasStyle.h:
* platform/mediastream/IceCandidate.h:
(WebCore::IceCandidate::IceCandidate):
* platform/text/StringWithDirection.h: Replace const String& and String&& constructor
overloads with a single user-defined constructor that takes a String by value to handle
both cases.
(WebCore::StringWithDirection::StringWithDirection):
(WebCore::truncateFromEnd):
* style/StyleUpdate.h:
(WebCore::Style::ElementUpdate::ElementUpdate):
(WebCore::Style::TextUpdate::TextUpdate):

Source/WTF:

* wtf/Compiler.h:

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@221213 268f45cc-cd09-0410-ab3c-d52691b4dbfc

16 files changed:
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/domjit/DOMJITEffect.h
Source/JavaScriptCore/runtime/HasOwnPropertyCache.h
Source/JavaScriptCore/wasm/WasmFormat.h
Source/JavaScriptCore/wasm/js/WebAssemblyFunction.cpp
Source/JavaScriptCore/wasm/js/WebAssemblyWrapperFunction.cpp
Source/WTF/ChangeLog
Source/WTF/wtf/Compiler.h
Source/WebCore/ChangeLog
Source/WebCore/html/canvas/CanvasStyle.h
Source/WebCore/platform/mediastream/IceCandidate.h
Source/WebCore/platform/text/StringWithDirection.h
Source/WebCore/style/StyleUpdate.h
Source/bmalloc/ChangeLog
Source/bmalloc/bmalloc/BPlatform.h
Source/bmalloc/bmalloc/List.h

index 25ba7d9..fe7469f 100644 (file)
@@ -1,3 +1,28 @@
+2017-08-25  Daniel Bates  <dabates@apple.com>
+
+        Demarcate code added due to lack of NSDMI for aggregates
+        https://bugs.webkit.org/show_bug.cgi?id=175990
+
+        Reviewed by Andy Estes.
+
+        * domjit/DOMJITEffect.h:
+        (JSC::DOMJIT::Effect::Effect):
+        (JSC::DOMJIT::Effect::forWrite):
+        (JSC::DOMJIT::Effect::forRead):
+        (JSC::DOMJIT::Effect::forReadWrite):
+        (JSC::DOMJIT::Effect::forPure):
+        (JSC::DOMJIT::Effect::forDef):
+        * runtime/HasOwnPropertyCache.h:
+        (JSC::HasOwnPropertyCache::Entry::Entry):
+        (JSC::HasOwnPropertyCache::Entry::operator=): Deleted.
+        * wasm/WasmFormat.h: Modernize some of the code while I am here. Also
+        make some comments read well.
+        (JSC::Wasm::CallableFunction::CallableFunction):
+        * wasm/js/WebAssemblyFunction.cpp:
+        (JSC::WebAssemblyFunction::WebAssemblyFunction):
+        * wasm/js/WebAssemblyWrapperFunction.cpp:
+        (JSC::WebAssemblyWrapperFunction::create):
+
 2017-08-25  Saam Barati  <sbarati@apple.com>
 
         Unreviewed. Fix 32-bit after r221196
 2017-08-25  Saam Barati  <sbarati@apple.com>
 
         Unreviewed. Fix 32-bit after r221196
index 402a459..2ac764f 100644 (file)
 
 namespace JSC { namespace DOMJIT {
 
 
 namespace JSC { namespace DOMJIT {
 
-class Effect {
-public:
-    HeapRange reads { HeapRange::top() };
-    HeapRange writes { HeapRange::top() };
-    HeapRange def { HeapRange::top() };
-
+struct Effect {
+#if !COMPILER_SUPPORTS(NSDMI_FOR_AGGREGATES)
     constexpr Effect() = default;
     constexpr Effect(HeapRange reads, HeapRange writes)
     constexpr Effect() = default;
     constexpr Effect(HeapRange reads, HeapRange writes)
-        : reads(reads)
-        , writes(writes)
+        : reads { reads }
+        , writes { writes }
     {
     }
     {
     }
-
     constexpr Effect(HeapRange reads, HeapRange writes, HeapRange def)
     constexpr Effect(HeapRange reads, HeapRange writes, HeapRange def)
-        : reads(reads)
-        , writes(writes)
-        , def(def)
+        : reads { reads }
+        , writes { writes }
+        , def { def }
     {
     }
     {
     }
+#endif
 
     constexpr static Effect forWrite(HeapRange writeRange)
     {
 
     constexpr static Effect forWrite(HeapRange writeRange)
     {
-        return Effect(HeapRange::none(), writeRange);
+        return { HeapRange::none(), writeRange };
     }
 
     constexpr static Effect forRead(HeapRange readRange)
     {
     }
 
     constexpr static Effect forRead(HeapRange readRange)
     {
-        return Effect(readRange, HeapRange::none());
+        return { readRange, HeapRange::none() };
     }
 
     constexpr static Effect forReadWrite(HeapRange readRange, HeapRange writeRange)
     {
     }
 
     constexpr static Effect forReadWrite(HeapRange readRange, HeapRange writeRange)
     {
-        return Effect(readRange, writeRange);
+        return { readRange, writeRange };
     }
 
     constexpr static Effect forPure()
     {
     }
 
     constexpr static Effect forPure()
     {
-        return Effect(HeapRange::none(), HeapRange::none(), HeapRange::none());
+        return { HeapRange::none(), HeapRange::none(), HeapRange::none() };
     }
 
     constexpr static Effect forDef(HeapRange def)
     {
     }
 
     constexpr static Effect forDef(HeapRange def)
     {
-        return Effect(def, HeapRange::none(), def);
+        return { def, HeapRange::none(), def };
     }
 
     constexpr static Effect forDef(HeapRange def, HeapRange readRange, HeapRange writeRange)
     {
     }
 
     constexpr static Effect forDef(HeapRange def, HeapRange readRange, HeapRange writeRange)
     {
-        return Effect(readRange, writeRange, def);
+        return { readRange, writeRange, def };
     }
 
     constexpr bool mustGenerate() const
     {
         return !!writes;
     }
     }
 
     constexpr bool mustGenerate() const
     {
         return !!writes;
     }
+
+    HeapRange reads { HeapRange::top() };
+    HeapRange writes { HeapRange::top() };
+    HeapRange def { HeapRange::top() };
 };
 
 } }
 };
 
 } }
index 3f0aaa0..7627516 100644 (file)
@@ -42,23 +42,19 @@ public:
         static ptrdiff_t offsetOfImpl() { return OBJECT_OFFSETOF(Entry, impl); }
         static ptrdiff_t offsetOfResult() { return OBJECT_OFFSETOF(Entry, result); }
 
         static ptrdiff_t offsetOfImpl() { return OBJECT_OFFSETOF(Entry, impl); }
         static ptrdiff_t offsetOfResult() { return OBJECT_OFFSETOF(Entry, result); }
 
+#if !COMPILER_SUPPORTS(NSDMI_FOR_AGGREGATES)
         Entry() = default;
         Entry() = default;
-
         Entry(RefPtr<UniquedStringImpl>&& impl, StructureID structureID, bool result)
         Entry(RefPtr<UniquedStringImpl>&& impl, StructureID structureID, bool result)
-            : impl(WTFMove(impl))
-            , structureID(structureID)
-            , result(result)
-        { }
-
-        Entry& operator=(Entry&& other)
+            : impl { WTFMove(impl) }
+            , structureID { structureID }
+            , result { result }
         {
         {
-            impl = WTFMove(other.impl);
-            structureID = other.structureID;
-            result = other.result;
-            return *this;
         }
 
         }
 
-        RefPtr<UniquedStringImpl> impl { };
+        Entry& operator=(Entry&& other) = default;
+#endif
+
+        RefPtr<UniquedStringImpl> impl;
         StructureID structureID { 0 };
         bool result { false };
     };
         StructureID structureID { 0 };
         bool result { false };
     };
index cc65971..b222217 100644 (file)
@@ -282,26 +282,28 @@ struct WasmExitStubs {
     MacroAssemblerCodeRef wasmToWasm;
 };
 
     MacroAssemblerCodeRef wasmToWasm;
 };
 
-typedef void** WasmEntrypointLoadLocation;
+using WasmEntrypointLoadLocation = void**;
 
 
-// WebAssembly direct calls and call_indirect use indices into "function index space". This space starts with all imports, and then all internal functions.
-// CallableFunction and FunctionIndexSpace are only meant as fast lookup tables for these opcodes, and do not own code.
+// WebAssembly direct calls and call_indirect use indices into "function index space". This space starts
+// with all imports, and then all internal functions. CallableFunction and FunctionIndexSpace are only
+// meant as fast lookup tables for these opcodes and do not own code.
 struct CallableFunction {
 struct CallableFunction {
+#if !COMPILER_SUPPORTS(NSDMI_FOR_AGGREGATES)
     CallableFunction() = default;
     CallableFunction() = default;
-
     CallableFunction(SignatureIndex signatureIndex, WasmEntrypointLoadLocation code = nullptr)
     CallableFunction(SignatureIndex signatureIndex, WasmEntrypointLoadLocation code = nullptr)
-        : signatureIndex(signatureIndex)
-        , code(code)
+        : signatureIndex { signatureIndex }
+        , code { code }
     {
     }
     {
     }
+#endif
 
     static ptrdiff_t offsetOfWasmEntrypointLoadLocation() { return OBJECT_OFFSETOF(CallableFunction, code); }
 
 
     static ptrdiff_t offsetOfWasmEntrypointLoadLocation() { return OBJECT_OFFSETOF(CallableFunction, code); }
 
-    // FIXME pack the SignatureIndex and the code pointer into one 64-bit value. https://bugs.webkit.org/show_bug.cgi?id=165511
+    // FIXME: Pack signature index and code pointer into one 64-bit value. See <https://bugs.webkit.org/show_bug.cgi?id=165511>.
     SignatureIndex signatureIndex { Signature::invalidIndex };
     WasmEntrypointLoadLocation code { nullptr };
 };
     SignatureIndex signatureIndex { Signature::invalidIndex };
     WasmEntrypointLoadLocation code { nullptr };
 };
-typedef Vector<CallableFunction> FunctionIndexSpace;
+using FunctionIndexSpace = Vector<CallableFunction>;
 
 } } // namespace JSC::Wasm
 
 
 } } // namespace JSC::Wasm
 
index 8605b0a..0d27765 100644 (file)
@@ -190,9 +190,9 @@ Structure* WebAssemblyFunction::createStructure(VM& vm, JSGlobalObject* globalOb
 }
 
 WebAssemblyFunction::WebAssemblyFunction(VM& vm, JSGlobalObject* globalObject, Structure* structure, Wasm::Callee& jsEntrypoint, Wasm::WasmEntrypointLoadLocation wasmEntrypoint, Wasm::SignatureIndex signatureIndex)
 }
 
 WebAssemblyFunction::WebAssemblyFunction(VM& vm, JSGlobalObject* globalObject, Structure* structure, Wasm::Callee& jsEntrypoint, Wasm::WasmEntrypointLoadLocation wasmEntrypoint, Wasm::SignatureIndex signatureIndex)
-    : Base(vm, globalObject, structure)
-    , m_jsEntrypoint(jsEntrypoint.entrypoint())
-    , m_wasmFunction(Wasm::CallableFunction(signatureIndex, wasmEntrypoint))
+    : Base { vm, globalObject, structure }
+    , m_jsEntrypoint { jsEntrypoint.entrypoint() }
+    , m_wasmFunction { signatureIndex, wasmEntrypoint }
 { }
 
 } // namespace JSC
 { }
 
 } // namespace JSC
index 4a84232..021c618 100644 (file)
@@ -63,7 +63,7 @@ WebAssemblyWrapperFunction* WebAssemblyWrapperFunction::create(VM& vm, JSGlobalO
     ASSERT_WITH_MESSAGE(!function->inherits(vm, WebAssemblyWrapperFunction::info()), "We should never double wrap a wrapper function.");
     String name = "";
     NativeExecutable* executable = vm.getHostFunction(callWebAssemblyWrapperFunction, NoIntrinsic, callHostFunctionAsConstructor, nullptr, name);
     ASSERT_WITH_MESSAGE(!function->inherits(vm, WebAssemblyWrapperFunction::info()), "We should never double wrap a wrapper function.");
     String name = "";
     NativeExecutable* executable = vm.getHostFunction(callWebAssemblyWrapperFunction, NoIntrinsic, callHostFunctionAsConstructor, nullptr, name);
-    WebAssemblyWrapperFunction* result = new (NotNull, allocateCell<WebAssemblyWrapperFunction>(vm.heap)) WebAssemblyWrapperFunction(vm, globalObject, globalObject->webAssemblyWrapperFunctionStructure(), Wasm::CallableFunction(signatureIndex, instance->codeBlock()->wasmToJsCallStubForImport(importIndex)));
+    WebAssemblyWrapperFunction* result = new (NotNull, allocateCell<WebAssemblyWrapperFunction>(vm.heap)) WebAssemblyWrapperFunction(vm, globalObject, globalObject->webAssemblyWrapperFunctionStructure(), { signatureIndex, instance->codeBlock()->wasmToJsCallStubForImport(importIndex) });
     const Wasm::Signature& signature = Wasm::SignatureInformation::get(signatureIndex);
     result->finishCreation(vm, executable, signature.argumentCount(), name, function, instance);
     return result;
     const Wasm::Signature& signature = Wasm::SignatureInformation::get(signatureIndex);
     result->finishCreation(vm, executable, signature.argumentCount(), name, function, instance);
     return result;
index 6edb1dd..198f904 100644 (file)
@@ -1,3 +1,12 @@
+2017-08-25  Daniel Bates  <dabates@apple.com>
+
+        Demarcate code added due to lack of NSDMI for aggregates
+        https://bugs.webkit.org/show_bug.cgi?id=175990
+
+        Reviewed by Andy Estes.
+
+        * wtf/Compiler.h:
+
 2017-08-25  Don Olmstead  <don.olmstead@sony.com>
 
         Define *_GIGACAGE_MASK when Gigacage is not supported
 2017-08-25  Don Olmstead  <don.olmstead@sony.com>
 
         Define *_GIGACAGE_MASK when Gigacage is not supported
index 3d35bfe..4066eb8 100644 (file)
 #define WTF_COMPILER_SUPPORTS_EABI 1
 #endif
 
 #define WTF_COMPILER_SUPPORTS_EABI 1
 #endif
 
+/* Non-static data member initializer (NSDMI) for aggregates */
+
+#if defined(__cpp_aggregate_nsdmi) && __cpp_aggregate_nsdmi >= 201304
+#define WTF_COMPILER_SUPPORTS_NSDMI_FOR_AGGREGATES 1
+#endif
+
 /* RELAXED_CONSTEXPR */
 
 #if defined(__cpp_constexpr) && __cpp_constexpr >= 201304
 /* RELAXED_CONSTEXPR */
 
 #if defined(__cpp_constexpr) && __cpp_constexpr >= 201304
index a8ece6a..9d840ed 100644 (file)
@@ -1,5 +1,24 @@
 2017-08-25  Daniel Bates  <dabates@apple.com>
 
 2017-08-25  Daniel Bates  <dabates@apple.com>
 
+        Demarcate code added due to lack of NSDMI for aggregates
+        https://bugs.webkit.org/show_bug.cgi?id=175990
+
+        Reviewed by Andy Estes.
+
+        * html/canvas/CanvasStyle.h:
+        * platform/mediastream/IceCandidate.h:
+        (WebCore::IceCandidate::IceCandidate):
+        * platform/text/StringWithDirection.h: Replace const String& and String&& constructor
+        overloads with a single user-defined constructor that takes a String by value to handle
+        both cases.
+        (WebCore::StringWithDirection::StringWithDirection):
+        (WebCore::truncateFromEnd):
+        * style/StyleUpdate.h:
+        (WebCore::Style::ElementUpdate::ElementUpdate):
+        (WebCore::Style::TextUpdate::TextUpdate):
+
+2017-08-25  Daniel Bates  <dabates@apple.com>
+
         InlineTextBox::paintDocumentMarker() does not need to special case painting of grammar and
         dictation alternatives
         https://bugs.webkit.org/show_bug.cgi?id=175966
         InlineTextBox::paintDocumentMarker() does not need to special case painting of grammar and
         dictation alternatives
         https://bugs.webkit.org/show_bug.cgi?id=175966
index 09ba2ff..5c1b8eb 100644 (file)
@@ -70,12 +70,13 @@ private:
     struct Invalid { };
 
     struct CMYKAColor {
     struct Invalid { };
 
     struct CMYKAColor {
+#if !COMPILER_SUPPORTS(NSDMI_FOR_AGGREGATES)
         CMYKAColor() = default;
         CMYKAColor() = default;
-
         CMYKAColor(Color color, float cyan, float magenta, float yellow, float black, float alpha)
             : color(color), c(cyan), m(magenta), y(yellow), k(black), a(alpha)
         {
         }
         CMYKAColor(Color color, float cyan, float magenta, float yellow, float black, float alpha)
             : color(color), c(cyan), m(magenta), y(yellow), k(black), a(alpha)
         {
         }
+#endif
 
         Color color;
         float c { 0 };
 
         Color color;
         float c { 0 };
index 2b28c37..e302a1d 100644 (file)
 namespace WebCore {
 
 struct IceCandidate {
 namespace WebCore {
 
 struct IceCandidate {
+#if !COMPILER_SUPPORTS(NSDMI_FOR_AGGREGATES)
+    IceCandidate() = default;
+    IceCandidate(String&& type, String&& foundation, unsigned componentId, String&& transport, unsigned long priority, String&& address, unsigned port, String&& tcpType, String&& relatedAddress, unsigned relatedPort)
+        : type { WTFMove(type) }
+        , foundation { WTFMove(foundation) }
+        , componentId { componentId }
+        , transport { WTFMove(transport) }
+        , priority { priority }
+        , address { WTFMove(address) }
+        , port { port }
+        , tcpType { WTFMove(tcpType) }
+        , relatedAddress { WTFMove(relatedAddress) }
+        , relatedPort { relatedPort }
+    {
+    }
+#endif
+
     String type;
     String foundation;
     unsigned componentId { 0 };
     String type;
     String foundation;
     unsigned componentId { 0 };
@@ -47,20 +64,6 @@ struct IceCandidate {
     String tcpType;
     String relatedAddress;
     unsigned relatedPort { 0 };
     String tcpType;
     String relatedAddress;
     unsigned relatedPort { 0 };
-
-    IceCandidate() = default;
-    IceCandidate(String&& type, String&& foundation, unsigned componentId, String&& transport, unsigned long priority, String&& address, unsigned port, String&& tcpType, String&& relatedAddress, unsigned relatedPort)
-        : type(WTFMove(type))
-        , foundation(WTFMove(foundation))
-        , componentId(componentId)
-        , transport(WTFMove(transport))
-        , priority(priority)
-        , address(WTFMove(address))
-        , port(port)
-        , tcpType(WTFMove(tcpType))
-        , relatedAddress(WTFMove(relatedAddress))
-        , relatedPort(relatedPort)
-    { }
 };
 
 } // namespace WebCore
 };
 
 } // namespace WebCore
index 6dc87d7..4727a9f 100644 (file)
@@ -46,9 +46,14 @@ namespace WebCore {
 // to the string.
 
 struct StringWithDirection {
 // to the string.
 
 struct StringWithDirection {
+#if !COMPILER_SUPPORTS(NSDMI_FOR_AGGREGATES)
     StringWithDirection() = default;
     StringWithDirection() = default;
-    StringWithDirection(const String& string, TextDirection direction) : string { string }, direction { direction } { }
-    StringWithDirection(String&& string, TextDirection direction) : string { WTFMove(string) }, direction { direction } { }
+    StringWithDirection(String string, TextDirection direction)
+        : string { WTFMove(string) }
+        , direction { direction }
+    {
+    }
+#endif
     String string;
     TextDirection direction { LTR };
 };
     String string;
     TextDirection direction { LTR };
 };
@@ -66,8 +71,8 @@ inline bool operator!=(const StringWithDirection& a, const StringWithDirection&
 inline StringWithDirection truncateFromEnd(const StringWithDirection& string, unsigned maxLength)
 {
     if (string.direction == LTR)
 inline StringWithDirection truncateFromEnd(const StringWithDirection& string, unsigned maxLength)
 {
     if (string.direction == LTR)
-        return StringWithDirection(string.string.left(maxLength), LTR);
-    return StringWithDirection(string.string.right(maxLength), RTL);
+        return { string.string.left(maxLength), LTR };
+    return { string.string.right(maxLength), RTL };
 }
 
 }
 }
 
 }
index 708155d..bbfa242 100644 (file)
@@ -43,23 +43,29 @@ class Text;
 namespace Style {
 
 struct ElementUpdate {
 namespace Style {
 
 struct ElementUpdate {
+#if !COMPILER_SUPPORTS(NSDMI_FOR_AGGREGATES)
     ElementUpdate() = default;
     ElementUpdate(std::unique_ptr<RenderStyle> style, Change change, bool recompositeLayer)
     ElementUpdate() = default;
     ElementUpdate(std::unique_ptr<RenderStyle> style, Change change, bool recompositeLayer)
-        : style(WTFMove(style))
-        , change(change)
-        , recompositeLayer(recompositeLayer)
-    { }
+        : style { WTFMove(style) }
+        , change { change }
+        , recompositeLayer { recompositeLayer }
+    {
+    }
+#endif
     std::unique_ptr<RenderStyle> style;
     Change change { NoChange };
     bool recompositeLayer { false };
 };
 
 struct TextUpdate {
     std::unique_ptr<RenderStyle> style;
     Change change { NoChange };
     bool recompositeLayer { false };
 };
 
 struct TextUpdate {
+#if !COMPILER_SUPPORTS(NSDMI_FOR_AGGREGATES)
     TextUpdate() = default;
     TextUpdate(unsigned offset, unsigned length)
     TextUpdate() = default;
     TextUpdate(unsigned offset, unsigned length)
-        : offset(offset)
-        , length(length)
-    { }
+        : offset { offset }
+        , length { length }
+    {
+    }
+#endif
 
     unsigned offset { 0 };
     unsigned length { std::numeric_limits<unsigned>::max() };
 
     unsigned offset { 0 };
     unsigned length { std::numeric_limits<unsigned>::max() };
index 67e5117..79e8c22 100644 (file)
@@ -1,3 +1,14 @@
+2017-08-25  Daniel Bates  <dabates@apple.com>
+
+        Demarcate code added due to lack of NSDMI for aggregates
+        https://bugs.webkit.org/show_bug.cgi?id=175990
+
+        Reviewed by Andy Estes.
+
+        * bmalloc/BPlatform.h:
+        * bmalloc/List.h: Be explicit when initializing m_node to improve readability.
+        (bmalloc::ListNode::ListNode):
+
 2017-08-23  Filip Pizlo  <fpizlo@apple.com>
 
         Reduce Gigacage sizes
 2017-08-23  Filip Pizlo  <fpizlo@apple.com>
 
         Reduce Gigacage sizes
index 5fa9ef4..e44bcb3 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (C) 2014 Apple Inc. All rights reserved.
+ * Copyright (C) 2014-2017 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
 /* BUSE() - use a particular third-party library or optional OS service */
 #define BUSE(FEATURE) (defined BUSE_##FEATURE && BUSE_##FEATURE)
 
 /* BUSE() - use a particular third-party library or optional OS service */
 #define BUSE(FEATURE) (defined BUSE_##FEATURE && BUSE_##FEATURE)
 
+/* ==== Compiler adaptation macros: these describe the capabilities of the compiler. ==== */
+
+/* BCOMPILER_SUPPORTS() - check for a compiler feature */
+#define BCOMPILER_SUPPORTS(FEATURE) (defined BCOMPILER_SUPPORTS_##FEATURE && BCOMPILER_SUPPORTS_##FEATURE)
+
+/* BCOMPILER_SUPPORTS(NSDMI_FOR_AGGREGATES) - compiler supports non-static data member initializers for aggregates */
+#if defined(__cpp_aggregate_nsdmi) && __cpp_aggregate_nsdmi >= 201304
+#define BCOMPILER_SUPPORTS_NSDMI_FOR_AGGREGATES 1
+#endif
+
 /* ==== Platform adaptation macros: these describe properties of the target environment. ==== */
 
 /* BCPU() - the target CPU architecture */
 /* ==== Platform adaptation macros: these describe properties of the target environment. ==== */
 
 /* BCPU() - the target CPU architecture */
index 8de7e47..48173c8 100644 (file)
@@ -30,12 +30,14 @@ namespace bmalloc {
 
 template<typename T>
 struct ListNode {
 
 template<typename T>
 struct ListNode {
+#if !BCOMPILER_SUPPORTS(NSDMI_FOR_AGGREGATES)
     ListNode() = default;
     ListNode(ListNode<T>* prev, ListNode<T>* next)
     ListNode() = default;
     ListNode(ListNode<T>* prev, ListNode<T>* next)
-        : prev(prev)
-        , next(next)
+        : prev { prev }
+        , next { next }
     {
     }
     {
     }
+#endif
 
     ListNode<T>* prev { nullptr };
     ListNode<T>* next { nullptr };
 
     ListNode<T>* prev { nullptr };
     ListNode<T>* next { nullptr };
@@ -46,11 +48,13 @@ class List {
     static_assert(std::is_trivially_destructible<T>::value, "List must have a trivial destructor.");
 
     struct iterator {
     static_assert(std::is_trivially_destructible<T>::value, "List must have a trivial destructor.");
 
     struct iterator {
+#if !BCOMPILER_SUPPORTS(NSDMI_FOR_AGGREGATES)
         iterator() = default;
         iterator(ListNode<T>* node)
             : m_node(node)
         {
         }
         iterator() = default;
         iterator(ListNode<T>* node)
             : m_node(node)
         {
         }
+#endif
 
         T* operator*() { return static_cast<T*>(m_node); }
         T* operator->() { return static_cast<T*>(m_node); }
 
         T* operator*() { return static_cast<T*>(m_node); }
         T* operator->() { return static_cast<T*>(m_node); }
@@ -63,7 +67,7 @@ class List {
             return *this;
         }
         
             return *this;
         }
         
-        ListNode<T>* m_node { };
+        ListNode<T>* m_node { nullptr };
     };
 
 public:
     };
 
 public: