[swift-dev] Definite initialization implementation for property behaviors

Chris Lattner clattner at apple.com
Wed Mar 2 11:55:44 CST 2016


> On Mar 2, 2016, at 9:24 AM, Joe Groff <jgroff at apple.com> wrote:
> 
> Hey Chris (and interested onlookers). I wanted your feedback on how to handle definite initialization with property behaviors. Behavior properties behave a lot like computed properties, so it's tricky to track their initialization behavior with our traditional storage-based analysis. For initialization purposes, the behavior property acts kind of like a proxy for the instantiated storage from the behavior declaration. For instance, if you have an `NSCopying` behavior, then an assignment that initializes the behavior property should trigger the `init` logic for the underlying storage, invoking `.copy()` on the initial value. I'm thinking we can represent this in raw SIL with a `mark_uninitialized_behavior` instruction that abstractly represents the behavior property,

This makes sense to me.  

> with references to its storage and its initialization/setter logic:
> 
>  // Build references to the behavior's initializer and setter
>  %init = function_ref @NSCopying.init
>  %set = function_ref @NSCopying.set
>  // Get the address of the storage
>  %storage = ref_element_addr %self, #Type.property.[NSCopying].storage
>  // Build the initialization marker
>  %property = mark_uninitialized_behavior %self, %storage, init %init, set %set

Ah, I see why you can’t reuse the existing mark_uninitialized instruction with another mode.  I agree with adding a new mark_uninitialized_behavior instruction, this is a very clever way to handle this!

>  ...
>  // Initialization
>  assign %a to %property
>  // Reassignment
>  assign %b to %property
> 
> DI would then turn `assign`-ments that initialize %property into `apply %init(%storage)`, and reassignments into `apply %set(%self)`. Does that seem like a reasonable implementation approach?

It does!  Very nice,

-Chris


More information about the swift-dev mailing list