Generate invokeSpecial for all private functions

This commit is contained in:
Natalia Ukhorskaya
2014-06-19 15:51:48 +04:00
parent c847d180a7
commit 28cbe95e0c
3 changed files with 28 additions and 5 deletions
@@ -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
@@ -22,3 +34,12 @@ class MyClass {
// 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