mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
of adding a property. This better matches what the actual implementation expects, and it avoids some possibilities of weird mismatches. However, it also requires special-case initialization, destruction, and dynamic-layout support, none of which I've added yet. In order to get NSObject default actor subclasses to use Swift refcounting (and thus avoid the need for the default actor runtime to generally use ObjC refcounting), I've had to introduce a SwiftNativeNSObject which we substitute as the superclass when inheriting directly from NSObject. This is something we could do in all NSObject subclasses; for now, I'm just doing it in actors, although it's all actors and not just default actors. We are not yet taking advantage of our special knowledge of this class anywhere except the reference-counting code. I went around in circles exploring a number of alternatives for doing this; at one point I basically had a completely parallel "ForImplementation" superclass query. That proved to be a lot of added complexity and created more problems than it solved. We also don't *really* get any benefit from this subclassing because there still wouldn't be a consistent superclass for all actors. So instead it's very ad-hoc.
71 lines
2.0 KiB
Plaintext
71 lines
2.0 KiB
Plaintext
//===--- SwiftNativeNSObject.mm - NSObject-inheriting native class --------===//
|
|
//
|
|
// This source file is part of the Swift.org open source project
|
|
//
|
|
// Copyright (c) 2014 - 2020 Apple Inc. and the Swift project authors
|
|
// Licensed under Apache License v2.0 with Runtime Library Exception
|
|
//
|
|
// See https://swift.org/LICENSE.txt for license information
|
|
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// Define the SwiftNativeNSObject class, which inherits from
|
|
// NSObject but uses Swift reference-counting.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "swift/Runtime/Config.h"
|
|
|
|
#if SWIFT_OBJC_INTEROP
|
|
#import <Foundation/Foundation.h>
|
|
#import <CoreFoundation/CoreFoundation.h>
|
|
#include <objc/NSObject.h>
|
|
#include <objc/runtime.h>
|
|
#include <objc/objc.h>
|
|
#include "swift/Runtime/HeapObject.h"
|
|
#include "swift/Runtime/Metadata.h"
|
|
#include "swift/Runtime/ObjCBridge.h"
|
|
|
|
using namespace swift;
|
|
|
|
SWIFT_RUNTIME_STDLIB_API
|
|
@interface SwiftNativeNSObject : NSObject
|
|
{
|
|
@private
|
|
SWIFT_HEAPOBJECT_NON_OBJC_MEMBERS;
|
|
}
|
|
@end
|
|
|
|
@implementation SwiftNativeNSObject
|
|
|
|
+ (id)allocWithZone: (NSZone *)zone {
|
|
// Allocate the object with swift_allocObject().
|
|
// Note that this doesn't work if called on SwiftNativeNSObject itself,
|
|
// which is not a Swift class.
|
|
auto cls = cast<ClassMetadata>(reinterpret_cast<const HeapMetadata *>(self));
|
|
assert(cls->isTypeMetadata());
|
|
auto result = swift_allocObject(cls, cls->getInstanceSize(),
|
|
cls->getInstanceAlignMask());
|
|
return reinterpret_cast<id>(result);
|
|
}
|
|
|
|
- (id)initWithCoder: (NSCoder *)coder {
|
|
return [super init];
|
|
}
|
|
|
|
+ (BOOL)automaticallyNotifiesObserversForKey:(NSString *)key {
|
|
return NO;
|
|
}
|
|
|
|
#pragma clang diagnostic push
|
|
#pragma clang diagnostic ignored "-Wobjc-missing-super-calls"
|
|
|
|
STANDARD_OBJC_METHOD_IMPLS_FOR_SWIFT_OBJECTS
|
|
|
|
#pragma clang diagnostic pop
|
|
|
|
@end
|
|
|
|
#endif
|