> On Nov 1, 2016, at 11:00 AM, Jordan Rose <jordan_r...@apple.com> wrote:
> 
> I like the idea; it makes more sense to me than our current model (which 
> feels more like a plain callback than a continuation to me). Some things that 
> occurred to me when reading this:
> 
> - This seems like it'll be much simpler to check for invalid concurrent 
> access to the same location (inout violations) in debug builds. (I don't 
> think it's actually any more or less possible, but it is simpler.)
> 
> - This will look funny but work fine for multiple inout parameters: foo(&x, 
> &y)
> 
> - OTOH, this does break up basic blocks in the caller context, making LLVM 
> analysis less effective. Since the materializeForSet calls were already 
> either inlined or opaque, though, we're probably fine there.

True. John mentioned that LLVM has grown some support for subfunction 
extraction in support of C++1z coroutines; we might be able to leverage that so 
that the IR still looks materializeForSet-ish even though we lower things 
differently.

> - Does this help us with the nested dictionary CoW problem? 
> `foo["bar"]["baz"] += 1`

I think the dictionary problem can be addressed in either implementation model, 
if we open up the language to express generalized "mutators" instead of just 
special-cased addressors. With strict enforcement of `inout`, the dictionary 
implementation would have the worst-case freedom to move an indexed value into 
a temporary without copying it, and move it back at the end of the access, if 
we're unable to otherwise represent it entirely as an in-place operation.

-Joe
_______________________________________________
swift-dev mailing list
swift-dev@swift.org
https://lists.swift.org/mailman/listinfo/swift-dev

Reply via email to