mirror of
https://github.com/darlinghq/darling-objc4.git
synced 2025-03-01 10:48:37 +00:00
128 lines
4.6 KiB
Objective-C
128 lines
4.6 KiB
Objective-C
/*
|
|
TEST_BUILD
|
|
$C{COMPILE} $DIR/concurrentcat.m -o concurrentcat.exe -framework Foundation
|
|
|
|
$C{COMPILE} -bundle -bundle_loader concurrentcat.exe -framework Foundation $DIR/concurrentcat_category.m -DTN=cc1 -o cc1.bundle
|
|
$C{COMPILE} -bundle -bundle_loader concurrentcat.exe -framework Foundation $DIR/concurrentcat_category.m -DTN=cc2 -o cc2.bundle
|
|
$C{COMPILE} -bundle -bundle_loader concurrentcat.exe -framework Foundation $DIR/concurrentcat_category.m -DTN=cc3 -o cc3.bundle
|
|
$C{COMPILE} -bundle -bundle_loader concurrentcat.exe -framework Foundation $DIR/concurrentcat_category.m -DTN=cc4 -o cc4.bundle
|
|
$C{COMPILE} -bundle -bundle_loader concurrentcat.exe -framework Foundation $DIR/concurrentcat_category.m -DTN=cc5 -o cc5.bundle
|
|
$C{COMPILE} -bundle -bundle_loader concurrentcat.exe -framework Foundation $DIR/concurrentcat_category.m -DTN=cc6 -o cc6.bundle
|
|
$C{COMPILE} -bundle -bundle_loader concurrentcat.exe -framework Foundation $DIR/concurrentcat_category.m -DTN=cc7 -o cc7.bundle
|
|
$C{COMPILE} -bundle -bundle_loader concurrentcat.exe -framework Foundation $DIR/concurrentcat_category.m -DTN=cc8 -o cc8.bundle
|
|
$C{COMPILE} -bundle -bundle_loader concurrentcat.exe -framework Foundation $DIR/concurrentcat_category.m -DTN=cc9 -o cc9.bundle
|
|
$C{COMPILE} -bundle -bundle_loader concurrentcat.exe -framework Foundation $DIR/concurrentcat_category.m -DTN=cc10 -o cc10.bundle
|
|
$C{COMPILE} -bundle -bundle_loader concurrentcat.exe -framework Foundation $DIR/concurrentcat_category.m -DTN=cc11 -o cc11.bundle
|
|
$C{COMPILE} -bundle -bundle_loader concurrentcat.exe -framework Foundation $DIR/concurrentcat_category.m -DTN=cc12 -o cc12.bundle
|
|
$C{COMPILE} -bundle -bundle_loader concurrentcat.exe -framework Foundation $DIR/concurrentcat_category.m -DTN=cc13 -o cc13.bundle
|
|
$C{COMPILE} -bundle -bundle_loader concurrentcat.exe -framework Foundation $DIR/concurrentcat_category.m -DTN=cc14 -o cc14.bundle
|
|
$C{COMPILE} -bundle -bundle_loader concurrentcat.exe -framework Foundation $DIR/concurrentcat_category.m -DTN=cc15 -o cc15.bundle
|
|
END
|
|
*/
|
|
|
|
#include "test.h"
|
|
#include <objc/runtime.h>
|
|
#include <objc/objc-auto.h>
|
|
#include <dlfcn.h>
|
|
#include <unistd.h>
|
|
#include <pthread.h>
|
|
#include <Foundation/Foundation.h>
|
|
|
|
@interface TargetClass : NSObject
|
|
@end
|
|
|
|
@interface TargetClass(LoadedMethods)
|
|
- (void) m0;
|
|
- (void) m1;
|
|
- (void) m2;
|
|
- (void) m3;
|
|
- (void) m4;
|
|
- (void) m5;
|
|
- (void) m6;
|
|
- (void) m7;
|
|
- (void) m8;
|
|
- (void) m9;
|
|
- (void) m10;
|
|
- (void) m11;
|
|
- (void) m12;
|
|
- (void) m13;
|
|
- (void) m14;
|
|
- (void) m15;
|
|
@end
|
|
|
|
@implementation TargetClass
|
|
- (void) m0 { fail("shoulda been loaded!"); }
|
|
- (void) m1 { fail("shoulda been loaded!"); }
|
|
- (void) m2 { fail("shoulda been loaded!"); }
|
|
- (void) m3 { fail("shoulda been loaded!"); }
|
|
- (void) m4 { fail("shoulda been loaded!"); }
|
|
- (void) m5 { fail("shoulda been loaded!"); }
|
|
- (void) m6 { fail("shoulda been loaded!"); }
|
|
@end
|
|
|
|
void *threadFun(void *aTargetClassName) {
|
|
const char *className = (const char *)aTargetClassName;
|
|
|
|
PUSH_POOL {
|
|
|
|
Class targetSubclass = objc_getClass(className);
|
|
testassert(targetSubclass);
|
|
|
|
id target = [targetSubclass new];
|
|
testassert(target);
|
|
|
|
while(1) {
|
|
[target m0];
|
|
RETAIN(target);
|
|
[target addObserver: target forKeyPath: @"m3" options: 0 context: NULL];
|
|
[target addObserver: target forKeyPath: @"m4" options: 0 context: NULL];
|
|
[target m1];
|
|
RELEASE_VALUE(target);
|
|
[target m2];
|
|
AUTORELEASE(target);
|
|
[target m3];
|
|
RETAIN(target);
|
|
[target removeObserver: target forKeyPath: @"m4"];
|
|
[target addObserver: target forKeyPath: @"m5" options: 0 context: NULL];
|
|
[target m4];
|
|
RETAIN(target);
|
|
[target m5];
|
|
AUTORELEASE(target);
|
|
[target m6];
|
|
[target m7];
|
|
[target m8];
|
|
[target m9];
|
|
[target m10];
|
|
[target m11];
|
|
[target m12];
|
|
[target m13];
|
|
[target m14];
|
|
[target m15];
|
|
[target removeObserver: target forKeyPath: @"m3"];
|
|
[target removeObserver: target forKeyPath: @"m5"];
|
|
}
|
|
} POP_POOL;
|
|
return NULL;
|
|
}
|
|
|
|
int main()
|
|
{
|
|
int i;
|
|
|
|
void *dylib;
|
|
|
|
for(i=1; i<16; i++) {
|
|
pthread_t t;
|
|
char dlName[100];
|
|
sprintf(dlName, "cc%d.bundle", i);
|
|
dylib = dlopen(dlName, RTLD_LAZY);
|
|
char className[100];
|
|
sprintf(className, "cc%d", i);
|
|
pthread_create(&t, NULL, threadFun, strdup(className));
|
|
testassert(dylib);
|
|
}
|
|
sleep(1);
|
|
|
|
succeed(__FILE__);
|
|
}
|