[Swift-devel] Changes to array closing semantics?
Mihael Hategan
hategan at mcs.anl.gov
Wed Nov 21 15:51:55 CST 2012
On Wed, 2012-11-21 at 12:12 -0700, Justin M Wozniak wrote:
> I don't think this is currently an issue in the Swift/T implementation
> but I can check. In Swift/T, we have the restriction that you cannot
> assign to an array A=f() and also do piecemeal assignments A[i]=g() .
> We do track potential write accesses to arrays to keep them open until
> there are no more possible writes.
>
> http://www.mcs.anl.gov/exm/local/guides/swift.html#_arrays
That restriction should also be in swift/k, and I don't think it is.
There is a problem with the current implementation. It fails to properly
execute the following code:
int[] a;
if (true) {
if (true) {
a[0] = 1;
}
else {
a[0] = 2;
}
f(a);
}
This is because a is closed in the scope in which it's declared, but
that won't be done until f(a) completes, which it can't because a is not
closed. That needs fixing. An additional complexity is that the
following should also be allowed and function correctly:
int[] a;
if (true) {
if (condition) {
a[0] = 1;
}
f(a);
}
There's also the issue of:
int[] a;
foreach i in [0:10] {
a[i] = 1;
f(a);
}
That shouldn't be allowed. It is, and it leads to a deadlock.
There are some subtleties:
int[] a;
if (true) {
foreach i in [0:10] {
if (true) {
a[i] = 0;
}
else {
a[i] = 1;
}
}
f(a);
}
Closing of a can only happen after the foreach is done.
All these cases need to be correctly handled by the compiler, and I
think none of them are.
More information about the Swift-devel
mailing list