dmd/test/compilable/objc_gfunc.d
Michel Fortin 867d5479b6 Implement basic support for Objective-C methods.
Basic support for classes, interfaces and instance methods.
This is implemented by adding a new linkage attribute, `Objective-C`,
and a compiler recognized UDA, `@selector`. The linkage attribute is
to be used on a class or interface. The UDA is attached to a method.

The linkage attribute tells the compiler that the class should use the
name mangling that matches the one used by Objective-C
(same as C, no mangling) and that all methods in the class
should use the Objective-C way of calling methods, see below.
The calling convention for Objective-C methods and functions is the
same as for C.

The selector UDA tells the compiler what Objective-C selector the
method should have. The selector is used in the Objective-C runtime
to find the implementation of a given method.

An Objective-C method call is implemented by making a regular C call
to the `objc_msgSend` function in the Objective-C runtime.
The signature of `objc_msgSend` looks something like this:

`id objc_msgSend(id self, SEL op, ...);`

* The first parameter is the object (this/self pointer)
* The second parameter is the selector attached to the method
* The last parameter is for all the arguments that the
implementation expects

The call to `objc_msgSend` should not be performed as a variadic
call but instead as if it had the same signature as the method
that should be called but with the two additional parameter,
`self` and `op`, added first. The implementation of `objc_msgSend`
will jump to the method instead of calling it.

Because of the above, multiple versions exist of `objc_msgSend`.
Depending on the return type of the method that is called the correct
version need to be used. This depends on the ABI. This is a list of
functions and for which types they're used on OS X 64bit:

* objc_msgSend_stret - Used for structs too large to be returned in
registries
* objc_msgSend_fpret - Used for `long double`
* objc_msgSend_fp2ret - Used for `_Complex long double`
* objc_msgSend - Used for everything else
2015-07-11 21:36:57 +02:00

3 lines
58 B
D

// EXTRA_OBJC_SOURCES
extern (Objective-C) void NSLog();