Commit Graph

5543 Commits

Author SHA1 Message Date
Jordan Rose
953424072e Guard "object literals" feature with SWIFT_ENABLE_OBJECT_LITERALS.
This is not a feature we're releasing at the moment, so provide a way
to turn it off.

rdar://problem/21935551

Swift SVN r30966
2015-08-04 00:16:52 +00:00
David Farler
311baf73cf Index protocol extensions
- Remove free Swift functions for advance and distance and replace
  them with protocol extension methods:
  - advancedBy(n)
  - advancedBy(n, limit:)
  - distanceTo(end)
- Modernize the Index tests
  - Use StdlibUnittest
  - Test for custom implementation dispatch

Perf impact: No significant changes reported in the
Swift Performance Measurement Tool.

rdar://problem/22085119

Swift SVN r30958
2015-08-03 20:06:44 +00:00
Jordan Rose
a41c1fe7cb [stdlib] Don't try to swap an element with itself in 'partition'.
(or in 'randomShuffle')

This violates our inout aliasing rules, and can cause a crash in certain
situations.

To try to prevent this in the future I've added a debugPrecondition check
to 'swap' that checks addresses. This will only catch inout violations
where neither argument uses writeback, and might some day be optimized
away. Right now, though, it does seem to catch some simple violations
(though not the one in the Radar), so hopefully it will at least help keep
us from introducing new problems.

rdar://problem/21780567

Swift SVN r30956
2015-08-03 19:51:29 +00:00
Dmitri Hrybenko
9a77d843da stdlib: update references to 'isEmpty' in comments
Swift SVN r30954
2015-08-03 19:22:57 +00:00
Michael Gottesman
3fe541625c Do not copy a SliceBuffer when we have the full native buffer. Just return it.
Fixes the RangeAssignment regression. Reviewed by Dmitri.

<rdar://problem/22078500> RangeAssignment regressions in r30794

Swift SVN r30925
2015-08-02 04:42:53 +00:00
Dave Abrahams
ad43a596bd [stdlib] Retire the old lazy subsystem...
...replacing it with the new, after passing API review!

* The lazy free function has become a property.

* Before we could extend protocols, we lacked a means for value types to
  share implementations, and each new lazy algorithm had to be added to
  each of up to four types: LazySequence, LazyForwardCollection,
  LazyBidirectionalCollection, and LazyRandomAccessCollection. These
  generic adapters hid the usual algorithms by defining their own
  versions that returned new lazy generic adapters. Now users can extend
  just one of two protocols to do the same thing: LazySequenceType or
  LazyCollectionType.

* To avoid making the code duplication worse than it already was, the
  generic adapters mentioned above were used to add the lazy generic
  algorithms around simpler adapters such as MapSequence that just
  provided the basic requirements of SequenceType by applying a
  transformation to some base sequence, resulting in deeply nested
  generic types as shown here. Now, MapSequence is an instance of
  LazySequenceType (and is renamed LazyMapSequence), and thus transmits
  laziness to its algorithms automatically.

* Documentation comments have been rewritten.

* The .array property was retired

* various renamings

* A bunch of Gyb files were retired.

Swift SVN r30902
2015-08-01 03:52:13 +00:00
Dmitri Hrybenko
d7caf06551 stdlib: rename generic parameter of _SliceBuffer from T to Element
Swift SVN r30901
2015-08-01 03:27:07 +00:00
Dmitri Hrybenko
d822a90ed4 stdlib: fix warnings
Swift SVN r30900
2015-08-01 02:59:43 +00:00
Dave Abrahams
7d5bb5f080 [stdlib] new print: move "toStream" argument to end
It reads more naturally to keep all the text arguments together.
One day maybe this will be a method on OutputStream, but probably not as
long as String conforms to it :-)

Swift SVN r30864
2015-07-31 20:19:49 +00:00
David Farler
7a49dda2c8 Add @warn_unused_result to map, flatMap, and filter
rdar://problem/21971932

Swift SVN r30849
2015-07-31 05:15:10 +00:00
David Farler
034d0cfbf0 Fix three-way mid-air collision around Array buffers and RangeReplaceable tests
Swift SVN r30843
2015-07-31 04:43:03 +00:00
David Farler
f924e8e007 ArraySlice indexes no longer zero-based
ArraySlice indices now map directly onto the collection it is slicing
and maintains that mapping even after mutations.

Before:

var a = Array(0..<10)
var s = a[5..<10]
s.indices        // 0..<5
s[0] = 111
s                // [111, 6, 7, 8, 9]
s.removeFirst()
s.indices        // 1..<5

After:

var a = Array(0..<10)
var s = a[5..<10]
s.indices        // 5..<10
s[5] = 99
s                // [99, 6, 7, 8, 9]
s.removeFirst()
s.indices        // 6..<10

- Refactor some of the internals of the buffer types to make it easier
  to read and understand.
- Add Array, ArraySlice, and ContiguousArray to the test suite at the
  RangeReplaceable test entry points, subjecting them to the same tests
  as all of our collections.
- Update existing test expectations for the indexing changes.

rdar://problem/21866825

Swift SVN r30840
2015-07-31 03:25:29 +00:00
Dmitri Hrybenko
d9088afe4b stdlib: add MutableSlice
See doc comments on MutableSlice for more information about what it is.

MutableSlice was one of the reasons to clarify and tighten index
invalidation rules.  After that change, existing MinimalCollection
test types were performing checks that are too strict according to the
model.  Existing algorithms and collections could provide them, but not
MutableSlice.  This commit updates MinimalCollection types to perform
index invalidation checks that correspond to new rules.

Part of rdar://20722366.  This commit adds the type, but does not wire
it up completely yet.

Swift SVN r30839
2015-07-31 03:21:56 +00:00
Dmitri Hrybenko
61b93564e9 Eliminate UnsafeMutableBufferPointer from _withUnsafeMutableBufferPointerIfSupported
The type checker hits a recursion when checking the conformance to
CollectionType in UnsafeMutableBufferPointer, which requires
_withUnsafeMutableBufferPointerIfSupported, which mentions
UnsafeMutableBufferPointer.  The easiest fix for now is to break the
recursion in the library.

Reverting this change is tracked by: <rdar://problem/21933004> Restore
the signature of _withUnsafeMutableBufferPointerIfSupported() that
mentions UnsafeMutableBufferPointer

Swift SVN r30838
2015-07-31 03:21:54 +00:00
Dave Abrahams
d06a07897f [stdlib] Move _playgroundPrintHook into OutputStream
Makes for a simpler patch for the LLDB folk to apply

Swift SVN r30824
2015-07-30 23:39:47 +00:00
Dave Abrahams
b428dc8a6a [stdlib] wire _playgroundPrintHook into legacy print
Those LLDB peeps need it for testing

Swift SVN r30823
2015-07-30 23:39:46 +00:00
Dave Abrahams
c2ec35e168 [stdlib] Add _playgroundPrintHook
This hook gets all of the output for each print or debugPrint invocation
as a single blob.

Swift SVN r30818
2015-07-30 23:08:03 +00:00
Dave Abrahams
931fed01eb [stdlib] "end:" => "terminator:" in new print
API review seems to agree that's a better name choice.

Swift SVN r30809
2015-07-30 18:56:40 +00:00
Joe Groff
4cb34410fc stdlib: Don't reserve capacity for filter result array.
Swift SVN r30802
2015-07-30 17:07:37 +00:00
Joe Groff
0c39db22bc stdlib: Implement strict 'map', 'filter', and 'flatMap' as 'rethrows' operations.
Replace the Lazy-based implementations with open-coded implementations based on the _UnsafePartiallyInitializedContiguousArrayBuffer builder from the previous commit, so that we have control over the early-exit flow when an error interrupts the operation.

Swift SVN r30794
2015-07-30 05:28:34 +00:00
Joe Groff
eec59477ae stdlib: Factor _copy*ToNativeArrayBuffer into a general-purpose "builder" for ContiguousArrayBuffer.
This makes the code for efficiently initializing array buffers in-place more accessible to the rest of the standard library, and should also provide a performance boost for _copySequenceToNativeArrayBuffer, which had been implemented as a naive append loop, by handling reallocating the buffer when necessary when initializing from a sequence that underestimates its count.

Swift SVN r30793
2015-07-30 05:28:30 +00:00
Joe Groff
f62d95dbc8 stdlib: Add 'rethrows' to more SequenceType and CollectionType algorithms.
Including:

- forEach
- split
- Optional flatMap
- minElement
- maxElement
- startsWith
- elementsEqual
- lexicographicalCompare
- contains
- reduce

Still not touching 'map', 'filter', 'flatMap', or 'sort', which need various levels of rearchitecting to fix.

Swift SVN r30792
2015-07-30 05:28:26 +00:00
Joe Groff
ce94497a57 stdlib: Mark short-circuit operators as 'rethrows'.
Swift SVN r30791
2015-07-30 05:28:23 +00:00
Joe Groff
1d49d927e1 stdlib: Mark many higher-order function interfaces as 'rethrows'.
This covers:

- Lifetime-extending wrappers, like withExtendedLifetime, withCString, and withUnsafe*Pointer
- 'map' and friends on Optional
- 'indexOf'

A few APIs I haven't gotten to yet in this first pass:

- Autoclosure APIs, like assert, &&, etc.
- the 'isOrderedBefore' predicate for sorting APIs. The sorting implementation does some microoptimizations with 'inout' closures that violate rethrows checking.
- Strict 'map', 'filter', and friends on CollectionType. These need some plumbing in Lazy to be able to thread a Result-forming transformation through.

This version of the patch updates some protocol customization implementations that I missed the first time around, and includes the tests I forgot to add in the previous iteration.

Swift SVN r30790
2015-07-30 05:28:17 +00:00
Dave Abrahams
1a01fee74a [stdlib] Strip comments and other distractions from unavailable APIs
Swift SVN r30777
2015-07-29 20:30:34 +00:00
Dave Abrahams
b698a088c7 [stdlib] Add new print functions (underscored)
Getting these ready for API review.

Swift SVN r30776
2015-07-29 20:30:32 +00:00
Dave Abrahams
0711371641 [stdlib] Update FIXMEs to place the blame correctly
Swift SVN r30752
2015-07-29 03:30:16 +00:00
Dave Abrahams
b6d4007b55 [stdlib] Fix incorrect comment
Swift SVN r30750
2015-07-29 02:04:10 +00:00
Dmitri Hrybenko
21b7dcf61e stdlib: mark one of the global sort() functions unavailable
Others were already unavailable, this is the last one.

rdar://22022419

Swift SVN r30711
2015-07-28 03:19:08 +00:00
Jordan Rose
b378a5043f [stdlib] Dictionary and Set's removeAtIndex should return the element.
For Dictionary, that's a (KeyType, ValueType) pair. For Set, that's just
the set element type. This is more consistent with the removeAtIndex on
RangeReplaceableCollectionType (which Dictionary and Set don't conform to).

rdar://problem/20299881

Swift SVN r30696
2015-07-27 20:32:55 +00:00
Dave Abrahams
f37d607a13 Revert "stdlib: remove FlattenCollection -- it does not model CollectionType properly."
Actually we hadn't nailed down the indexing model sufficiently; now we
have.

This reverts r30617.

Swift SVN r30694
2015-07-27 19:33:15 +00:00
Dmitri Hrybenko
a112e54b5c stdlib: Underscore global functions that operate on
_SwiftNSOperatingSystemVersion

rdar://20919984

Swift SVN r30693
2015-07-27 19:31:30 +00:00
Dmitri Hrybenko
6ec144738e stdlib: Add more APIs to _stdlib_AtomicInt
Requested in rdar://17171396

Swift SVN r30687
2015-07-27 04:18:13 +00:00
Dmitri Hrybenko
c6de78bc53 stdlib: add fixit-based migrations for appendContentsOf and insertContentsOf
Swift SVN r30618
2015-07-25 02:47:20 +00:00
Dmitri Hrybenko
78222237e0 stdlib: remove FlattenCollection -- it does not model CollectionType properly.
An index of a FlattenCollection is composed of two: an index to the
current chunk and an index within that chunk.  So you take the
startIndex, and advance it to the second chunk; call the result idx1.
You take startIndex again, and advance it the same number of steps; call
the result idx2:

let idx1 = flatMapCollection.startIndex.advancedBy(10)
let idx2 = flatMapCollection.startIndex.advancedBy(10)

idx1 and idx2 have to compare equal according to collection and index
axioms.  But this can't be cheaply implemented.  Every index contains an
index into the inner collection.  So indices into two collections with
the same elements have to compare equal even though the collections
don't have any common history, they were merely created using the same
sequence of steps.

What currently happens is that you get random results depending on the
underlying collection kind.

rdar://21989896

Swift SVN r30617
2015-07-25 02:18:13 +00:00
Dmitri Hrybenko
739cceba3d stdlib: lazy FlattenCollection: don't invoke the closure as frequently
FlattenCollection used to evaluate the closure three times per element.
That's acceptable from the technical standpoint, given its lazy
semantics, but not acceptable in practice.  This commit fixes it to only
evaluate it two times when it is converted into an array.

This commit also improves tests.  The new checks used to fail before the
standard library was fixed.

But there are larger issues with FlattenCollection -- it does not model
CollectionType properly.  See next commit.

Swift SVN r30616
2015-07-25 02:18:12 +00:00
Jordan Rose
e77e0587c7 Enforce maximum allowed access for extensions with 'where' clauses.
Otherwise, we end up with declarations with public access that do not
have public 'self' types. These declarations can then be used by other
modules, which may end up trying to access non-external symbols.

This closes a loophole currently in use by the standard library, so
the '_prext_ReverseIndexType' and '_ReverseCollectionType' protocols
become public for now. In order to keep the API impact minimized,
extensions involving these protocols now extend them directly, so that
all of the "private" stuff shows up in one place in the generated
interface. This is not a long-term solution, but it's no worse than
the rest of the underscore rules in the standard library.

rdar://problem/21380336 tracks relaxing access restrictions for protocol
conformances when the witnesses come from a different type, like a
protocol extension. This requires some SILGen work to do correctly.

Finishes rdar://problem/21559986

Swift SVN r30612
2015-07-25 01:06:50 +00:00
Dmitri Hrybenko
4b008e6f31 stdlib: rename RangeReplaceableCollectionType.splice() to insertContentsOf()
rdar://21972324

Swift SVN r30608
2015-07-25 00:36:39 +00:00
Dmitri Hrybenko
d97ac3e64c stdlib: rename RangeReplaceableCollectionType.extend() to appendContentsOf()
rdar://21972324

Swift SVN r30607
2015-07-25 00:36:37 +00:00
Joe Groff
b0ec0d6da4 Revert "stdlib: Mark many higher-order function interfaces as 'rethrows'."
This reverts commit r30597, to help detangle it from other potentially-breaking changes that landed
on the bots simultaneously.

Swift SVN r30602
2015-07-24 23:31:59 +00:00
Joe Groff
4be02cab5b stdlib: Mark many higher-order function interfaces as 'rethrows'.
This covers:

- Lifetime-extending wrappers, like withExtendedLifetime, withCString, and withUnsafe*Pointer
- 'map' and friends on Optional
- 'indexOf'

A few APIs I haven't gotten to yet in this first pass:

- Autoclosure APIs, like assert, &&, etc.
- the 'isOrderedBefore' predicate for sorting APIs. The sorting implementation does some microoptimizations with 'inout' closures that violate rethrows checking.
- Strict 'map', 'filter', and friends on CollectionType. These need some plumbing in Lazy to be able to thread a Result-forming transformation through.

Swift SVN r30597
2015-07-24 22:52:23 +00:00
Dave Abrahams
897c34aec9 [stldib] Add missing comments for new reverse collections
Also re-order some decls

Swift SVN r30596
2015-07-24 22:50:50 +00:00
Dave Abrahams
c46b80d6f4 [stdlib] _prext_reverse -> method
Swift SVN r30593
2015-07-24 22:14:38 +00:00
Dmitri Hrybenko
5d22239652 stdlib: fix warnings
Swift SVN r30566
2015-07-24 05:27:56 +00:00
Dmitri Hrybenko
f5de8757e4 stdlib: remove Word and UWord
These types are leftovers from the early pre-1.0 times when Int and UInt
were always 64-bit on all platforms.  They serve no useful purpose
today.  Int and UInt are defined to be word-sized and should be used
instead.

rdar://18693488

Swift SVN r30564
2015-07-24 05:01:32 +00:00
Dave Abrahams
76c6cf59ab [stdlib] Add missing public inits to LazyMapXXX
Swift SVN r30562
2015-07-24 04:29:07 +00:00
Dave Abrahams
ea8c410509 [stdlib] Use new lazy collections in implementations
They pass various operations through to the base
collection (e.g. LazyMapCollection's .count) and thereby avoid taking
the potentially-slower path through the default implementation.

Swift SVN r30554
2015-07-23 21:02:45 +00:00
Dave Abrahams
55b049500a [stdlib] Eliminate redundant eager "filter" implementation
Because we're only allowed a single pass with the closure, the one in
SequenceType is just as good as the one in CollectionType.

Swift SVN r30553
2015-07-23 21:02:44 +00:00
Dave Abrahams
fde48e0b57 [stdlib] "count" property passthrough for LazyMapCollection
Swift SVN r30552
2015-07-23 21:02:43 +00:00
Dave Abrahams
878445a72a [stdlib] Use a nicer generic parameter name...
...with no trailing "_"

Swift SVN r30551
2015-07-23 21:02:42 +00:00