Index: configure.ac ================================================================== --- configure.ac +++ configure.ac @@ -659,10 +659,11 @@ AC_SUBST(RUNTIME_AUTORELEASE_M, "runtime/autorelease.m") ]) AC_CHECK_FUNC(objc_constructInstance, [], [ AC_SUBST(RUNTIME_INSTANCE_M, "runtime/instance.m") ]) + AC_CHECK_FUNCS(objc_setAssociatedObject) OBJCFLAGS="$old_OBJCFLAGS" ;; esac Index: src/OFDNSResolver.m ================================================================== --- src/OFDNSResolver.m +++ src/OFDNSResolver.m @@ -876,12 +876,12 @@ removeList = [OFMutableArray arrayWithCapacity: _cache.count]; for (OFDNSQuery *query in _cache) { OFPair OF_GENERIC(OFDate *, OFDNSResponse *) *entry = [_cache objectForKey: query]; - uint32_t age = - (uint32_t)now - [entry.firstObject timeIntervalSince1970]; + uint32_t age = (uint32_t)now - + (uint32_t)[entry.firstObject timeIntervalSince1970]; OFDNSResponse *response = entry.secondObject; if (containsExpiredRecord(response.answerRecords, age) || containsExpiredRecord(response.authorityRecords, age) || containsExpiredRecord(response.additionalRecords, age)) Index: src/runtime/instance.m ================================================================== --- src/runtime/instance.m +++ src/runtime/instance.m @@ -100,9 +100,11 @@ last = destruct; } else break; } +#if defined(OF_OBJFW_RUNTIME) || defined(HAVE_OBJC_SETASSOCIATEDOBJECT) objc_removeAssociatedObjects(object); +#endif return object; } Index: src/test/OTAppDelegate.m ================================================================== --- src/test/OTAppDelegate.m +++ src/test/OTAppDelegate.m @@ -147,36 +147,43 @@ #endif } - (OFMutableSet OF_GENERIC(Class) *)testClasses { - Class *classes = objc_copyClassList(NULL); + Class *classes; + int classesCount; OFMutableSet *testClasses; - if (classes == NULL) + classesCount = objc_getClassList(NULL, 0); + if (classesCount < 1) return nil; + classes = OFAllocMemory(classesCount, sizeof(Class)); @try { + if ((int)objc_getClassList(classes, classesCount) != + classesCount) + return nil; + testClasses = [OFMutableSet set]; - for (Class *iter = classes; *iter != Nil; iter++) { + for (int i = 0; i < classesCount; i++) { /* * Make sure the class is initialized. * Required for the ObjFW runtime, as otherwise * class_getSuperclass() crashes. */ #ifdef OF_OBJFW_RUNTIME - [*iter class]; + [classes[i] class]; #endif /* * Don't use +[isSubclassOfClass:], as the Apple runtime * can return (presumably internal?) classes that don't * implement it, resulting in a crash. */ - if (isSubclassOfClass(*iter, [OTTestCase class])) - [testClasses addObject: *iter]; + if (isSubclassOfClass(classes[i], [OTTestCase class])) + [testClasses addObject: classes[i]]; } } @finally { OFFreeMemory(classes); } Index: tests/RuntimeTests.m ================================================================== --- tests/RuntimeTests.m +++ tests/RuntimeTests.m @@ -84,10 +84,11 @@ _test.bar = string; OTAssertEqual(_test.bar, string); OTAssertEqual(string.retainCount, 3); } +#if defined(OF_OBJFW_RUNTIME) || defined(HAVE_OBJC_SETASSOCIATEDOBJECT) - (void)testAssociatedObjects { objc_setAssociatedObject(self, testKey, _test, OBJC_ASSOCIATION_ASSIGN); OTAssertEqual(_test.retainCount, 1); @@ -108,10 +109,11 @@ OTAssertEqual(_test.retainCount, 3); objc_removeAssociatedObjects(self); OTAssertEqual(_test.retainCount, 2); } +#endif #ifdef OF_OBJFW_RUNTIME - (void)testTaggedPointers { int classID;