[optmz] Fix for https://youtrack.jetbrains.com/issue/KT-41907 + test
This commit is contained in:
+15
-3
@@ -211,13 +211,25 @@ internal val escapeAnalysisPhase = makeKonanModuleOpPhase(
|
|||||||
op = { context, _ ->
|
op = { context, _ ->
|
||||||
val entryPoint = context.ir.symbols.entryPoint?.owner
|
val entryPoint = context.ir.symbols.entryPoint?.owner
|
||||||
val externalModulesDFG = ExternalModulesDFG(emptyList(), emptyMap(), emptyMap(), emptyMap())
|
val externalModulesDFG = ExternalModulesDFG(emptyList(), emptyMap(), emptyMap(), emptyMap())
|
||||||
|
val nonDevirtualizedCallSitesUnfoldFactor =
|
||||||
|
if (entryPoint != null) {
|
||||||
|
// For a final program it can be safely assumed that what classes we see is what we got,
|
||||||
|
// so can take those. In theory we can always unfold call sites using type hierarchy, but
|
||||||
|
// the analysis might converge much, much slower, so take only reasonably small for now.
|
||||||
|
5
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// Can't tolerate any non-devirtualized call site for a library.
|
||||||
|
// TODO: What about private virtual functions?
|
||||||
|
// Note: 0 is also bad - this means that there're no inheritors in the current source set,
|
||||||
|
// but there might be some provided by the users of the library being produced.
|
||||||
|
-1
|
||||||
|
}
|
||||||
val callGraph = CallGraphBuilder(
|
val callGraph = CallGraphBuilder(
|
||||||
context, context.moduleDFG!!,
|
context, context.moduleDFG!!,
|
||||||
externalModulesDFG,
|
externalModulesDFG,
|
||||||
context.devirtualizationAnalysisResult!!,
|
context.devirtualizationAnalysisResult!!,
|
||||||
// Can't tolerate any non-devirtualized call site for a library.
|
nonDevirtualizedCallSitesUnfoldFactor
|
||||||
// TODO: What about private virtual functions?
|
|
||||||
nonDevirtualizedCallSitesUnfoldFactor = if (entryPoint == null) 0 else 5
|
|
||||||
).build()
|
).build()
|
||||||
EscapeAnalysis.computeLifetimes(
|
EscapeAnalysis.computeLifetimes(
|
||||||
context, context.moduleDFG!!, externalModulesDFG, callGraph, context.lifetimes
|
context, context.moduleDFG!!, externalModulesDFG, callGraph, context.lifetimes
|
||||||
|
|||||||
@@ -532,6 +532,26 @@ __attribute__((swift_name("Kt39206Kt")))
|
|||||||
+ (int32_t)myFunc __attribute__((swift_name("myFunc()"))) __attribute__((deprecated("Don't call this\nPlease")));
|
+ (int32_t)myFunc __attribute__((swift_name("myFunc()"))) __attribute__((deprecated("Don't call this\nPlease")));
|
||||||
@end;
|
@end;
|
||||||
|
|
||||||
|
__attribute__((objc_subclassing_restricted))
|
||||||
|
__attribute__((swift_name("Ckt41907")))
|
||||||
|
@interface KtCkt41907 : KtBase
|
||||||
|
- (instancetype)init __attribute__((swift_name("init()"))) __attribute__((objc_designated_initializer));
|
||||||
|
+ (instancetype)new __attribute__((availability(swift, unavailable, message="use object initializers instead")));
|
||||||
|
@end;
|
||||||
|
|
||||||
|
__attribute__((swift_name("Ikt41907")))
|
||||||
|
@protocol KtIkt41907
|
||||||
|
@required
|
||||||
|
- (void)fooC:(KtCkt41907 *)c __attribute__((swift_name("foo(c:)")));
|
||||||
|
@end;
|
||||||
|
|
||||||
|
__attribute__((objc_subclassing_restricted))
|
||||||
|
__attribute__((swift_name("Kt41907Kt")))
|
||||||
|
@interface KtKt41907Kt : KtBase
|
||||||
|
+ (void)escapeCC:(KtCkt41907 *)c __attribute__((swift_name("escapeC(c:)")));
|
||||||
|
+ (void)testKt41907O:(id<KtIkt41907>)o __attribute__((swift_name("testKt41907(o:)")));
|
||||||
|
@end;
|
||||||
|
|
||||||
__attribute__((objc_subclassing_restricted))
|
__attribute__((objc_subclassing_restricted))
|
||||||
__attribute__((swift_name("LibraryKt")))
|
__attribute__((swift_name("LibraryKt")))
|
||||||
@interface KtLibraryKt : KtBase
|
@interface KtLibraryKt : KtBase
|
||||||
|
|||||||
@@ -0,0 +1,27 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||||
|
* that can be found in the LICENSE file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package kt41907
|
||||||
|
|
||||||
|
class Ckt41907
|
||||||
|
|
||||||
|
interface Ikt41907 {
|
||||||
|
fun foo(c: Ckt41907)
|
||||||
|
}
|
||||||
|
|
||||||
|
private class Bkt41907 {
|
||||||
|
var c: Ckt41907? = null
|
||||||
|
}
|
||||||
|
|
||||||
|
private val b = Bkt41907()
|
||||||
|
|
||||||
|
fun escapeC(c: Ckt41907) {
|
||||||
|
b.c = c
|
||||||
|
}
|
||||||
|
|
||||||
|
fun testKt41907(o: Ikt41907) {
|
||||||
|
val c = Ckt41907()
|
||||||
|
o.foo(c)
|
||||||
|
}
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||||
|
* that can be found in the LICENSE file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import Kt
|
||||||
|
|
||||||
|
class Ikt41907Impl : Ikt41907 {
|
||||||
|
func foo(c: Ckt41907) {
|
||||||
|
Kt41907Kt.escapeC(c: c)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private func test1() {
|
||||||
|
Kt41907Kt.testKt41907(o: Ikt41907Impl())
|
||||||
|
}
|
||||||
|
|
||||||
|
class Kt41907Tests : SimpleTestProvider {
|
||||||
|
override init() {
|
||||||
|
super.init()
|
||||||
|
|
||||||
|
test("Test1", test1)
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user