Fix way how function table is built. Allows to extend Exception class. (#210)
This commit is contained in:
+7
-3
@@ -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
|
||||
}
|
||||
@@ -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!!)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user