JVM IR: fix inheritance from mutable collections of Int
For subclasses of `AbstractMutableList<Int>` which are not inline classes, the special bridge `remove` had a parameter of type `Int` (mapped to JVM primitive int) before this fix. The hack in `MethodSignatureMapper` changed this type to `Int?`, yet the body of the special bridge still loaded it as non-nullable, which resulted in incorrect bytecode. It looks like a part of this hack in `BridgeLowering` was made only for inline classes which are subclasses of mutable collections. Supposedly it should be extended to non-inline classes, so that `remove` special bridge would have consistent IR by the time it reaches codegen. #KT-46516 Fixed
This commit is contained in:
Vendored
+2
@@ -1,3 +1,5 @@
|
||||
// WITH_RUNTIME
|
||||
|
||||
abstract class AMListD : AbstractMutableList<Double>()
|
||||
|
||||
abstract class AMListI : AbstractMutableList<Int>()
|
||||
|
||||
Vendored
+16
@@ -13,3 +13,19 @@ public abstract class AMListD {
|
||||
public bridge final method remove(p0: java.lang.Object): boolean
|
||||
public synthetic bridge method removeAt(p0: int): java.lang.Object
|
||||
}
|
||||
|
||||
@kotlin.Metadata
|
||||
public abstract class AMListI {
|
||||
// source: 'inheritingFromAbstractMutableList.kt'
|
||||
public method <init>(): void
|
||||
public bridge method contains(p0: int): boolean
|
||||
public bridge final method contains(p0: java.lang.Object): boolean
|
||||
public bridge method indexOf(p0: int): int
|
||||
public bridge final method indexOf(p0: java.lang.Object): int
|
||||
public bridge method lastIndexOf(p0: int): int
|
||||
public bridge final method lastIndexOf(p0: java.lang.Object): int
|
||||
public bridge final method remove(p0: int): int
|
||||
public bridge method remove(p0: java.lang.Integer): boolean
|
||||
public bridge final method remove(p0: java.lang.Object): boolean
|
||||
public synthetic bridge method removeAt(p0: int): java.lang.Object
|
||||
}
|
||||
|
||||
Vendored
+17
@@ -14,3 +14,20 @@ public abstract class AMListD {
|
||||
public abstract method removeAt(p0: int): java.lang.Double
|
||||
public synthetic bridge method removeAt(p0: int): java.lang.Object
|
||||
}
|
||||
|
||||
@kotlin.Metadata
|
||||
public abstract class AMListI {
|
||||
// source: 'inheritingFromAbstractMutableList.kt'
|
||||
public method <init>(): void
|
||||
public bridge method contains(p0: int): boolean
|
||||
public bridge final method contains(p0: java.lang.Object): boolean
|
||||
public bridge method indexOf(p0: int): int
|
||||
public bridge final method indexOf(p0: java.lang.Object): int
|
||||
public bridge method lastIndexOf(p0: int): int
|
||||
public bridge final method lastIndexOf(p0: java.lang.Object): int
|
||||
public bridge final method remove(p0: int): int
|
||||
public bridge method remove(p0: java.lang.Integer): boolean
|
||||
public bridge final method remove(p0: java.lang.Object): boolean
|
||||
public abstract method removeAt(p0: int): java.lang.Integer
|
||||
public synthetic bridge method removeAt(p0: int): java.lang.Object
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user