[dmd-internals] [D-Programming-Language/dmd] 867d54: Implement basic support for Objective-C methods.

GitHub via dmd-internals dmd-internals at puremagic.com
Sat Jul 11 13:03:27 PDT 2015


  Branch: refs/heads/master
  Home:   https://github.com/D-Programming-Language/dmd
  Commit: 867d5479b6d98b23b6c797ee487d1ec1474bee10
      https://github.com/D-Programming-Language/dmd/commit/867d5479b6d98b23b6c797ee487d1ec1474bee10
  Author: Michel Fortin <michel.fortin at michelf.com>
  Date:   2015-07-11 (Sat, 11 Jul 2015)

  Changed paths:
    M src/aggregate.h
    M src/attrib.c
    M src/class.c
    M src/declaration.h
    M src/e2ir.c
    M src/expression.c
    M src/expression.h
    M src/func.c
    M src/globals.h
    M src/glue.c
    M src/hdrgen.c
    M src/idgen.d
    M src/magicport.json
    M src/magicport/typenames.d
    M src/mangle.c
    M src/mars.c
    M src/module.c
    M src/module.h
    A src/objc.c
    A src/objc.di
    A src/objc.h
    A src/objc_glue.c
    A src/objc_glue_stubs.c
    A src/objc_stubs.c
    A src/objc_stubs.d
    M src/parse.c
    M src/posix.mak
    M src/tocsym.c
    M src/toobj.c
    M src/win32.mak
    A test/compilable/objc_gfunc.d
    A test/compilable/objc_interface.d
    A test/fail_compilation/objc_interface1.d
    A test/fail_compilation/objc_interface2.d
    A test/fail_compilation/objc_interface3.d
    A test/runnable/objc_call.d

  Log Message:
  -----------
  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


  Commit: 929b56cac5502c4af71f92426951eabd9d3cd787
      https://github.com/D-Programming-Language/dmd/commit/929b56cac5502c4af71f92426951eabd9d3cd787
  Author: Jacob Carlborg <doob at me.com>
  Date:   2015-07-11 (Sat, 11 Jul 2015)

  Changed paths:
    A test/runnable/extra-files/objc_objc_msgSend.m
    A test/runnable/objc_objc_msgSend.d

  Log Message:
  -----------
  Add tests for the various objc_msgSend_* functions.


  Commit: 941808dc44a03396d41657cfa9ccc8bfe901f3a7
      https://github.com/D-Programming-Language/dmd/commit/941808dc44a03396d41657cfa9ccc8bfe901f3a7
  Author: Walter Bright <walter at walterbright.com>
  Date:   2015-07-11 (Sat, 11 Jul 2015)

  Changed paths:
    M src/aggregate.h
    M src/attrib.c
    M src/class.c
    M src/declaration.h
    M src/e2ir.c
    M src/expression.c
    M src/expression.h
    M src/func.c
    M src/globals.h
    M src/glue.c
    M src/hdrgen.c
    M src/idgen.d
    M src/magicport.json
    M src/magicport/typenames.d
    M src/mangle.c
    M src/mars.c
    M src/module.c
    M src/module.h
    A src/objc.c
    A src/objc.di
    A src/objc.h
    A src/objc_glue.c
    A src/objc_glue_stubs.c
    A src/objc_stubs.c
    A src/objc_stubs.d
    M src/parse.c
    M src/posix.mak
    M src/tocsym.c
    M src/toobj.c
    M src/win32.mak
    A test/compilable/objc_gfunc.d
    A test/compilable/objc_interface.d
    A test/fail_compilation/objc_interface1.d
    A test/fail_compilation/objc_interface2.d
    A test/fail_compilation/objc_interface3.d
    A test/runnable/extra-files/objc_objc_msgSend.m
    A test/runnable/objc_call.d
    A test/runnable/objc_objc_msgSend.d

  Log Message:
  -----------
  Merge pull request #4321 from jacob-carlborg/dobjc_instance_methods

Implement basic support for Objective-C methods.


Compare: https://github.com/D-Programming-Language/dmd/compare/971b319e45c4...941808dc44a0


More information about the dmd-internals mailing list