summaryrefslogtreecommitdiff
path: root/swift/src
diff options
context:
space:
mode:
authorJose <jose@zeroc.com>2019-03-09 21:13:01 +0100
committerJose <jose@zeroc.com>2019-03-09 21:13:01 +0100
commit32047cdd87984b54e1ac80b161e288f32f93d51a (patch)
treeb6089bbd57e900188e069330187e67da7face46a /swift/src
parentValue marshalling fixes (diff)
downloadice-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.swift63
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()
}
}