mirror of
https://github.com/ldc-developers/ldc.git
synced 2025-04-28 22:21:31 +03:00
Improve Objective-C support (#4777)
* WIP: Objective-C support * Further work on implementation * ObjC dynamic cast * Add swift stub class attribute * Classes, protocols and ivars * Fix compilation issues * Fix objc ir codegen * Add objc linker option * Add swift stub classref get ir gen * Minor cleanup * Fix objc link flag being added on non-darwin platforms * Refactor objc gen * remove use of std::nullopt * Emit protocol tables * Remove unused variable * Formatting * Fix build in release mode. Thanks for nothing, c++. * Fix consistency * Fix dynamic casts * Fix tocall parentfd ref and arm msgsend call * Make instance variables work * Implicitly add isa pointer to objc classes. * Fix protocol referencing & allow pragma mangle * Fix protocol linkage * Fix direct call support * always generate var type for methods * Fix test 16096a * Fix extern ivar symbol gen, retain method decls * Remove arm32 and x86 support * Check method and ivar info before pushing to member list * Make ObjcMethod info untyped. * Make ivar and method gen more robust * Generate optional protocol symbols * Use bitcasting instead of creating multiple type defs * Fix invalid protocol list struct gen * More codegen robustness * emit protocol table as const * Make protocol table anon struct * Fix callable type, generate protocol_list_t properly. * Cast vthis to argtype * Handle protorefs and classrefs properly * seperate label ref and deref * Fix method lookup * Enable objective-c tests * Enable objc_call_static test * Scan both classes and protocols for method ref * Enable objective-c tests on arm as well. * supress objc linker warning in tests * Fix class and protocol gen structure * Fix objc_protocol_sections test * ObjcMethod only get callee for functions with bodies * Fix protocol class method gen * Make ObjcMethod anon again * Fix missing emit calls * Fix classref gen * Implement some of the requested changes * Enable compilable tests * Fix property selector gen, ugly hack for final funcs. * Fix segfault in referencing fd->type * Refactor implementation * Fix null references in class and method lookup * include unordered_map * Get functionality on-par with prev impl. * Fix super context calls * Move -L-w flag to d_do_test and use IN_LLVM in objc.d/h * add LDC version tag to -L-w flag * Update CHANGELOG.md
This commit is contained in:
parent
a1e694c16b
commit
82878ef32c
42 changed files with 1568 additions and 195 deletions
|
@ -140,16 +140,31 @@ llvm::FunctionType *DtoFunctionType(Type *type, IrFuncTy &irFty, Type *thistype,
|
|||
}
|
||||
|
||||
bool hasObjCSelector = false;
|
||||
if (fd && fd->_linkage == LINK::objc && thistype) {
|
||||
if (fd && fd->_linkage == LINK::objc) {
|
||||
auto ftype = (TypeFunction*)fd->type;
|
||||
|
||||
if (fd->objc.selector) {
|
||||
hasObjCSelector = true;
|
||||
} else if (fd->parent->isClassDeclaration()) {
|
||||
error(fd->loc, "%s `%s` is missing Objective-C `@selector`", fd->kind(),
|
||||
fd->toPrettyChars());
|
||||
if(fd->isFinal() || ftype->isproperty()) {
|
||||
|
||||
// HACK: Ugly hack, but final functions for some reason don't actually declare a selector.
|
||||
// However, this does make it more flexible.
|
||||
// Also this will automatically generate selectors for @property declared
|
||||
// functions, which the DIP specifies.
|
||||
// Final function selector gen should be fixed, however.
|
||||
fd->objc.selector = ObjcSelector::create(fd);
|
||||
hasObjCSelector = true;
|
||||
} else {
|
||||
error(fd->loc, "%s `%s` is missing Objective-C `@selector`", fd->kind(),
|
||||
fd->toPrettyChars());
|
||||
}
|
||||
}
|
||||
}
|
||||
if (hasObjCSelector) {
|
||||
// TODO: make arg_objcselector to match dmd type
|
||||
|
||||
// SEL is in libobjc an opaque pointer.
|
||||
// As such a void* is fine.
|
||||
newIrFty.arg_objcSelector = new IrFuncTyArg(Type::tvoidptr, false);
|
||||
++nextLLArgIdx;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue