> On Dec 28, 2015, at 3:10 PM, Luke Howard <lu...@padl.com> wrote:
> 
> 
>> On 29 Dec 2015, at 3:01 AM, Philippe Hausler <phaus...@apple.com> wrote:
>> 
>> Not certain what you mean there; each NSValue is just a identity of a key in 
>> a dictionary to a NSConcreteValue that the methods forward to? That would 
>> mean that each method call would be a dictionary lookup… that does not sound 
>> scalable from a performance standpoint.
> 
> Although didn’t NSObject do something similar for managing the retain count 
> when it didn’t fit inline? I’m too lazy to go look it up...
> 
> — Luke

Yea the objc runtime has side tables for things like that; I guess I would have 
to see a proposed implementation and play with it to see what the performance 
hit would be like.

So you were thinking something like (note this is just something I drafted in a 
few minutes so it is a bit rough):

diff --git a/Foundation/NSDecimalNumber.swift b/Foundation/NSDecimalNumber.swift
index 927be14..2e6791f 100644
--- a/Foundation/NSDecimalNumber.swift
+++ b/Foundation/NSDecimalNumber.swift
@@ -96,7 +96,7 @@ public class NSDecimalNumber : NSNumber {
     //   ignore exactnessException
     //   raise on overflow, underflow and divide by zero.
     
-    public var objCType: UnsafePointer<Int8> { NSUnimplemented() }
+    public override var objCType: UnsafePointer<Int8> { NSUnimplemented() }
     // return 'd' for double
     
     public override var doubleValue: Double { NSUnimplemented() }
diff --git a/Foundation/NSValue.swift b/Foundation/NSValue.swift
index eefb3b9..6f495a0 100644
--- a/Foundation/NSValue.swift
+++ b/Foundation/NSValue.swift
@@ -8,10 +8,68 @@
 //
 
 
+internal class NSConcreteValue : NSValue {
+    internal var _value: UnsafeMutablePointer<Void> = nil
+    internal var _size: Int = 0
+    internal var _objCType: UnsafePointer<Int8> = nil
+    
+    internal override init() {
+        super.init()
+    }
+
+    required init?(coder aDecoder: NSCoder) {
+        NSUnimplemented()
+    }
+    
+    override func getValue(value: UnsafeMutablePointer<Void>) {
+        value.assignFrom(_value, count: _size)
+    }
+    
+    override var objCType: UnsafePointer<Int8> {
+        return _objCType
+    }
+}
+
+private var _NSValueSideTable = [ObjectIdentifier : NSConcreteValue]()
+private var _NSValueSideTableLock = NSLock()
+
 public class NSValue : NSObject, NSCopying, NSSecureCoding, NSCoding {
     
     internal override init() {
-        
+        super.init()
+        if self.dynamicType == NSValue.self {
+            _NSValueSideTableLock.synchronized {
+                _NSValueSideTable[ObjectIdentifier(self)] = NSConcreteValue()
+            }
+        }
+    }
+    
+    deinit {
+        if self.dynamicType == NSValue.self {
+            _NSValueSideTableLock.synchronized {
+                _NSValueSideTable[ObjectIdentifier(self)] = nil
+            }
+        }
+    }
+    
+    public func getValue(value: UnsafeMutablePointer<Void>) {
+        if self.dynamicType == NSValue.self {
+            _NSValueSideTableLock.synchronized {
+                _NSValueSideTable[ObjectIdentifier(self)]!.getValue(value)
+            }
+        } else {
+            NSRequiresConcreteImplementation()
+        }
+    }
+    
+    public var objCType: UnsafePointer<Int8> {
+        if self.dynamicType == NSValue.self {
+            return _NSValueSideTableLock.synchronized {
+                return _NSValueSideTable[ObjectIdentifier(self)]!.objCType
+            }
+        } else {
+            NSRequiresConcreteImplementation()
+        }
     }
     
     public required init?(coder aDecoder: NSCoder) {

_______________________________________________
swift-corelibs-dev mailing list
swift-corelibs-dev@swift.org
https://lists.swift.org/mailman/listinfo/swift-corelibs-dev

Reply via email to