Native: improve thread state switches for NSSet/NSDictionary adapters

^KT-54119
This commit is contained in:
Svyatoslav Scherbina
2022-09-21 10:56:30 +02:00
committed by Space
parent 1630386712
commit 39c73e25a4
6 changed files with 161 additions and 13 deletions
@@ -1079,6 +1079,25 @@ __attribute__((swift_name("Bar")))
@property (readonly) NSString *farewell __attribute__((swift_name("farewell")));
@end
__attribute__((objc_subclassing_restricted))
__attribute__((swift_name("KT54119KotlinKey")))
@interface KtKT54119KotlinKey : KtBase
- (instancetype)init __attribute__((swift_name("init()"))) __attribute__((objc_designated_initializer));
+ (instancetype)new __attribute__((availability(swift, unavailable, message="use object initializers instead")));
@end
__attribute__((objc_subclassing_restricted))
__attribute__((swift_name("Kt54119Kt")))
@interface KtKt54119Kt : KtBase
+ (BOOL)callContainsSet:(NSSet<id> *)set __attribute__((swift_name("callContains(set:)")));
+ (id _Nullable)callGetElementSet:(NSSet<id> *)set __attribute__((swift_name("callGetElement(set:)")));
+ (BOOL)callContainsKeyMap:(NSDictionary<id, id> *)map __attribute__((swift_name("callContainsKey(map:)")));
+ (BOOL)callContainsValueMap:(NSDictionary<id, id> *)map __attribute__((swift_name("callContainsValue(map:)")));
+ (id _Nullable)callGetMap:(NSDictionary<id, id> *)map __attribute__((swift_name("callGet(map:)")));
+ (int32_t)callGetOrThrowConcurrentModificationMap:(NSDictionary<id, id> *)map __attribute__((swift_name("callGetOrThrowConcurrentModification(map:)")));
+ (BOOL)callContainsEntryMap:(NSDictionary<id, id> *)map __attribute__((swift_name("callContainsEntry(map:)")));
@end
__attribute__((objc_subclassing_restricted))
__attribute__((swift_name("LibraryKt")))
@interface KtLibraryKt : KtBase
@@ -1014,6 +1014,25 @@ __attribute__((swift_name("Bar")))
@property (readonly) NSString *farewell __attribute__((swift_name("farewell")));
@end
__attribute__((objc_subclassing_restricted))
__attribute__((swift_name("KT54119KotlinKey")))
@interface KtKT54119KotlinKey : KtBase
- (instancetype)init __attribute__((swift_name("init()"))) __attribute__((objc_designated_initializer));
+ (instancetype)new __attribute__((availability(swift, unavailable, message="use object initializers instead")));
@end
__attribute__((objc_subclassing_restricted))
__attribute__((swift_name("Kt54119Kt")))
@interface KtKt54119Kt : KtBase
+ (BOOL)callContainsSet:(NSSet<id> *)set __attribute__((swift_name("callContains(set:)")));
+ (id _Nullable)callGetElementSet:(NSSet<id> *)set __attribute__((swift_name("callGetElement(set:)")));
+ (BOOL)callContainsKeyMap:(NSDictionary<id, id> *)map __attribute__((swift_name("callContainsKey(map:)")));
+ (BOOL)callContainsValueMap:(NSDictionary<id, id> *)map __attribute__((swift_name("callContainsValue(map:)")));
+ (id _Nullable)callGetMap:(NSDictionary<id, id> *)map __attribute__((swift_name("callGet(map:)")));
+ (int32_t)callGetOrThrowConcurrentModificationMap:(NSDictionary<id, id> *)map __attribute__((swift_name("callGetOrThrowConcurrentModification(map:)")));
+ (BOOL)callContainsEntryMap:(NSDictionary<id, id> *)map __attribute__((swift_name("callContainsEntry(map:)")));
@end
__attribute__((objc_subclassing_restricted))
__attribute__((swift_name("LibraryKt")))
@interface KtLibraryKt : KtBase
@@ -1014,6 +1014,25 @@ __attribute__((swift_name("Bar")))
@property (readonly) NSString *farewell __attribute__((swift_name("farewell")));
@end
__attribute__((objc_subclassing_restricted))
__attribute__((swift_name("KT54119KotlinKey")))
@interface KtKT54119KotlinKey : KtBase
- (instancetype)init __attribute__((swift_name("init()"))) __attribute__((objc_designated_initializer));
+ (instancetype)new __attribute__((availability(swift, unavailable, message="use object initializers instead")));
@end
__attribute__((objc_subclassing_restricted))
__attribute__((swift_name("Kt54119Kt")))
@interface KtKt54119Kt : KtBase
+ (BOOL)callContainsSet:(NSSet<id> *)set __attribute__((swift_name("callContains(set:)")));
+ (id _Nullable)callGetElementSet:(NSSet<id> *)set __attribute__((swift_name("callGetElement(set:)")));
+ (BOOL)callContainsKeyMap:(NSDictionary<id, id> *)map __attribute__((swift_name("callContainsKey(map:)")));
+ (BOOL)callContainsValueMap:(NSDictionary<id, id> *)map __attribute__((swift_name("callContainsValue(map:)")));
+ (id _Nullable)callGetMap:(NSDictionary<id, id> *)map __attribute__((swift_name("callGet(map:)")));
+ (int32_t)callGetOrThrowConcurrentModificationMap:(NSDictionary<id, id> *)map __attribute__((swift_name("callGetOrThrowConcurrentModification(map:)")));
+ (BOOL)callContainsEntryMap:(NSDictionary<id, id> *)map __attribute__((swift_name("callContainsEntry(map:)")));
@end
__attribute__((objc_subclassing_restricted))
__attribute__((swift_name("LibraryKt")))
@interface KtLibraryKt : KtBase
@@ -0,0 +1,24 @@
/*
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package kt54119
class KT54119KotlinKey
private typealias Foo = KT54119KotlinKey
fun callContains(set: Set<*>) = set.contains(Foo())
@Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER")
fun callGetElement(set: Set<*>) = (set as kotlin.native.internal.KonanSet<Any?>).getElement(Foo())
fun callContainsKey(map: Map<*, *>) = map.containsKey(Foo())
fun callContainsValue(map: Map<*, *>) = map.containsValue(Foo())
fun callGet(map: Map<*, *>) = map.get(Foo())
fun callGetOrThrowConcurrentModification(map: Map<*, *>) = map.hashCode() // calls getOrThrowConcurrentModification under the hood.
fun callContainsEntry(map: Map<*, *>) = map.entries.contains(map.entries.first())
@@ -0,0 +1,51 @@
/*
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
import Foundation
import Kt
// See https://youtrack.jetbrains.com/issue/KT-54119/Native-runtime-assertion-failed-due-to-missing-thread-state-switch
private func testSetContains() throws {
try assertFalse(Kt54119Kt.callContains(set: ["111"]))
}
private func testSetGetElement() throws {
try assertNil(Kt54119Kt.callGetElement(set: [222]))
}
private func testMapContainsKey() throws {
try assertFalse(Kt54119Kt.callContainsKey(map: ["abc" : "def"]))
}
private func testMapContainsValue() throws {
try assertFalse(Kt54119Kt.callContainsValue(map: [KT54119KotlinKey() : 1]))
}
private func testMapGet() throws {
try assertNil(Kt54119Kt.callGet(map: [0 : 0]))
}
private func testMapGetOrThrowConcurrentModification() throws {
Kt54119Kt.callGetOrThrowConcurrentModification(map: [KT54119KotlinKey() : 2])
}
private func testMapContainsEntry() throws {
try assertTrue(Kt54119Kt.callContainsEntry(map: [KT54119KotlinKey() : 3]))
}
class Kt54119Tests : SimpleTestProvider {
override init() {
super.init()
test("testSetContains", testSetContains)
test("testSetGetElement", testSetGetElement)
test("testMapContainsKey", testMapContainsKey)
test("testMapContainsValue", testMapContainsValue)
test("testMapGet", testMapGet)
test("testMapGetOrThrowConcurrentModification", testMapGetOrThrowConcurrentModification)
test("testMapContainsEntry", testMapContainsEntry)
}
}