swift
af8115ff - Hop to the current isolation properly in delegating async actor initializers.

Commit
360 days ago
Hop to the current isolation properly in delegating async actor initializers. This requires two major changes. The first is that we need to teach SILGen that the isolation of an initializer is essentially dynamic (as far as SILGen is concerned) --- that it needs to emit code in order to get the isolation reference. To make this work, I needed to refactor how we store the expected executor of a function so that it's not always a constant value; instead, we'll need to emit code that DI will lower properly. Fortunately, I can largely build on top of the work that Doug previously did to support #isolation in these functions. The SIL we emit here around delegating initializer calls is not ideal --- the breadcrumb hop ends up jumping to the generic executor, and then DI actually emits the hop to the actor. This is a little silly, but it's hard to eliminate without special-casing the self-rebinding, which honestly we should consider rather than the weirdly global handling of that in SILGen today. The optimizer should eliminate this hop pretty reliably, at least. The second is that we need to teach DI to handle the pattern of code we get in delegating initializers, where the builtin actually has to be passed the self var rather than a class reference. This is because we don't *have* a class reference that's consistently correct in these cases. This ended up being a fairly straightforward generalization. I also taught the hop_to_executor optimizer to skip over the initialization of the default-actor header; there are a lot of simple cases where we still do emit the prologue generic-executor hop, but at least the most trivial case is handled. To do this better, we'd need to teach this bit of the optimizer that the properties of self can be stored to in an initializer prior to the object having escaped, and we don't have that information easily at hand, I think. Fixes rdar://87485045.
Author
Parents
Loading