diff options
author | Jose <jose@zeroc.com> | 2019-03-09 21:13:01 +0100 |
---|---|---|
committer | Jose <jose@zeroc.com> | 2019-03-09 21:13:01 +0100 |
commit | 32047cdd87984b54e1ac80b161e288f32f93d51a (patch) | |
tree | b6089bbd57e900188e069330187e67da7face46a /swift/src | |
parent | Value marshalling fixes (diff) | |
download | ice-32047cdd87984b54e1ac80b161e288f32f93d51a.tar.bz2 ice-32047cdd87984b54e1ac80b161e288f32f93d51a.tar.xz ice-32047cdd87984b54e1ac80b161e288f32f93d51a.zip |
Swift class resolver updates
Diffstat (limited to 'swift/src')
-rw-r--r-- | swift/src/Ice/ClassResolver.swift | 63 |
1 files changed, 23 insertions, 40 deletions
diff --git a/swift/src/Ice/ClassResolver.swift b/swift/src/Ice/ClassResolver.swift index fe573d1b41a..ba00502c0c7 100644 --- a/swift/src/Ice/ClassResolver.swift +++ b/swift/src/Ice/ClassResolver.swift @@ -9,58 +9,41 @@ import Foundation +open class ValueTypeResolver: NSObject { + open func type() -> Value.Type { + precondition(false, "Abstract method") + } +} + +open class UserExceptionTypeResolver: NSObject { + open func type() -> UserException.Type { + precondition(false, "Abstract method") + } +} + // -// Slice classes and exceptions extend Ice.ClassResolver with a static func -// which returns the Swift Value.Type or UserException.Type. -// -// We subclass NSObject so that we can use selectors. +// Slice classes and exceptions generate an extesion for +// Ice.ClassResolver with a static func which returns a +// ValueTypeRessolver or UserExceptionTypeRessolver. // -// @objc dynamic Module_MyClass() -> Value.Type public class ClassResolver: NSObject { - private static func mangle(typeId: String) -> String { - precondition(typeId.count > 2, "invalid type id") - - guard let r = typeId.range(of: "::") else { - preconditionFailure("invalid type id") - } - - precondition(r.lowerBound == typeId.startIndex, "invalid type id") - - let c = typeId.components(separatedBy: "::")[1...] - return c.joined(separator: "_") - } - - static func resolve(typeId: String) -> Value.Type? { - let selector = Selector(mangle(typeId: typeId)) + static private func resolveImpl(typeId: String) -> AnyObject? { + let start = typeId.index(typeId.startIndex, offsetBy: 2) + let selector = Selector(typeId[start...].replacingOccurrences(of: "::", with: "_")) guard ClassResolver.responds(to: selector) else { return nil } + return ClassResolver.perform(selector).takeUnretainedValue() + } - #warning("TODO: check this is correct wrt memory management") - let val = ClassResolver.perform(Selector(mangle(typeId: typeId))).takeRetainedValue() - - guard let valueType = val as? Value.Type else { - preconditionFailure("unexpected value type") - } - return valueType + static func resolve(typeId: String) -> Value.Type? { + return (resolveImpl(typeId: typeId) as! ValueTypeResolver).type() } static func resolve(typeId: String) -> UserException.Type? { - let selector = Selector(mangle(typeId: typeId)) - - guard ClassResolver.responds(to: selector) else { - return nil - } - - #warning("TODO: check this is correct wrt memory management") - let val = ClassResolver.perform(selector).takeRetainedValue() - - guard let valueType = val as? UserException.Type else { - preconditionFailure("unexpected value type") - } - return valueType + return (resolveImpl(typeId: typeId) as! UserExceptionTypeResolver).type() } } |