Commits

Andrew Trick committed 4c052274e64
Introduce @_specialize(<type list>) internal attribute. This attribute can be attached to generic functions. The attribute's arguments must be a list of concrete types to be substituted in the function's generic signature. Any number of specializations may be associated with a generic function. This attribute provides a hint to the compiler. At -O, the compiler will generate the specified specializations and emit calls to the specialized code in the original generic function guarded by type checks. The current attribute is designed to be an internal tool for performance experimentation. It does not affect the language or API. This work may be extended in the future to add user-visible attributes that do provide API guarantees and/or direct dispatch to specialized code. This attribute works on any generic function: a freestanding function with generic type parameters, a nongeneric method declared in a generic class, a generic method in a nongeneric class or a generic method in a generic class. A function's generic signature is a concatenation of the generic context and the function's own generic type parameters. e.g. struct S<T> { var x: T @_specialize(Int, Float) mutating func exchangeSecond<U>(u: U, _ t: T) -> (U, T) { x = t return (u, x) } } // Substitutes: <T, U> with <Int, Float> producing: // S<Int>::exchangeSecond<Float>(u: Float, t: Int) -> (Float, Int)