From 0cb6115c7e941fabbdfab68129a970bf88d8b19e Mon Sep 17 00:00:00 2001 From: Thomas Visser Date: Sun, 28 Mar 2021 21:17:08 +0200 Subject: [PATCH 1/2] Add used attribute to IKTAddSuperImplementationToClass to prevent the compiler from optimizing it away --- Sources/SuperBuilder/src/ITKSuperBuilder.m | 1 + 1 file changed, 1 insertion(+) diff --git a/Sources/SuperBuilder/src/ITKSuperBuilder.m b/Sources/SuperBuilder/src/ITKSuperBuilder.m index 9101052..8a2c1d3 100644 --- a/Sources/SuperBuilder/src/ITKSuperBuilder.m +++ b/Sources/SuperBuilder/src/ITKSuperBuilder.m @@ -37,6 +37,7 @@ static IMP ITKGetTrampolineForTypeEncoding(__unused const char *typeEncoding) { } // Helper for binding with Swift +__attribute__((__used__)) BOOL IKTAddSuperImplementationToClass(Class originalClass, SEL selector, NSError **error); BOOL IKTAddSuperImplementationToClass(Class originalClass, SEL selector, NSError **error) { return [SuperBuilder addSuperInstanceMethodToClass:originalClass selector:selector error:error]; From b60136e3d13d7d4088a2041cf94d72a6e20e1041 Mon Sep 17 00:00:00 2001 From: Thomas Visser Date: Tue, 30 Mar 2021 20:10:18 +0200 Subject: [PATCH 2/2] Call SuperBuilder.addSuperInstanceMethod(to:selector:) directly --- Sources/InterposeKit/InterposeSubclass.swift | 16 ++++++---------- Sources/SuperBuilder/src/ITKSuperBuilder.m | 7 ------- 2 files changed, 6 insertions(+), 17 deletions(-) diff --git a/Sources/InterposeKit/InterposeSubclass.swift b/Sources/InterposeKit/InterposeSubclass.swift index 7752ce1..059fad8 100644 --- a/Sources/InterposeKit/InterposeSubclass.swift +++ b/Sources/InterposeKit/InterposeSubclass.swift @@ -1,4 +1,5 @@ import Foundation +import SuperBuilder class InterposeSubclass { @@ -90,19 +91,14 @@ class InterposeSubclass { NSClassFromString("SuperBuilder")?.value(forKey: "isSupportedArchitecure") as? Bool ?? false } - private lazy var addSuperImpl: @convention(c) (AnyClass, Selector, NSErrorPointer) -> Bool = { - let handle = dlopen(nil, RTLD_LAZY) - let imp = dlsym(handle, "IKTAddSuperImplementationToClass") - return unsafeBitCast(imp, to: (@convention(c) (AnyClass, Selector, NSErrorPointer) -> Bool).self) - }() - func addSuperTrampoline(selector: Selector) { - var error: NSError? - if addSuperImpl(dynamicClass, selector, &error) == false { - Interpose.log("Failed to add super implementation to -[\(dynamicClass).\(selector)]: \(error!)") - } else { + do { + try SuperBuilder.addSuperInstanceMethod(to: dynamicClass, selector: selector) + let imp = class_getMethodImplementation(dynamicClass, selector)! Interpose.log("Added super for -[\(dynamicClass).\(selector)]: \(imp)") + } catch { + Interpose.log("Failed to add super implementation to -[\(dynamicClass).\(selector)]: \(error)") } } #else diff --git a/Sources/SuperBuilder/src/ITKSuperBuilder.m b/Sources/SuperBuilder/src/ITKSuperBuilder.m index 8a2c1d3..a96d528 100644 --- a/Sources/SuperBuilder/src/ITKSuperBuilder.m +++ b/Sources/SuperBuilder/src/ITKSuperBuilder.m @@ -36,13 +36,6 @@ static IMP ITKGetTrampolineForTypeEncoding(__unused const char *typeEncoding) { return requiresStructDispatch ? (IMP)msgSendSuperStretTrampoline : (IMP)msgSendSuperTrampoline; } -// Helper for binding with Swift -__attribute__((__used__)) -BOOL IKTAddSuperImplementationToClass(Class originalClass, SEL selector, NSError **error); -BOOL IKTAddSuperImplementationToClass(Class originalClass, SEL selector, NSError **error) { - return [SuperBuilder addSuperInstanceMethodToClass:originalClass selector:selector error:error]; -} - #define ERROR_AND_RETURN(CODE, STRING)\ if (error) { *error = [NSError errorWithDomain:SuperBuilderErrorDomain code:CODE userInfo:@{NSLocalizedDescriptionKey: STRING}];} return NO;