JVM_IR fix special bridge generation for inline classes

This commit is contained in:
Dmitry Petrov
2021-02-01 16:03:39 +03:00
parent 8172ae5d89
commit 4ec369ac5b
23 changed files with 410 additions and 24 deletions
@@ -0,0 +1,43 @@
// WITH_RUNTIME
inline class Z(val x: Int)
inline class ZArray(val storage: IntArray) : Collection<Z> {
override val size: Int
get() = storage.size
override fun contains(element: Z): Boolean {
return storage.contains(element.x)
}
override fun containsAll(elements: Collection<Z>): Boolean {
return elements.all { contains(it) }
}
override fun isEmpty(): Boolean {
return storage.isEmpty()
}
private class ZArrayIterator(val storage: IntArray): Iterator<Z> {
var index = 0
override fun hasNext(): Boolean = index < storage.size
override fun next(): Z = Z(storage[index++])
}
override fun iterator(): Iterator<Z> = ZArrayIterator(storage)
}
fun box(): String {
val zs = ZArray(IntArray(5))
val testSize = zs.size
if (testSize != 5) return "Failed: testSize=$testSize"
val testContains = zs.contains(object {} as Any)
if (testContains) return "Failed: testContains=$testContains"
return "OK"
}
@@ -0,0 +1,56 @@
// WITH_RUNTIME
inline class Z(val x: Int)
inline class ZArray(val storage: IntArray) : List<Z> {
override val size: Int
get() = storage.size
override fun contains(element: Z): Boolean {
return storage.contains(element.x)
}
override fun containsAll(elements: Collection<Z>): Boolean {
return elements.all { contains(it) }
}
override fun isEmpty(): Boolean {
return storage.isEmpty()
}
override fun get(index: Int): Z = Z(storage[index])
override fun indexOf(element: Z): Int = storage.indexOf(element.x)
override fun lastIndexOf(element: Z): Int = storage.lastIndexOf(element.x)
override fun listIterator(): ListIterator<Z> = ZArrayIterator(storage)
override fun listIterator(index: Int): ListIterator<Z> = ZArrayIterator(storage, index)
override fun subList(fromIndex: Int, toIndex: Int): List<Z> = TODO()
private class ZArrayIterator(val storage: IntArray, var index: Int = 0): ListIterator<Z> {
override fun hasNext(): Boolean = index < storage.size
override fun next(): Z = Z(storage[index++])
override fun nextIndex(): Int = index + 1
override fun hasPrevious(): Boolean = index > 0
override fun previous(): Z = Z(storage[index--])
override fun previousIndex(): Int = index - 1
}
override fun iterator(): Iterator<Z> = ZArrayIterator(storage)
}
fun box(): String {
val zs = ZArray(IntArray(5))
val testElement = object {} as Any
zs.contains(testElement)
zs.indexOf(testElement)
zs.lastIndexOf(testElement)
return "OK"
}
@@ -0,0 +1,57 @@
// WITH_RUNTIME
inline class Z(val x: Int)
inline class ZArrayMap(val storage: IntArray) : Map<Z, Z> {
override val size: Int
get() = storage.size
private class MapEntry(val i: Int, val si: Int): Map.Entry<Z, Z> {
override val key: Z get() = Z(i)
override val value: Z get() = Z(si)
}
private class MapEntrySet(val storage: IntArray) : AbstractSet<Map.Entry<Z, Z>>() {
private inner class MyIterator : Iterator<Map.Entry<Z, Z>> {
var index = 0
override fun hasNext(): Boolean = index < size
override fun next(): Map.Entry<Z, Z> = MapEntry(index, storage[index++])
}
override val size: Int
get() = storage.size
override fun iterator(): Iterator<Map.Entry<Z, Z>> = MyIterator()
}
override val entries: Set<Map.Entry<Z, Z>>
get() = MapEntrySet(storage)
override val keys: Set<Z>
get() = (0 until size).mapTo(HashSet()) { Z(it) }
override val values: Collection<Z>
get() = storage.mapTo(ArrayList()) { Z(it) }
override fun containsKey(key: Z): Boolean = key.x in (0 until size)
override fun containsValue(value: Z): Boolean = storage.contains(value.x)
override fun get(key: Z) = storage.getOrNull(key.x)?.let { Z(it) }
override fun isEmpty(): Boolean = size > 0
}
fun box(): String {
val zm = ZArrayMap(IntArray(5))
zm.containsKey(Z(0))
zm.containsValue(Z(0))
zm[Z(0)]
zm.containsKey(object {} as Any)
zm.containsValue(object {} as Any)
zm.get(object {} as Any)
return "OK"
}