#include "test.h" #include <objc/runtime.h> #include <dlfcn.h> #include "cacheflush.h" @interface Sub : Super @end @implementation Sub @end int main() { uintptr_t buf[10]; uintptr_t buf2[10]; buf[0] = (uintptr_t)[Super class]; buf2[0] = (uintptr_t)[Sub class]; // Fill method cache testassert(1 == [Super classMethod]); testassert(1 == [(Super *)buf instanceMethod]); testassert(1 == [Super classMethod]); testassert(1 == [(Super *)buf instanceMethod]); testassert(1 == [Sub classMethod]); testassert(1 == [(Sub *)buf2 instanceMethod]); testassert(1 == [Sub classMethod]); testassert(1 == [(Sub *)buf2 instanceMethod]); // Dynamically load a category dlopen("cacheflush2.out", 0); // Make sure old cache results are gone testassert(2 == [Super classMethod]); testassert(2 == [(Super *)buf instanceMethod]); testassert(2 == [Sub classMethod]); testassert(2 == [(Sub *)buf2 instanceMethod]); // Dynamically load another category dlopen("cacheflush3.out", 0); // Make sure old cache results are gone testassert(3 == [Super classMethod]); testassert(3 == [(Super *)buf instanceMethod]); testassert(3 == [Sub classMethod]); testassert(3 == [(Sub *)buf2 instanceMethod]); // fixme test subclasses // fixme test objc_flush_caches(), class_addMethod(), class_addMethods() succeed(__FILE__); }