ClassLayoutBuilder debugging tweaks.
Mostly moved from descriptors to .render() (cherry picked from commit e9968c54dc5924116fe3318fe763271588a4e346)
This commit is contained in:
committed by
Vasily Levchenko
parent
17ef26b4f8
commit
21d098c689
+13
-11
@@ -48,6 +48,7 @@ internal class OverriddenFunctionInfo(
|
||||
&& function.bridgeDirectionsTo(overriddenFunction).allNotNeeded()
|
||||
|
||||
fun getImplementation(context: Context): IrSimpleFunction? {
|
||||
|
||||
val target = function.target
|
||||
val implementation = if (!needBridge)
|
||||
target
|
||||
@@ -272,7 +273,7 @@ internal class ClassLayoutBuilder(val irClass: IrClass, val context: Context) {
|
||||
|
||||
DEBUG_OUTPUT(0) {
|
||||
println()
|
||||
println("BUILDING vTable for ${irClass.descriptor}")
|
||||
println("BUILDING vTable for ${irClass.render()}")
|
||||
}
|
||||
|
||||
val superVtableEntries = if (irClass.isSpecialClassWithNoSupertypes()) {
|
||||
@@ -288,11 +289,11 @@ internal class ClassLayoutBuilder(val irClass: IrClass, val context: Context) {
|
||||
DEBUG_OUTPUT(0) {
|
||||
println()
|
||||
println("SUPER vTable:")
|
||||
superVtableEntries.forEach { println(" ${it.overriddenFunction.descriptor} -> ${it.function.descriptor}") }
|
||||
superVtableEntries.forEach { println(" ${it.overriddenFunction.render()} -> ${it.function.render()}") }
|
||||
|
||||
println()
|
||||
println("METHODS:")
|
||||
methods.forEach { println(" ${it.descriptor}") }
|
||||
methods.forEach { println(" ${it.render()}") }
|
||||
|
||||
println()
|
||||
println("BUILDING INHERITED vTable")
|
||||
@@ -302,13 +303,13 @@ internal class ClassLayoutBuilder(val irClass: IrClass, val context: Context) {
|
||||
val overridingMethod = methods.singleOrNull { it.overrides(superMethod.function) }
|
||||
if (overridingMethod == null) {
|
||||
|
||||
DEBUG_OUTPUT(0) { println("Taking super ${superMethod.overriddenFunction.descriptor} -> ${superMethod.function.descriptor}") }
|
||||
DEBUG_OUTPUT(0) { println("Taking super ${superMethod.overriddenFunction.render()} -> ${superMethod.function.render()}") }
|
||||
|
||||
superMethod
|
||||
} else {
|
||||
newVtableSlots.add(OverriddenFunctionInfo(overridingMethod, superMethod.function))
|
||||
|
||||
DEBUG_OUTPUT(0) { println("Taking overridden ${superMethod.overriddenFunction.descriptor} -> ${overridingMethod.descriptor}") }
|
||||
DEBUG_OUTPUT(0) { println("Taking overridden ${superMethod.overriddenFunction.render()} -> ${overridingMethod.render()}") }
|
||||
|
||||
OverriddenFunctionInfo(overridingMethod, superMethod.overriddenFunction)
|
||||
}
|
||||
@@ -320,18 +321,19 @@ internal class ClassLayoutBuilder(val irClass: IrClass, val context: Context) {
|
||||
val inheritedVtableSlotsSet = inheritedVtableSlots.map { it.function to it.bridgeDirections }.toSet()
|
||||
|
||||
val filteredNewVtableSlots = newVtableSlots
|
||||
.filterNot { inheritedVtableSlotsSet.contains(it.function to it.bridgeDirections) }
|
||||
.distinctBy { it.function to it.bridgeDirections }
|
||||
.filter { it.function.isOverridable }
|
||||
.filterNot { inheritedVtableSlotsSet.contains(it.function to it.bridgeDirections) }
|
||||
.distinctBy { it.function to it.bridgeDirections }
|
||||
.filter { it.function.isOverridable }
|
||||
|
||||
DEBUG_OUTPUT(0) {
|
||||
println()
|
||||
println("INHERITED vTable slots:")
|
||||
inheritedVtableSlots.forEach { println(" ${it.overriddenFunction.descriptor} -> ${it.function.descriptor}") }
|
||||
inheritedVtableSlots.forEach { println(" ${it.overriddenFunction.render()} -> ${it.function.render()}") }
|
||||
|
||||
println()
|
||||
println("MY OWN vTable slots:")
|
||||
filteredNewVtableSlots.forEach { println(" ${it.overriddenFunction.descriptor} -> ${it.function.descriptor}") }
|
||||
filteredNewVtableSlots.forEach { println(" ${it.overriddenFunction.render()} -> ${it.function.render()} ${it.function}") }
|
||||
println("DONE vTable for ${irClass.render()}")
|
||||
}
|
||||
|
||||
inheritedVtableSlots + filteredNewVtableSlots.sortedBy { it.overriddenFunction.uniqueId }
|
||||
@@ -340,7 +342,7 @@ internal class ClassLayoutBuilder(val irClass: IrClass, val context: Context) {
|
||||
fun vtableIndex(function: IrSimpleFunction): Int {
|
||||
val bridgeDirections = function.target.bridgeDirectionsTo(function)
|
||||
val index = vtableEntries.indexOfFirst { it.function == function && it.bridgeDirections == bridgeDirections }
|
||||
if (index < 0) throw Error(function.toString() + " not in vtable of " + irClass.toString())
|
||||
if (index < 0) throw Error(function.render() + " $function " + " (${function.symbol.descriptor}) not in vtable of " + irClass.render())
|
||||
return index
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user