Commit Graph

1287 Commits

Author SHA1 Message Date
Doug Gregor
55a5709771 SILGen support for convenience factory and factory initializers.
These initializers are class methods, so provide them with the
metatype value rather than allocating an object. Moreover, they
generally return autoreleased, so we need to retain them out of the
autorelease pool before returning the produced 'self'.

Finishes the SILGen and IRGen portions of
<rdar://problem/16509024>. We still can't enable this in practice
because we're getting duplicate initializers, as predicated in the
hacky r16531.

Swift SVN r16555
2014-04-18 23:40:35 +00:00
Joe Groff
89703e1b7a SILGen: Reabstract values when injecting varargs into arrays.
Fixes <rdar://problem/16039286>.

Swift SVN r16540
2014-04-18 19:46:18 +00:00
Joe Groff
e6276a1c2f SILGen: Emit brace stmt exprs and for stmt initializers as ignored exprs.
Add an emitIgnoredExpr entrypoint to SILGenFunction that emits an expression, ignoring its result. This isn't an extensive implementation but just tackles the low-hanging fruit of allowing +0 rvalues and not crashing on sudden lvalues, fixing <rdar://problem/16650625>.

Swift SVN r16536
2014-04-18 17:55:41 +00:00
Doug Gregor
8bc2ea4ea1 Use designated/convenience initializer terminology throughout. NFC
Introduce CtorInitializerKind to describe the kind of an enum, rather
than a bool, to make way for more initializer kinds in the future.

Swift SVN r16525
2014-04-18 15:10:13 +00:00
Joe Groff
b256ccf467 Switch to native blocks codegen.
Swift SVN r16484
2014-04-18 01:07:12 +00:00
John McCall
9000278dcd Introduce MetatypeErasureExpr for erasing metatype
values into existential metatypes.  Erase thin metatypes
correctly in SILGen.

rdar://16610078

Swift SVN r16477
2014-04-17 22:31:47 +00:00
Doug Gregor
894ca69bdc Initializer full names now reflect what __FUNCTION__ should be. Use them.
Swift SVN r16407
2014-04-16 07:53:25 +00:00
Joe Groff
071d60ffbb SILGen: Emit func-to-block conversions using the native SIL instructions.
With -enable-native-blocks, build func-to-block thunks natively as SIL using the new block storage instructions.

Swift SVN r16385
2014-04-16 00:54:58 +00:00
Joe Groff
3bad92b342 AST: Remove the stopgap BridgeToBlockExpr and handle block <-> non-block conversions freely as function conversions.
Teach SILGen to handle function representation changes as part of function conversion instead of needing to be spoonfed a special expr for the purpose. Handle representation changes in both directions to and from blocks using the same logic as the bridging conversions.

Swift SVN r16318
2014-04-14 15:00:34 +00:00
Joe Groff
012fee5d4f SILGen: Use bridge_to_block as a stopgap to bridge functions back into blocks.
This should let us turn on block bridging in the short term.

Swift SVN r16238
2014-04-12 00:01:26 +00:00
John McCall
8a85750c4c Plumb a lot of querying for different kinds of existential
type.

Swift SVN r16232
2014-04-11 22:30:14 +00:00
Joe Groff
e245f9ee89 SILGen: Thunk blocks into native Swift functions when bridging into Swift.
Emit Swift thunk functions to bridge blocks into native function values. On entry into @objc thunks, copy_block blocks to ensure they've been lifted off the stack.

Swift SVN r16177
2014-04-10 22:35:42 +00:00
Joe Groff
94ea3a1c9b SILGen: Bridge arguments when thunking C functions to Swift ones.
Fixes a crash when a C function that takes NSString etc. parameters is used as a function value.

Swift SVN r16174
2014-04-10 22:35:40 +00:00
Joe Groff
6f077f8992 SIL: Bridge thick functions to blocks in type lowering.
Set up type lowering to map thick functions to blocks. Stub out the actual codegen for the bridge by just emitting an 'undef' and declaring the feature unimplemented for now.

Swift SVN r16148
2014-04-10 04:33:13 +00:00
Joe Groff
8adaab0233 Fold ExtInfo::isThin and ::isBlock into a "Representation" enum.
These bits are orthogonal to each other, so combine them into one, and diagnose attempts to produce a type that's both. Spot-fix a bunch of places this revealed by inspection that we would have crashed in SILGen or IRGen if blocks were be handled.

Swift SVN r16088
2014-04-09 00:37:26 +00:00
John McCall
372d6513bb Don't propagate let-binding Initializations down into
conditional-executed initializers.

Swift SVN r16033
2014-04-08 01:12:56 +00:00
Doug Gregor
a87d65d617 Bridge NSArray <-> AnyObject[].
Allows AnyObject[] to occur in @objc methods/properties/etc., then
bridges between the two in SILGen based on the new array
implementation. <rdar://problem/16535097>.

Note that this commit does not change the Clang module importer to
import NSArray* as AnyObject[] (yet).


Swift SVN r16004
2014-04-07 05:49:48 +00:00
Joe Groff
d2799610a3 SILGen: Don't try to write back to rvalue decl or member refs.
Making DeclRefExprs and MemberRefExprs work as lvalues or rvalues simplifies the AST, but eliminates LoadExpr as a nice single focal point for severing writeback chains. We need to disable writeback scopes when codegenning rvalue DeclRefs and MemberRefs too. Fixes <rdar://problem/16530235>.

Swift SVN r15965
2014-04-04 23:51:42 +00:00
Joe Groff
fea886d048 SILGen: Bridge the C*VoidPointer types to COpaquePointer.
Swift SVN r15868
2014-04-03 15:03:48 +00:00
Joe Groff
8102dee6f0 SILGen: Bridge ObjCMutablePointer.
Make ObjCMutablePointer @objc-able for (potentially optional) class types, and bridge it down to UnsafePointer when calling @objc entry points.

Swift SVN r15838
2014-04-02 22:49:32 +00:00
Chris Lattner
a0a65c0ea2 change the sil parser/printer to use retain_value instead of copy_value.
Swift SVN r15776
2014-04-02 05:22:41 +00:00
Chris Lattner
6540423613 rename CopyValueInst -> RetainValueInst. The .sil syntax
isn't changed yet.


Swift SVN r15775
2014-04-02 05:11:31 +00:00
Joe Groff
8f1c2d1e79 Sema: Implement type-checking for inout writeback conversion.
Add a third branch to the constraint system for '&x' expressions that allows conversion from an lvalue to a type via an additional writeback step:

- Add an LValueConversionExpr node that converts from @lvalue T to @lvalue U, given a pair of functions that convert T -> U and U -> T, to represent the writeback temporary.
- Allow conversion in an inout expression from @lvalue T to a type U that has the following members:

  static func __writeback_conversion(Builtin.RawPointer, T.Type) -> U
  static func __writeback_conversion_get(T) -> V
  static func __writeback_conversion_set(V) -> T

which builds a solution that produces an LValueConversion from the get/set pair before passing the pointer to the writeback temporary off to the conversion function.

Swift SVN r15764
2014-04-02 00:17:51 +00:00
Doug Gregor
9189145cc5 Change DeclName over to basename(arg1:arg2:...argN:).
Swift will use the basename + argument names formulation for
names. Update the DeclName interfaces, printing, and __FUNCTION__ to
use the method syntax.

We'll still need to rework the "x.foo:bar:wibble:" syntax; that will
come (significantly) later.

Swift SVN r15763
2014-04-02 00:00:03 +00:00
John McCall
f1180f5e6d in order to work correctly for non-@objc protocols.
Language features like erasing concrete metatype
values are also left for the future.  Still, baby steps.

The singleton ordinary metatype for existential types
is still potentially useful; we allow it to be written
as P.Protocol.

I've been somewhat cavalier in making code accept
AnyMetatypeType instead of a more specific type, and
it's likely that a number of these places can and
should be more restrictive.
When T is an existential type, parse T.Type as an
ExistentialMetatypeType instead of a MetatypeType.

An existential metatype is the formal type
 \exists t:P . (t.Type)
whereas the ordinary metatype is the formal type
 (\exists t:P . t).Type
which is singleton.  Our inability to express that
difference was leading to an ever-increasing cascade
of hacks where information is shadily passed behind
the scenes in order to make various operations with
static members of protocols work correctly.

This patch takes the first step towards fixing that
by splitting out existential metatypes and giving
them a pointer representation.  Eventually, we will
need them to be able to carry protocol witness tables

Swift SVN r15716
2014-04-01 00:38:28 +00:00
Joe Groff
b9299ed04d ClangImporter: Import pointer parameters as CMutablePointer/CConstPointer.
When we see pointer types in function or method parameters, import them as the bridged CMutablePointer/CConstPointer types instead of UnsafePointer, enabling the array and inout conversions with imported APIs.

Swift SVN r15705
2014-03-31 23:06:50 +00:00
John McCall
516bf6fa67 Peephole forces of certain optional-to-optional conversions.
Swift SVN r15649
2014-03-30 18:31:49 +00:00
Joe Groff
584009d27e SIL: Remove copy_value's result.
We won't have any types where copying has an effect on the bit pattern (except for blocks, which need special handling anyway), and copy_value having a result makes optimizations more complex, so remove it.

Swift SVN r15640
2014-03-30 03:40:45 +00:00
Joe Groff
86faf30617 SILGen: Emit bridging from C*Pointer to UnsafePointer.
When we see CConstPointer or CMutablePointer in a foreign function signature, transparently bridge it to UnsafePointer at the foreign entry point, lifetime-extending the C*Pointer value during foreign calls so that its owner reference is held for the duration of the call.

Swift SVN r15602
2014-03-29 02:50:35 +00:00
Joe Groff
9f7dab725c Make the ASTContext parameter to MetatypeType::get optional for type-checked types.
We can just get it from the instance type, if the instance type has been fully initialized, which is the case except during parsing of type decls when the decls' own types are being formed.

Swift SVN r15598
2014-03-29 02:50:30 +00:00
Joe Groff
b3e9a17269 SILGen: Implement inout address conversion.
Implement lowering for the LValueToPointer and InOutConversion expressions. For the former, we emit the lvalue, then convert it to a RawPointer; for the latter, we introduce an InOutConversion scope, which suppresses any nested writeback conversion scopes.

This completes the implementation of inout address conversion, except that we don't implement reabstraction of the lvalue prior to taking its address. Simply report them unimplemented for now, since reabstraction should not come up for our immediate use case with C types.

Swift SVN r15595
2014-03-29 02:50:26 +00:00
Joe Groff
46f77c6181 Sema: Build the AST for inout address conversions.
Add two new AST node types:

- InOutConversionExpr, which represents an '&x' expression that involves inout conversion. This will be a signal to SILGen not to introduce a writeback scope for the nested conversion call.

- LValueToPointerExpr, which represents the primitive '@lvalue T' to 'RawPointer' conversion that produces the argument to the inout conversion.

Build an InOutConversionExpr AST when an inout expression is resolved by a conversion to an BuiltinInOutAddressConvertible type.

Swift SVN r15594
2014-03-29 02:50:25 +00:00
John McCall
2c0b89ceea Recognize -> Self? as an optional dynamic-self return,
and correctly handle Self? downstream in a number of
places.

Swift SVN r15572
2014-03-28 05:39:23 +00:00
John McCall
c388bb9fc0 Raise emitOptionalToOptional up to be more generally available
in SILGen.

Swift SVN r15571
2014-03-28 05:39:22 +00:00
Joe Pamer
56e2b28b76 Remove more unnecessary semicolons.
Swift SVN r15489
2014-03-26 06:07:06 +00:00
Joe Groff
45eadd1d9b Rename AddressOfExpr to InOutExpr.
The "address" is an implementation detail; formally, it turns an lvalue into an inout parameter.

Swift SVN r15458
2014-03-25 16:28:28 +00:00
Chris Lattner
13e06548cf Fix <rdar://problem/16411449> ownership qualifiers don't work with non-mutating struct property
Swift SVN r15429
2014-03-25 00:17:47 +00:00
Joe Groff
b8b4f4efbe SILGen: Don't throw away the cleanup on accessor base args.
Getters and setters don't always take self at +1, in particular @objc accessors, so we can't just take the base object as an unmanaged thing. Fixes <rdar://problem/16398756>.

Swift SVN r15372
2014-03-22 22:12:32 +00:00
Michael Gottesman
0bddddf24f Fix two typos that made the compiler release build fail.
Swift SVN r15225
2014-03-19 06:59:02 +00:00
John McCall
53565efe8d Teach the type-checker to bind and capture optional
values when casting to or from optional types.

rdar://16076966

Swift SVN r15211
2014-03-18 22:57:36 +00:00
John McCall
486463a398 Track the depth of a BindOptionalExpr.
Swift SVN r15210
2014-03-18 22:57:34 +00:00
Doug Gregor
6071ef9714 Teach __FUNCTION__ to separate the first parameter from the function name.
Swift SVN r15163
2014-03-17 22:42:59 +00:00
John McCall
79dbbd6c9c Bridge optional types when the value type is trivially bridgeable.
Swift SVN r15128
2014-03-17 05:05:08 +00:00
Doug Gregor
3cc834714c SILGen for initialization using an existential metatype value.
Loosen the restrictions on open_existential_ref to also allow it to
refer to an existential metatype. When it does, open_existential_ref
returns the metatype for the opened archetype.



Swift SVN r15113
2014-03-16 20:52:54 +00:00
Doug Gregor
f94a5e5df4 Call a standard library entry point from initializer stubs.
Rather than simply trapping with no output, have the initializer stubs
call into a new standard library function _unimplemented_initializer
that emits a more reasonable diagnostic, containing the name of the
class, the name of the initializer, and the file/line/column where the
class itself is defined. This finishes <rdar://problem/16156996>.



Swift SVN r15049
2014-03-14 15:04:49 +00:00
Doug Gregor
422d786d0f Make __FUNCTION__ more descriptive for initializers.
Use "init withFoo:bar:" to more closely mimic declaration syntax.


Swift SVN r15047
2014-03-14 13:33:37 +00:00
John McCall
446a9bd4a7 Introduce CanType versions of the various "getXOrBoundGenericX"
accessors.

Optimize these accessors by making them check for
BoundGenericXType instead of BoundGenericType and dyn_cast'ing
the Decl.  (The latter used to be necessary before we split
BoundGenericType.)

Swift SVN r15037
2014-03-14 05:59:44 +00:00
Joe Groff
038b494253 SILGen: Emit generic subclasses of @objc classes using ObjC allocation.
Although we don't expose their method and initializer entrypoints as @objc, generic @objc subclasses still need to inherit ObjC allocation from their superclass. A partial fix to <rdar://problem/16309189>, though there is still some IRGen fallout to chase out, causing test/IRGen/objc_subclass.swift to fail (as well as the test case from the radar).

Swift SVN r14991
2014-03-13 04:03:46 +00:00
Doug Gregor
00162dc243 Start emitting stubs for unimplemented designated initializers of the superclass.
When a subclass does not implement a designated initializer of its
superclass, introduce a stub initializer that simply traps. Such stubs
cannot be invoked directly using Swift syntax, but can be invoked
through the Objective-C runtime and from Objective-C code. Catch such
errors rather than allowing them to violate the memory safety of the
language.

Note that we're currently using cond_fail to trap; this will be
improved in the future,


Swift SVN r14839
2014-03-09 07:16:30 +00:00
Joe Groff
2448f33ffc Parser: Record the compound name of selector-style func decls.
Collect the identifiers for the selector pieces we parsed and use them to build a compound DeclName for the func decl. Currently this only manifests when __FUNCTION__ is used inside a selector-style function definition, where we now correctly produce the compound 'foo:bar:' name.

Swift SVN r14717
2014-03-06 03:36:49 +00:00