Commit Graph

17573 Commits

Author SHA1 Message Date
Erik Eckstein
834645a901 stdlib: Do the Array fast-path check with a single array property call.
Now that we can check isNative and NoDTC (no deffered type check needed) with a single bit-mask operation,
it makes sense to have a single array property call for it.
I replaced the the semantics call array.props.needsElementTypeCheck with array.props.isNativeNoDTC,
which is the combination of isNative && !needsElementTypeCheck. I kept array.props.isNative, which is not used for now,
but might be useful in the future, e.g. for array operations which don't care about type checks.

The optimized SIL for a class array access arr[i] now contains the minimum of 4 basic blocks.
PerfTests show +25% for DeltaBlue and some improvemements for -Onone.



Swift SVN r26871
2015-04-02 14:10:54 +00:00
Joe Groff
72643fd774 Runtime: Implement dynamic cast bridging from NSError to bridged error enums.
This allows ErrorTypes referencing Cocoa NSErrors to be pattern-matched against our bridged enums, at least dynamically. (The compiler still doesn't understand these bridging conversions yet.)

Swift SVN r26839
2015-04-02 00:19:30 +00:00
Joe Groff
fd27530199 Foundation overlay: Groundwork for pattern-matching Swift error enums to Cocoa NSError domains.
Provide an _ObjectiveCBridgeableErrorType protocol, which requires a failable initializer that attempts to map an NSError to a value of the error type. To start things off, gyb up an _NSCocoaError enum (underscored because we need to bikeshed a naming scheme) that corresponds to the standard NSCocoaErrorDomain codes.

Swift SVN r26820
2015-04-01 19:57:33 +00:00
Greg Parker
5e8f6116e4 Fix +[SwiftObject description] and +[SwiftObject debugDescription].
rdar://20380089


Swift SVN r26810
2015-04-01 11:04:46 +00:00
Greg Parker
1d7a09d8b4 Implement +[SwiftObject instancesRespondToSelector:].
rdar://20307260


Swift SVN r26808
2015-04-01 09:48:42 +00:00
Greg Parker
3b4ba55cd9 Always return a valid zone from [SwiftObject zone].
Swift SVN r26807
2015-04-01 09:13:10 +00:00
Dmitri Hrybenko
4edc305438 stdlib: change CVarArgType._encode() method into a '_cVarArgEncoding'
property per API review proposal that passed review

For a given type, obtaining its C vararg encoding is O(1) for any
instance.

Swift SVN r26794
2015-04-01 02:55:24 +00:00
Dmitri Hrybenko
cf912bcaae stdlib: underscore the only requirement of CVarArgType
Defining conformances to CVarArgType outside of the standard library is
not supported.

Swift SVN r26793
2015-04-01 02:16:15 +00:00
Joe Groff
233f8cfc4f Runtime: Fix accidental fallthrough in swift_getErrorValue from NSError case to normal case.
Swift SVN r26713
2015-03-30 04:52:56 +00:00
Joe Groff
5f676656a0 Runtime: Fill in the hooks to be able to use an NSError as an ErrorType.
Swift SVN r26702
2015-03-29 15:44:35 +00:00
Joe Groff
c5dbf067ee Foundation overlay: Conform NSError and CFError to ErrorType.
Swift SVN r26684
2015-03-28 21:24:58 +00:00
Joe Groff
89e0fbf7ff Runtime: Support casting into and out of ErrorType boxes.
Swift SVN r26619
2015-03-27 02:09:49 +00:00
Joe Groff
7514921a86 Runtime: Remove obsolete _stdlib_conformsToProtocol function.
'x is P' works now, and this function isn't used anywhere except by a test that exercises it. Removing this also lets us remove a swath of otherwise unused helper static functions in the runtime.

Swift SVN r26618
2015-03-27 02:08:58 +00:00
Erik Eckstein
663f08557a stdlib: Use a dedicated pointer spare bit to distinguish between native and ObjC object in BrigeStorage.
This simplifies the code for is-native checking. Now it can be done by a single and-mask operation.



Swift SVN r26591
2015-03-26 14:35:10 +00:00
Erik Eckstein
7eeffa04c7 stdlib: Do the needs-type-check check in the Array subscript immediately before it is needed.
This reduces the amount of basic blocks in the function.



Swift SVN r26590
2015-03-26 14:21:52 +00:00
Erik Eckstein
5c7f0e833f stdlib: Don't do subscript checking for objc arrays.
ObjC arrays do their own checking.
This reduces the generated code for array accesses.



Swift SVN r26589
2015-03-26 14:19:52 +00:00
Joe Groff
b7f84a68d7 Runtime: Allocate Swift errors as an NSError subclass.
After some more discussion with John, we decided that subclassing is the only realistic option, at least until we eventually are able to integrate with the OS. Switch things around to allocate Swift error boxes as an ObjC subclass that contains the error value instead of trying to game it as a CFError.

Swift SVN r26562
2015-03-25 23:02:57 +00:00
Joe Groff
ff5f87f56b Runtime: Add ExistentialTypeMetadata helpers for taking values.
Add a 'mayTakeValue' function, which returns true if we're allowed to take the value from an existential container (assuming we own the existential container value). This is true for class and opaque existential containers, but not for boxed existentials, where multiple owners may share references to the boxed value. Also add a 'deinitExistentialContainer' function to do any cleanup that must happen after the value has been consumed out of an existential container. Fix up an off-by-one indirection level in the SwiftError implementations of the existing existential container methods.

Swift SVN r26561
2015-03-25 23:02:56 +00:00
Joe Groff
33ce2bc61d Spot fixes, NFC
Swift SVN r26560
2015-03-25 23:02:56 +00:00
Joe Groff
ee69e2ea0d Runtime: Return after false assertion.
Swift SVN r26559
2015-03-25 23:02:55 +00:00
Ben Langmuir
784a05faf2 [cmake] Replace a bunch of OSX checks with Darwin checks
These should all apply to any Darwin platform, and the current behaviour
was breaking cross-compilation.

Introduces a SWIFT_DARWIN_VARIANTS pattern, to be used as follows:
    if(SWIFT_HOST_VARIANT MATCHES "${SWIFT_DARWIN_VARIANTS}")

Also fix one place where I checked the CMAKE_SYSTEM_NAME instead of the
host variant that I recently introduced.  I haven't attempted to find
the rest of the places we're doing this though.

Swift SVN r26554
2015-03-25 21:15:30 +00:00
Ben Langmuir
9b6ac6e089 Add swift_runtime_objc_sources on all Darwin platforms
They're not OSX-only.

Swift SVN r26540
2015-03-25 16:05:59 +00:00
Dave Abrahams
2a84ade467 [stdlib] Clarify an oft-repeated doc comment
Thanks, Dmitri!

Swift SVN r26512
2015-03-25 01:54:08 +00:00
Jordan Rose
d6bc8971c7 If imported calls return nil for __nonnull NSString *, pretend it was "".
The string version of r26479. There's a lot of backstory and justification
there, so just read that commit message again. The one addition for String
is that global NSString constants are loaded as String as well, so that
also has to go through the bridging code even though there's no function
call involved.

Finishes rdar://problem/19734621.

Swift SVN r26510
2015-03-25 01:16:45 +00:00
Joe Groff
668928cc83 Runtime: Handle ErrorType's layout in ExistentialTypeMetadata accessors.
Teach ExistentialTypeMetadata how to project out the value pointer, type metadata, and protocol witness table from ErrorType containers. NFC yet; the dynamic casting and reflection machinery needs further work to correctly handle ErrorType boxes.

Swift SVN r26509
2015-03-25 00:56:16 +00:00
Chris Willmore
1ee6f7e67c Implement syntax changes for in-place methods.
Rename 'assignment' attribute of infix operators to 'mutating'. Add
'has_assignment' attribute, which results in an implicit declaration of
the assignment version of the same operator. Parse "func =foo"
declaration and "foo.=bar" expression. Validate some basic properties of
in-place methods.

Not yet implemented: automatic generation of wrapper for =foo() if foo()
is implemented, or vice versa; likewise for operators.

Swift SVN r26508
2015-03-25 00:22:41 +00:00
Joe Groff
8571b4f6a9 Runtime: Check for SpecialProtocol::AnyObject instead of strcmp'ing the mangled protocol name.
Swift SVN r26500
2015-03-24 21:48:08 +00:00
David Farler
b60cf1efd4 Build iOS overlays for TVOS
SDK overlays built for iOS were guarded as iOS only. These are also
available in the tvOS SDK.

rdar://problem/20278575

Swift SVN r26499
2015-03-24 21:43:55 +00:00
Joe Groff
feb5371e27 Runtime: Use ObjC pointer value witness for ErrorType.
Swift SVN r26497
2015-03-24 19:42:08 +00:00
Dmitri Hrybenko
1258662db9 CoreAudio overlay: add APIs that were blocked by rdar://16974298
(extensions on generic types in a different module)

Swift SVN r26486
2015-03-24 07:50:51 +00:00
Jordan Rose
8247c2d357 If imported calls return nil for 'NSArray * __nonnull', pretend it was [].
...and similar for NSDictionary and NSSet.

For APIs that don't have a reason to distinguish "empty" and "absent" cases,
we encourage standardizing on "empty" and marking the result as non-optional
(or in Objective-C, __nonnull). However, there are system APIs whose
implementations currently do return nil rather than an empty collection
instance. In these cases, we recommend /changing/ the API to return the
appropriate "empty" value instead.

However, this can cause problems for backwards-deployment: while the API is
truly non-optional on system vN, a program may encounter a nil return value
if run on system vN-1. Objective-C can generally deal with this (especially
if the only thing you do is ask for the count or try to iterate over the
collection) but Swift can't. Therefore, we've decided to "play nice" and
accept nil return values for the collection types (NSArray, NSDictionary,
and NSSet) and implicitly treat them as "empty" values if they are the
result of an imported function or method.

Note that the current implementation has a hole regarding subscript getters,
since we still make an AST-level thunk for these in the Clang importer.
We can probably get rid of those these days, but I didn't want to touch
them at this point. It seems unlikely that there will be a subscript that
(a) is for a collection type, and (b) mistakenly returned nil in the past
rather than an empty collection.

There's another hole where an ObjC client calls one of these mistakenly-nil-
returning methods and then immediately hands the result off by calling a
Swift method. However, we have to draw the line somewhere.

(We're actually going to do this for strings as well; coming soon.)

rdar://problem/19734621

Swift SVN r26479
2015-03-24 03:36:45 +00:00
Dmitri Hrybenko
ab408d4dc3 Update the compiler and SDK overlay for nullability and generics in Foundation
We have an SPI between the Swift compiler and Foundation based on the
SWIFT_SDK_OVERLAY_FOUNDATION_EPOCH preprocessor macro that allows us to
request the new API.  rdar://20270080 tracks removing it.

Swift SVN r26475
2015-03-24 02:18:06 +00:00
Joe Groff
ef8cc448d0 Runtime: Instantiate existential metadata with special protocol set.
If an existential type for a special protocol (not a composition) is instantiated, carry the special protocol identifier from that protocol to the existential, allowing us to easily recognize existentials with unique runtime characteristics.

Swift SVN r26436
2015-03-23 17:06:22 +00:00
Mark Lacey
3ab2e208af Devirtualize during mandatory inlining.
With this change we will devirtualize in trivial cases where mandatory
inlining has exposed opportunities due to substituting types, for
example substituting a struct type into a witness_method where we can
now easily determine exactly what method will be called.

This makes it possible to use @transparent on struct methods that are
dispatched via generic functions, resulting in the opportunity to emit
diagnostics for these methods as well as eliminate the overhead of the
indirect call.

I saw a handful of 10+% perf improvements at -Onone on our benchmarks.

In theory this should allow us to remove the overloads for ++/-- in
FixedPoint.swift.gyb without a performance penalty (and with the proper
overflow diagnostics), but unfortunately if we were to do so, we would
currently dispatch to functions that lack runtime overflow
checks (rdar://problem/20226526).

Swift SVN r26397
2015-03-21 23:05:24 +00:00
Dmitri Hrybenko
6278badc4f Foundation overlay: use the current locale in String(localizedStringWithFormat:)
No test since a proper test requires method swizzling and that would
take a while to write.  Tested manually.

rdar://20171815

Swift SVN r26343
2015-03-20 01:17:44 +00:00
Joe Groff
9ec27cbd62 Runtime: Stub out runtime operations for ErrorType boxes.
Swift SVN r26335
2015-03-19 23:50:06 +00:00
Nadav Rotem
fe09d76acc Remove a stale comment that is incorrent and does not match the implementation.:w
Swift SVN r26313
2015-03-19 20:14:01 +00:00
Arnold Schwaighofer
63f4170a0e ArraySemantics: To facilitate make_unique hoisting add a array.owner call
After this change we can also hoist uniqueness checks for array of classes.

rdar://19955624

Swift SVN r26311
2015-03-19 19:32:16 +00:00
Dave Abrahams
d7156b0620 [stdlib] Kill obsolete comment
Swift SVN r26308
2015-03-19 18:32:13 +00:00
Joe Groff
970958c43c SILGen: Support method and property lookup on boxed existentials.
Swift SVN r26290
2015-03-19 02:10:14 +00:00
David Farler
544ef4002d Merge tvOS and watchOS Support
- Add frontend and standard library build support for tvOS.
- Add frontend support for watchOS.

watchOS standard library builds are still disabled during SDK bring-up.

To build for TVOS, specify --tvos to build-script.
To build for watchOS, specify --watchos to build-script (not yet supported).

This patch does not include turning on full tests for TVOS or watchOS, and
will be included in a follow-up patch.

Swift SVN r26278
2015-03-18 21:35:07 +00:00
Arnold Schwaighofer
e4ece365b9 Annotate bridgeTo/FromObjectiveC in Foundation.swift
This will allow us to recognize identity compositions.

 (bridge_from (bridge_to x)) -> x
 (bridge_to (bridge_from x)) -> x

rdar://19178324

Swift SVN r26240
2015-03-17 23:27:19 +00:00
Enrico Granata
b9f0a6d22b This is the equivalent of r24737 for iOS
"Only remove the view from the set of views that are being Mirror-drawn when you're actually done reflecting on it  The previous code would always remove the view on exit, even if it had not previously added it (default: case of the switch)  In simple cases, this didn't really matter, but if you caused the logger to be reinvoked on self in a loop, then you would end up removing the view before you were done looping over it, and eventually run out of stack space"

In this case, it fixes rdar://20193122



Swift SVN r26235
2015-03-17 21:15:48 +00:00
Dave Abrahams
a1d3895bd2 [stdlib] Plug a leak in String bridging
The way we bridge CFStringCreateCopy remains a nasty hack. The patch
attached to <rdar://20185167> is better, but that radar blocks the
better solution.

Fixes <rdar://20031203>.

Swift SVN r26223
2015-03-17 12:11:15 +00:00
Dmitri Hrybenko
4387f95a29 flatMap: fix the comment and simplify the implementation
rdar://20178405

Swift SVN r26205
2015-03-17 00:39:41 +00:00
Dmitri Hrybenko
e6f53a38cc stdlib: remove swift_createDate
It was added for testing and it is actually never used now.

Swift SVN r26195
2015-03-16 22:25:27 +00:00
Chris Lattner
7b13a367a7 clean up some uses of typed patterns in nested contexts. The only reason anyone was using
them was because of the obsolete AnyObject warning.


Swift SVN r26159
2015-03-15 18:26:24 +00:00
Dave Abrahams
d292f64d77 [stdlib] Eliminate unneeded _SignedNumberType protocol
As Dmitri as pointed out, our ~> dispatching doesn't require
underscored-protocol hacks any longer

Swift SVN r26157
2015-03-15 17:26:14 +00:00
Chris Lattner
20f8f09ea8 Land: <rdar://problem/19382905> improve 'if let' to support refutable patterns and untie it from optionals
This changes 'if let' conditions to take general refutable patterns, instead of
taking a irrefutable pattern and implicitly matching against an optional.

Where before you might have written:
  if let x = foo() {

you now need to write:
  if let x? = foo() {
    
The upshot of this is that you can write anything in an 'if let' that you can
write in a 'case let' in a switch statement, which is pretty general.

To aid with migration, this special cases certain really common patterns like
the above (and any other irrefutable cases, like "if let (a,b) = foo()", and
tells you where to insert the ?.  It also special cases type annotations like
"if let x : AnyObject = " since they are no longer allowed.

For transitional purposes, I have intentionally downgraded the most common
diagnostic into a warning instead of an error.  This means that you'll get:

t.swift:26:10: warning: condition requires a refutable pattern match; did you mean to match an optional?
if let a = f() {
       ^
        ?

I think this is important to stage in, because this is a pretty significant
source breaking change and not everyone internally may want to deal with it
at the same time.  I filed 20166013 to remember to upgrade this to an error.

In addition to being a nice user feature, this is a nice cleanup of the guts
of the compiler, since it eliminates the "isConditional()" bit from
PatternBindingDecl, along with the special case logic in the compiler to handle
it (which variously added and removed Optional around these things).




Swift SVN r26150
2015-03-15 07:06:22 +00:00
Joe Groff
fdde2a8e99 SIL: Add instructions for boxed existential operations.
Parsing and serialization for {Alloc,Open,Dealloc}ExistentialBox instructions to represent operations on ErrorType boxes.

Swift SVN r26145
2015-03-15 03:32:37 +00:00