Allow weak references to permanent objects. (#3781)

This commit is contained in:
Nikolay Igotti
2020-01-24 17:35:33 +03:00
committed by GitHub
parent d1a7ea2ed3
commit c5caeefd8e
4 changed files with 31 additions and 1 deletions
+13 -1
View File
@@ -10,7 +10,7 @@ import kotlin.native.ref.*
class Node(var next: Node?)
@Test fun runTest() {
@Test fun runTest1() {
val node1 = Node(null)
val node2 = Node(node1)
node1.next = node2
@@ -18,3 +18,15 @@ class Node(var next: Node?)
kotlin.native.ref.WeakReference(node1)
println("OK")
}
@Test fun runTest2() {
val string = "Hello"
val refString = WeakReference(string)
assertEquals(string, refString.value)
val zero = 0
val refZero = WeakReference(zero)
assertEquals(0, refZero.value)
val long = Long.MAX_VALUE
val refLong = WeakReference(long)
assertEquals(Long.MAX_VALUE, refLong.value)
}
+5
View File
@@ -49,10 +49,15 @@ extern "C" {
OBJ_GETTER(makeWeakReferenceCounter, void*);
OBJ_GETTER(makeObjCWeakReferenceImpl, void*);
OBJ_GETTER(makePermanentWeakReferenceImpl, ObjHeader*);
// See Weak.kt for implementation details.
// Retrieve link on the counter object.
OBJ_GETTER(Konan_getWeakReferenceImpl, ObjHeader* referred) {
if (referred->container() == nullptr) {
RETURN_RESULT_OF(makePermanentWeakReferenceImpl, referred);
}
MetaObjHeader* meta = referred->meta_object();
#if KONAN_OBJC_INTEROP
@@ -37,5 +37,11 @@ public class WeakReference<T : Any> {
*/
@Suppress("UNCHECKED_CAST")
public fun get(): T? = pointer?.get() as T?
/**
* Returns either reference to an object or null, if it was collected.
*/
public val value: T?
get() = this.get()
}
@@ -56,3 +56,10 @@ external internal fun getWeakReferenceImpl(referent: Any): WeakReferenceImpl
@ExportForCppRuntime
internal fun makeWeakReferenceCounter(referred: COpaquePointer) = WeakReferenceCounter(referred)
internal class PermanentWeakReferenceImpl(val referred: Any): kotlin.native.ref.WeakReferenceImpl() {
override fun get(): Any? = referred
}
// Create a reference to the permanent object.
@ExportForCppRuntime
internal fun makePermanentWeakReferenceImpl(referred: Any) = PermanentWeakReferenceImpl(referred)