blob: 7a313bf70d8bff3751f40620838bdbb908192c1a [file] [log] [blame]
// Copyright (c) 2024, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
#import <dispatch/dispatch.h>
#define DISABLE_METHOD 1
#include "protocol_test.h"
const char* class_getName(Class cls);
const char* getClassName(void* cls) {
return class_getName((__bridge Class)cls);
}
void* getClass(id object) {
return (__bridge void*)[object class];
}
@implementation ProtocolConsumer : NSObject
- (NSString*)callInstanceMethod:(id<SuperProtocol>)protocol {
return [protocol instanceMethod:@"Hello from ObjC" withDouble:3.14];
}
- (int32_t)callOptionalMethod:(id<MyProtocol>)protocol {
if ([protocol respondsToSelector:@selector(optionalMethod:)]) {
SomeStruct s = {123, 456};
return [protocol optionalMethod:s];
} else {
return -999;
}
}
- (int32_t)callOtherMethod:(id<SecondaryProtocol>)protocol {
return [protocol otherMethod:1 b:2 c:3 d:4];
}
- (void)callMethodOnRandomThread:(id<MyProtocol>)protocol {
dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0), ^{
[protocol voidMethod:123];
});
}
- (void)callBlockingMethodOnRandomThread:(id<MyProtocol>)protocol {
dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0), ^{
int32_t x;
[protocol intPtrMethod:&x];
[protocol voidMethod:x];
});
}
- (int32_t)callTwoMethods:(id<MyProtocol, SecondaryProtocol>)protocol {
SomeStruct s = {123, 345};
int32_t x = [protocol optionalMethod:s];
return [protocol otherMethod:x b:1 c:10 d:100];
}
@end
@implementation ObjCProtocolImpl
- (NSString *)instanceMethod:(NSString *)s withDouble:(double)x {
return [NSString stringWithFormat:@"ObjCProtocolImpl: %@: %.2f", s, x];
}
- (int32_t)optionalMethod:(SomeStruct)s {
return s.x + s.y;
}
- (int32_t)otherMethod:(int32_t)a b:(int32_t)b c:(int32_t)c d:(int32_t)d {
return a + b + c + d;
}
- (int32_t)fooMethod {
return 2468;
}
+ (int32_t)requiredClassMethod {
return 9876;
}
+ (int32_t)optionalClassMethod {
return 5432;
}
- (id<MyProtocol>)returnsMyProtocol {
return self;
}
@end
@implementation ObjCProtocolImplMissingMethod
- (NSString *)instanceMethod:(NSString *)s withDouble:(double)x {
return @"ObjCProtocolImplMissingMethod";
}
@end