93 lines
3.0 KiB
Objective-C
93 lines
3.0 KiB
Objective-C
// REQUIRES: x86-registered-target
|
|
// RUN: %clang_cc1 -emit-llvm -fblocks -fobjc-arc -debug-info-kind=limited -triple x86_64-apple-darwin10 %s -o - | FileCheck %s
|
|
|
|
// rdar://11562117
|
|
typedef unsigned int NSUInteger;
|
|
typedef long NSInteger;
|
|
typedef signed char BOOL;
|
|
|
|
#define nil ((void*) 0)
|
|
#define YES ((BOOL)1)
|
|
#define NO ((BOOL)0)
|
|
|
|
@interface NSObject
|
|
- (id)init;
|
|
@end
|
|
|
|
@interface NSError : NSObject
|
|
@end
|
|
|
|
@interface NSString : NSObject
|
|
@end
|
|
|
|
@interface NSString (NSStringExtensionMethods)
|
|
- (void)enumerateLinesUsingBlock:(void (^)(NSString *line, BOOL *stop))block;
|
|
@end
|
|
|
|
@interface NSData : NSObject
|
|
@end
|
|
|
|
@interface NSData (ASBase64)
|
|
- (NSString *)encodedString:(NSInteger)position;
|
|
- (NSData *)compressedData;
|
|
@end
|
|
|
|
typedef void (^TDataCompletionBlock)(NSData *data, NSError *error);
|
|
@interface TMap : NSObject
|
|
- (NSString *)identifier;
|
|
- (NSString *)name;
|
|
+ (TMap *)mapForID:(NSString *)identifier;
|
|
- (void)dataWithCompletionBlock:(TDataCompletionBlock)block;
|
|
@end
|
|
|
|
typedef enum : NSUInteger {
|
|
TOK = 100,
|
|
TError = 125,
|
|
} TResponseCode;
|
|
|
|
@interface TConnection : NSObject
|
|
- (void)sendString:(NSString *)string;
|
|
- (void)sendFormat:(NSString *)format, ...;
|
|
- (void)sendResponseCode:(TResponseCode)responseCode dataFollows:(BOOL)flag
|
|
format:(NSString *)format, ...;
|
|
@end
|
|
|
|
@interface TServer : NSObject
|
|
@end
|
|
|
|
@implementation TServer
|
|
- (void)serverConnection:(TConnection *)connection getCommand:(NSString *)str
|
|
{
|
|
NSString *mapID = nil;
|
|
TMap *map = [TMap mapForID:mapID];
|
|
// Make sure we do not map code generated for the block to the above line.
|
|
// CHECK: define internal void @"__39-[TServer serverConnection:getCommand:]_block_invoke"
|
|
// CHECK: call void @llvm.objc.storeStrong(i8** [[ZERO:%.*]], i8* [[ONE:%.*]]) [[NUW:#[0-9]+]]
|
|
// CHECK: call void @llvm.objc.storeStrong(i8** [[TWO:%.*]], i8* [[THREE:%.*]]) [[NUW]]
|
|
// CHECK: call {{.*}}@objc_msgSend{{.*}}, !dbg ![[LINE_ABOVE:[0-9]+]]
|
|
// CHECK: getelementptr
|
|
// CHECK-NOT: !dbg, ![[LINE_ABOVE]]
|
|
// CHECK: bitcast %5** [[TMP:%.*]] to i8**
|
|
// CHECK-NOT: !dbg, ![[LINE_ABOVE]]
|
|
// CHECK: call void @llvm.objc.storeStrong(i8** [[VAL1:%.*]], i8* null) [[NUW]]
|
|
// CHECK-NEXT: bitcast %4** [[TMP:%.*]] to i8**
|
|
// CHECK-NEXT: call void @llvm.objc.storeStrong(i8** [[VAL2:%.*]], i8* null) [[NUW]]
|
|
// CHECK-NEXT: ret
|
|
// CHECK: attributes [[NUW]] = { nounwind }
|
|
[map dataWithCompletionBlock:^(NSData *data, NSError *error) {
|
|
if (data) {
|
|
NSString *encoded = [[data compressedData] encodedString:18];
|
|
[connection sendResponseCode:TOK dataFollows:YES
|
|
format:@"Sending \"%@\" (%@)", [map name], [map identifier]];
|
|
[encoded enumerateLinesUsingBlock:^(NSString *line, BOOL *stop) {
|
|
[connection sendFormat:@"%@\r\n", line];
|
|
}];
|
|
[connection sendString:@".\r\n"];
|
|
} else {
|
|
[connection sendResponseCode:TError dataFollows:NO
|
|
format:@"Failed \"%@\" (%@)", [map name], [map identifier]];
|
|
}
|
|
}];
|
|
}
|
|
@end
|