Fix way how function table is built. Allows to extend Exception class. (#210)

This commit is contained in:
Nikolay Igotti
2017-02-01 15:43:28 +03:00
committed by GitHub
parent 06c703f840
commit 6192dc254a
3 changed files with 21 additions and 3 deletions
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.descriptors.impl.PropertySetterDescriptorImpl
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.DescriptorUtils
import org.jetbrains.kotlin.resolve.OverridingUtil
import org.jetbrains.kotlin.resolve.descriptorUtil.*
import org.jetbrains.kotlin.resolve.scopes.MemberScope
@@ -210,8 +211,11 @@ fun ClassDescriptor.vtableIndex(function: FunctionDescriptor): Int {
val ClassDescriptor.methodTableEntries: List<FunctionDescriptor>
get() {
assert (!this.isAbstract())
return this.contributedMethods.filter { it.isOverridableOrOverrides }
assert(!this.isAbstract())
return this.contributedMethods.filter {
// We check that either method is open, or one of declarations it overrides
// is open.
it.isOverridable || DescriptorUtils.getAllOverriddenDeclarations(it).any { it.isOverridable }
}
// TODO: probably method table should contain all accessible methods to improve binary compatibility
}
+5
View File
@@ -653,6 +653,11 @@ task catch7(type: RunKonanTest) {
source = "runtime/exceptions/catch7.kt"
}
task extend_exception(type: RunKonanTest) {
goldValue = "OK\n"
source = "runtime/exceptions/extend0.kt"
}
task catch3(type: RunKonanTest) {
goldValue = "Before\nCaught Throwable\nDone\n"
source = "codegen/try/catch3.kt"
@@ -0,0 +1,9 @@
class C : Exception("OK")
fun main(args: Array<String>) {
try {
throw C()
} catch (e: Throwable) {
println(e.message!!)
}
}