Generalize storage implementations to support generalized accessors.

The storage kind has been replaced with three separate "impl kinds",
one for each of the basic access kinds (read, write, and read/write).
This makes it far easier to mix-and-match implementations of different
accessors, as well as subtleties like implementing both a setter
and an independent read/write operation.

AccessStrategy has become a bit more explicit about how exactly the
access should be implemented.  For example, the accessor-based kinds
now carry the exact accessor intended to be used.  Also, I've shifted
responsibilities slightly between AccessStrategy and AccessSemantics
so that AccessSemantics::Ordinary can be used except in the sorts of
semantic-bypasses that accessor synthesis wants.  This requires
knowing the correct DC of the access when computing the access strategy;
the upshot is that SILGenFunction now needs a DC.

Accessor synthesis has been reworked so that only the declarations are
built immediately; body synthesis can be safely delayed out of the main
decl-checking path.  This caused a large number of ramifications,
especially for lazy properties, and greatly inflated the size of this
patch.  That is... really regrettable.  The impetus for changing this
was necessity: I needed to rework accessor synthesis to end its reliance
on distinctions like Stored vs. StoredWithTrivialAccessors, and those
fixes were exposing serious re-entrancy problems, and fixing that... well.
Breaking the fixes apart at this point would be a serious endeavor.
This commit is contained in:
John McCall
2018-06-27 03:28:39 -04:00
parent aef0253c75
commit 9bee3cac5a
66 changed files with 2721 additions and 1869 deletions

View File

@@ -1612,7 +1612,7 @@ class FindAllSubDecls : public SourceEntityWalker {
return false;
if (auto ASD = dyn_cast<AbstractStorageDecl>(D)) {
auto accessors = ASD->getAllAccessorFunctions();
auto accessors = ASD->getAllAccessors();
Found.insert(accessors.begin(), accessors.end());
}
return true;