Generate invokeSpecial for all private functions
This commit is contained in:
@@ -446,8 +446,7 @@ public class JetTypeMapper {
|
|||||||
invokeOpcode = INVOKEINTERFACE;
|
invokeOpcode = INVOKEINTERFACE;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
boolean isPrivateFunInvocation = isCallInsideSameClassAsDeclared(functionDescriptor, context) &&
|
boolean isPrivateFunInvocation = functionDescriptor.getVisibility() == Visibilities.PRIVATE;
|
||||||
functionDescriptor.getVisibility() == Visibilities.PRIVATE;
|
|
||||||
invokeOpcode = superCall || isPrivateFunInvocation ? INVOKESPECIAL : INVOKEVIRTUAL;
|
invokeOpcode = superCall || isPrivateFunInvocation ? INVOKESPECIAL : INVOKEVIRTUAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +1,13 @@
|
|||||||
LineBreakpoint created at privateMember.kt:5
|
LineBreakpoint created at privateMember.kt:9
|
||||||
!JDK_HOME!\bin\java -agentlib:jdwp=transport=dt_socket,address=!HOST_NAME!:!HOST_PORT!,suspend=y,server=n -Dfile.encoding=!FILE_ENCODING! -classpath !APP_PATH!\classes;!KOTLIN_RUNTIME!;!RT_JAR! privateMember.PrivateMemberPackage
|
!JDK_HOME!\bin\java -agentlib:jdwp=transport=dt_socket,address=!HOST_NAME!:!HOST_PORT!,suspend=y,server=n -Dfile.encoding=!FILE_ENCODING! -classpath !APP_PATH!\classes;!KOTLIN_RUNTIME!;!RT_JAR! privateMember.PrivateMemberPackage
|
||||||
Connected to the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
|
Connected to the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
|
||||||
privateMember.kt:4
|
privateMember.kt:8
|
||||||
Compile bytecode for MyClass().privateFun()
|
Compile bytecode for MyClass().privateFun()
|
||||||
Compile bytecode for MyClass().privateVal
|
Compile bytecode for MyClass().privateVal
|
||||||
Compile bytecode for MyClass.PrivateClass().a
|
Compile bytecode for MyClass.PrivateClass().a
|
||||||
|
Compile bytecode for base.privateFun()
|
||||||
|
Compile bytecode for derived.privateFun()
|
||||||
|
Compile bytecode for derivedAsBase.privateFun()
|
||||||
Disconnected from the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
|
Disconnected from the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
|
||||||
|
|
||||||
Process finished with exit code 0
|
Process finished with exit code 0
|
||||||
|
|||||||
@@ -1,6 +1,10 @@
|
|||||||
package privateMember
|
package privateMember
|
||||||
|
|
||||||
fun main(args: Array<String>) {
|
fun main(args: Array<String>) {
|
||||||
|
val base = Base()
|
||||||
|
val derived = Derived()
|
||||||
|
val derivedAsBase: Base = Derived()
|
||||||
|
|
||||||
//Breakpoint!
|
//Breakpoint!
|
||||||
args.size
|
args.size
|
||||||
}
|
}
|
||||||
@@ -14,6 +18,14 @@ class MyClass {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
open class Base {
|
||||||
|
private fun privateFun() = 2
|
||||||
|
}
|
||||||
|
|
||||||
|
class Derived: Base() {
|
||||||
|
private fun privateFun() = 3
|
||||||
|
}
|
||||||
|
|
||||||
// EXPRESSION: MyClass().privateFun()
|
// EXPRESSION: MyClass().privateFun()
|
||||||
// RESULT: 1: I
|
// RESULT: 1: I
|
||||||
|
|
||||||
@@ -21,4 +33,13 @@ class MyClass {
|
|||||||
// RESULT: 1: I
|
// RESULT: 1: I
|
||||||
|
|
||||||
// EXPRESSION: MyClass.PrivateClass().a
|
// EXPRESSION: MyClass.PrivateClass().a
|
||||||
// RESULT: 1: I
|
// RESULT: 1: I
|
||||||
|
|
||||||
|
// EXPRESSION: base.privateFun()
|
||||||
|
// RESULT: 2: I
|
||||||
|
|
||||||
|
// EXPRESSION: derived.privateFun()
|
||||||
|
// RESULT: 3: I
|
||||||
|
|
||||||
|
// EXPRESSION: derivedAsBase.privateFun()
|
||||||
|
// RESULT: 2: I
|
||||||
|
|||||||
Reference in New Issue
Block a user