255 строки
5.1 KiB
Objective-C
255 строки
5.1 KiB
Objective-C
#import <Foundation/Foundation.h>
|
|
|
|
#include <objc/runtime.h>
|
|
#include <zlib.h>
|
|
#include "libtest.h"
|
|
|
|
int
|
|
theUltimateAnswer ()
|
|
{
|
|
return 42;
|
|
}
|
|
|
|
void useZLib ()
|
|
{
|
|
printf ("ZLib version: %s\n", zlibVersion ());
|
|
}
|
|
|
|
@interface UltimateMachine : NSObject {
|
|
|
|
}
|
|
- (int) getAnswer;
|
|
+ (UltimateMachine *) sharedInstance;
|
|
@end
|
|
|
|
@implementation UltimateMachine
|
|
{
|
|
|
|
}
|
|
- (int) getAnswer
|
|
{
|
|
return 42;
|
|
}
|
|
|
|
static UltimateMachine *shared;
|
|
|
|
+ (UltimateMachine *) sharedInstance
|
|
{
|
|
if (shared == nil)
|
|
shared = [[UltimateMachine alloc] init];
|
|
return shared;
|
|
}
|
|
@end
|
|
|
|
@interface FakeType2 : NSObject {
|
|
}
|
|
-(BOOL) isKindOfClass: (Class) cls;
|
|
@end
|
|
|
|
@implementation FakeType2
|
|
{
|
|
}
|
|
- (BOOL) isKindOfClass: (Class) cls;
|
|
{
|
|
if (cls == objc_getClass ("FakeType1"))
|
|
return YES;
|
|
|
|
return [super isKindOfClass: cls];
|
|
}
|
|
@end
|
|
|
|
/*
|
|
* ObjC test class used for registrar tests.
|
|
*/
|
|
@implementation ObjCRegistrarTest
|
|
{
|
|
}
|
|
-(void) V
|
|
{
|
|
}
|
|
|
|
-(float) F
|
|
{
|
|
return _Pf1;
|
|
}
|
|
|
|
-(double) D
|
|
{
|
|
return _Pd1;
|
|
}
|
|
|
|
-(struct Sd) Sd
|
|
{
|
|
return _PSd1;
|
|
}
|
|
|
|
-(struct Sf) Sf
|
|
{
|
|
return _PSf1;
|
|
}
|
|
|
|
-(void) V:(int)i1 i:(int)i2 i:(int)i3 i:(int)i4 i:(int)i5 i:(int)i6 i:(int)i7
|
|
{
|
|
// x86_64: 6 in regs, 7th in mem.
|
|
_Pi1 = i1; _Pi2 = i2; _Pi3 = i3; _Pi4 = i4; _Pi5 = i5; _Pi6 = i6; _Pi7 = i7;
|
|
}
|
|
|
|
-(void) V:(float)f1 f:(float)f2 f:(float)f3 f:(float)f4 f:(float)f5 f:(float)f6 f:(float)f7 f:(float)f8 f:(float)f9
|
|
{
|
|
// x86_64: 8 in regs, 9th in mem.
|
|
_Pf1 = f1; _Pf2 = f2; _Pf3 = f3; _Pf4 = f4; _Pf5 = f5; _Pf6 = f6; _Pf7 = f7; _Pf8 = f8; _Pf9 = f9;
|
|
}
|
|
|
|
-(void) V:(int)i1 i:(int)i2 i:(int)i3 i:(int)i4 i:(int)i5 i:(int)i6 i:(int)i7 f:(float)f1 f:(float)f2 f:(float)f3 f:(float)f4 f:(float)f5 f:(float)f6 f:(float)f7 f:(float)f8 f:(float)f9
|
|
{
|
|
// x86_64: 6 ints in regs, 8 floats in in regs, 1 int in mem, 1 float in mem.
|
|
_Pi1 = i1; _Pi2 = i2; _Pi3 = i3; _Pi4 = i4; _Pi5 = i5; _Pi6 = i6; _Pi7 = i7;
|
|
_Pf1 = f1; _Pf2 = f2; _Pf3 = f3; _Pf4 = f4; _Pf5 = f5; _Pf6 = f6; _Pf7 = f7; _Pf8 = f8; _Pf9 = f9;
|
|
}
|
|
|
|
-(void) V:(double)d1 d:(double)d2 d:(double)d3 d:(double)d4 d:(double)d5 d:(double)d6 d:(double)d7 d:(double)d8 d:(double)d9
|
|
{
|
|
// x86_64: 8 in regs, 9th in mem.
|
|
_Pd1 = d1; _Pd2 = d2; _Pd3 = d3; _Pd4 = d4; _Pd5 = d5; _Pd6 = d6; _Pd7 = d7; _Pd8 = d8; _Pd9 = d9;
|
|
}
|
|
|
|
-(void) V:(int)i1 i:(int)i2 Siid:(struct Siid)s1 i:(int)i3 i:(int)i4 d:(double)d1 d:(double)d2 d:(double)d3 i:(int)i5 i:(int)i6 i:(int)i7
|
|
{
|
|
_Pi1 = i1; _Pi2 = i2; _PSiid1 = s1; _Pi3 = i3; _Pi4 = i4; _Pd1 = d1; _Pd2 = d2; _Pd3 = d2; _Pi5 = i5; _Pi6 = i6; _Pi7 = i7;
|
|
}
|
|
|
|
-(void) V:(int)i1 i:(int)i2 f:(float)f1 Siid:(struct Siid)s1 i:(int)i3 i:(int)i4 d:(double)d1 d:(double)d2 d:(double)d3 i:(int)i5 i:(int)i6 i:(int)i7
|
|
{
|
|
_Pi1 = i1; _Pi2 = i2; _Pf1 = f1; _PSiid1 = s1; _Pi3 = i3; _Pi4 = i4; _Pd1 = d1; _Pd2 = d2; _Pd3 = d3; _Pi5 = i5; _Pi6 = i6; _Pi7 = i7;
|
|
}
|
|
|
|
-(void) V:(char)c1 c:(char)c2 c:(char)c3 c:(char)c4 c:(char)c5 i:(int)i1 d:(double)d1
|
|
{
|
|
_Pc1 = c1; _Pc2 = c2; _Pc3 = c3; _Pc4 = c4; _Pc5 = c5; _Pi1 = i1; _Pd1 = d1;
|
|
}
|
|
|
|
|
|
/*
|
|
* Invoke method
|
|
*/
|
|
|
|
-(void) invoke_V
|
|
{
|
|
[self V];
|
|
}
|
|
|
|
-(float) invoke_F
|
|
{
|
|
return [self F];
|
|
}
|
|
|
|
-(double) invoke_D
|
|
{
|
|
return [self D];
|
|
}
|
|
|
|
-(struct Sf) Sf_invoke
|
|
{
|
|
return [self Sf];
|
|
}
|
|
|
|
/*
|
|
* API returning blocks.
|
|
*/
|
|
-(RegistrarTestBlock) methodReturningBlock
|
|
{
|
|
return nil;
|
|
}
|
|
|
|
-(bool) testBlocks
|
|
{
|
|
unsigned int output;
|
|
unsigned int expected;
|
|
unsigned int input;
|
|
|
|
input = 0xdeadf00d;
|
|
expected = 0x1337b001;
|
|
output = [self methodReturningBlock] (input);
|
|
if (output != expected) {
|
|
NSLog (@"methodReturningBlock didn't return the expected value 0x%x for the input value 0x%x, but got instead 0x%x.", expected, input, output);
|
|
return false;
|
|
}
|
|
|
|
input = 0xdeadf11d;
|
|
expected = 0x7b001133;
|
|
output = self.propertyReturningBlock (input);
|
|
if (output != expected) {
|
|
NSLog (@"propertyReturningBlock didn't return the expected value 0x%x for the input value 0x%x, but got instead 0x%x.", expected, input, output);
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
-(void) idAsIntPtr: (id)p1
|
|
{
|
|
// Nothing to do here.
|
|
}
|
|
@end
|
|
|
|
@implementation ObjCExceptionTest
|
|
{
|
|
}
|
|
-(void) throwObjCException
|
|
{
|
|
[NSException raise:@"Some exception" format:@"exception was thrown"];
|
|
}
|
|
|
|
-(void) throwManagedException
|
|
{
|
|
abort (); // this method should be overridden in managed code.
|
|
}
|
|
|
|
-(void) invokeManagedExceptionThrower
|
|
{
|
|
[self throwManagedException];
|
|
}
|
|
|
|
-(void) invokeManagedExceptionThrowerAndRethrow
|
|
{
|
|
@try {
|
|
[self throwManagedException];
|
|
} @catch (id exc) {
|
|
[NSException raise:@"Caught exception" format:@"exception was rethrown"];
|
|
}
|
|
}
|
|
-(void) invokeManagedExceptionThrowerAndCatch
|
|
{
|
|
@try {
|
|
[self throwManagedException];
|
|
} @catch (id exc) {
|
|
// do nothing
|
|
}
|
|
}
|
|
@end
|
|
|
|
@interface CtorChaining1 : NSObject
|
|
@property BOOL initCalled;
|
|
@property BOOL initCallsInitCalled;
|
|
-(instancetype) init;
|
|
-(instancetype) initCallsInit:(int) value;
|
|
@end
|
|
@implementation CtorChaining1
|
|
-(instancetype) init
|
|
{
|
|
self.initCalled = YES;
|
|
return [super init];
|
|
}
|
|
-(instancetype) initCallsInit:(int) value
|
|
{
|
|
self.initCallsInitCalled = YES;
|
|
return [self init];
|
|
}
|
|
@end
|
|
|
|
@implementation ObjCProtocolClassTest
|
|
-(void) idAsIntPtr: (id)p1
|
|
{
|
|
// Do nothing
|
|
}
|
|
@end |