Use new __traits(isZeroInit) to check for a null initializer at compile time instead of runtime
This commit is contained in:
		@@ -89,13 +89,20 @@ do
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        static if (hasElaborateCopyConstructor!T || hasElaborateDestructor!T)
 | 
					        static if (hasElaborateCopyConstructor!T || hasElaborateDestructor!T)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            if (typeid(T).initializer().ptr is null)
 | 
					            static if (__VERSION__ >= 2083) // __traits(isZeroInit) available.
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                deinitialize!true(source);
 | 
					                deinitialize!(__traits(isZeroInit, T))(source);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            else
 | 
					            else
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                deinitialize!false(source);
 | 
					                if (typeid(T).initializer().ptr is null)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    deinitialize!true(source);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                else
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    deinitialize!false(source);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -185,8 +185,16 @@ out(result; memory.ptr is result)
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
        else
 | 
					        else
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            static const T init = T.init;
 | 
					            static if (__VERSION__ >= 2083 // __traits(isZeroInit) available.
 | 
				
			||||||
            trustedCopy(init);
 | 
					                && __traits(isZeroInit, T))
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                (() @trusted => memory.ptr[0 .. T.sizeof])().fill!0;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                static immutable T init = T.init;
 | 
				
			||||||
 | 
					                trustedCopy(init);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        result.__ctor(args);
 | 
					        result.__ctor(args);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user