Compare commits

...

4 Commits

Author SHA1 Message Date
Mikhael Bogdanov
147ab6fe3d Support Unit/V types in string-concat indy calls
unitComponent.kt test fails with JVM target 9+
2021-02-17 17:16:57 +01:00
Mikhael Bogdanov
f7801fdd78 Make indy-with-constants default for -jvm-target 9+
#KT-42522 Fixed
2021-02-17 17:16:57 +01:00
Mikhael Bogdanov
e7f8df810d Fail on compilation errors in AbstractBytecodeTextTest 2021-02-17 17:16:57 +01:00
Mikhael Bogdanov
1101ebb111 Support new targets in KotlinBytecodeToolWindow
#KT-30222 Fixed
2021-02-17 17:16:57 +01:00
20 changed files with 84 additions and 21 deletions

View File

@@ -204,7 +204,7 @@ class GenerationState private constructor(
val target = configuration.get(JVMConfigurationKeys.JVM_TARGET) ?: JvmTarget.DEFAULT
val runtimeStringConcat =
if (target.majorVersion >= JvmTarget.JVM_9.majorVersion)
configuration.get(JVMConfigurationKeys.STRING_CONCAT) ?: JvmStringConcat.INLINE
configuration.get(JVMConfigurationKeys.STRING_CONCAT) ?: JvmStringConcat.INDY_WITH_CONSTANTS
else JvmStringConcat.INLINE
val samConversionsScheme = run {

View File

@@ -369,7 +369,9 @@ class K2JVMCompilerArguments : CommonCompilerArguments() {
description = """Select code generation scheme for string concatenation.
-Xstring-concat=indy-with-constants Concatenate strings using `invokedynamic` `makeConcatWithConstants`. Requires `-jvm-target 9` or greater.
-Xstring-concat=indy Concatenate strings using `invokedynamic` `makeConcat`. Requires `-jvm-target 9` or greater.
-Xstring-concat=inline Concatenate strings using `StringBuilder`"""
-Xstring-concat=inline Concatenate strings using `StringBuilder`
default: `indy-with-constants` for JVM target 9 or greater, `inline` otherwise"""
)
var stringConcat: String? by NullableStringFreezableVar(JvmStringConcat.INLINE.description)

View File

@@ -5080,6 +5080,12 @@ public class FirBytecodeTextTestGenerated extends AbstractFirBytecodeTextTest {
runTest("compiler/testData/codegen/bytecodeText/stringOperations/concatDynamicIndyDataClass.kt");
}
@Test
@TestMetadata("concatDynamicUnit.kt")
public void testConcatDynamicUnit() throws Exception {
runTest("compiler/testData/codegen/bytecodeText/stringOperations/concatDynamicUnit.kt");
}
@Test
@TestMetadata("concatNotDynamic.kt")
public void testConcatNotDynamic() throws Exception {

View File

@@ -1283,8 +1283,9 @@ class ExpressionCodegen(
generator.putValueOrProcessConstant(StackValue.constant(arg.value, type, null))
} else {
val value = arg.accept(this, data)
value.materializeAt(value.type, value.irType)
generator.invokeAppend(value.type)
val generatingType = if (value.type == Type.VOID_TYPE) AsmTypes.UNIT_TYPE else value.type
value.materializeAt(generatingType, value.irType)
generator.invokeAppend(generatingType)
}
}
generator.genToString()

View File

@@ -118,6 +118,7 @@ where advanced options include:
-Xstring-concat=indy-with-constants Concatenate strings using `invokedynamic` `makeConcatWithConstants`. Requires `-jvm-target 9` or greater.
-Xstring-concat=indy Concatenate strings using `invokedynamic` `makeConcat`. Requires `-jvm-target 9` or greater.
-Xstring-concat=inline Concatenate strings using `StringBuilder`
default: `indy-with-constants` for JVM target 9 or greater, `inline` otherwise
-Xsupport-compatqual-checker-framework-annotations=enable|disable
Specify behavior for Checker Framework compatqual annotations (NullableDecl/NonNullDecl).
Default value is 'enable'

View File

@@ -1,6 +1,7 @@
// !LANGUAGE: +InlineClasses
// FILE: Z.kt
@Suppress("RESERVED_VAR_PROPERTY_OF_VALUE_CLASS")
inline class Z(val x: Int) {
val aVal: Int
get() = x

View File

@@ -1,3 +1,4 @@
// IGNORE_DEXING
class `(X)` {
fun `(Y)`() {}
}

View File

@@ -1,3 +1,4 @@
// IGNORE_BACKEND: JVM
fun main() {
println("FAIL")
}

View File

@@ -1,3 +1,5 @@
// IGNORE_BACKEND_FIR: JVM_IR
fun main()
{
l@ if (2 != 1) "fail 3"

View File

@@ -0,0 +1,28 @@
// JVM_TARGET: 9
data class A(val x: Unit)
fun test(): Unit {}
interface B<T> {
fun test() : T {
return null!!
}
}
class Foo : B<Unit> {
}
fun box(): String {
val a = A(Unit)
val test = "Test ${a.component1()} ${test()} ${Foo().test()}"
return "OK"
}
// one in data class `toString` and one in `box` method
// 2 INVOKEDYNAMIC makeConcatWithConstants
// 1 makeConcatWithConstants\(Lkotlin/Unit;\)
// 1 makeConcatWithConstants\(Lkotlin/Unit;Lkotlin/Unit;Lkotlin/Unit;\)
// 0 append
// 0 stringPlus

View File

@@ -1,7 +1,7 @@
// IGNORE_BACKEND: JVM
fun test(x: Int): String {
when {
return when {
x == 1 || x == 3 || x == 5 -> "135"
x == 2 || x == 4 || x == 6 -> "246"
else -> "other"

View File

@@ -4948,6 +4948,12 @@ public class BytecodeTextTestGenerated extends AbstractBytecodeTextTest {
runTest("compiler/testData/codegen/bytecodeText/stringOperations/concatDynamicIndyDataClass.kt");
}
@Test
@TestMetadata("concatDynamicUnit.kt")
public void testConcatDynamicUnit() throws Exception {
runTest("compiler/testData/codegen/bytecodeText/stringOperations/concatDynamicUnit.kt");
}
@Test
@TestMetadata("concatNotDynamic.kt")
public void testConcatNotDynamic() throws Exception {

View File

@@ -5080,6 +5080,12 @@ public class IrBytecodeTextTestGenerated extends AbstractIrBytecodeTextTest {
runTest("compiler/testData/codegen/bytecodeText/stringOperations/concatDynamicIndyDataClass.kt");
}
@Test
@TestMetadata("concatDynamicUnit.kt")
public void testConcatDynamicUnit() throws Exception {
runTest("compiler/testData/codegen/bytecodeText/stringOperations/concatDynamicUnit.kt");
}
@Test
@TestMetadata("concatNotDynamic.kt")
public void testConcatNotDynamic() throws Exception {

View File

@@ -10,6 +10,8 @@ import org.jetbrains.kotlin.test.TargetBackend
import org.jetbrains.kotlin.test.backend.BlackBoxCodegenSuppressor
import org.jetbrains.kotlin.test.backend.classic.ClassicJvmBackendFacade
import org.jetbrains.kotlin.test.backend.handlers.BytecodeTextHandler
import org.jetbrains.kotlin.test.backend.handlers.NoCompilationErrorsHandler
import org.jetbrains.kotlin.test.backend.handlers.NoFirCompilationErrorsHandler
import org.jetbrains.kotlin.test.backend.ir.JvmIrBackendFacade
import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder
import org.jetbrains.kotlin.test.directives.JvmEnvironmentConfigurationDirectives
@@ -42,6 +44,8 @@ abstract class AbstractBytecodeTextTestBase<R : ResultingArtifact.FrontendOutput
+WITH_REFLECT
}
commonHandlersForCodegenTest()
useArtifactsHandlers(::BytecodeTextHandler)
useAfterAnalysisCheckers(::BlackBoxCodegenSuppressor)

View File

@@ -40,7 +40,7 @@ abstract class AbstractCompileKotlinAgainstInlineKotlinTestBase<I : ResultingArt
backendFacade
)
useInlineHandlers()
commonHandlersForCodegenTest()
commonHandlersForBoxTest()
useModuleStructureTransformers(
ModuleTransformerForTwoFilesBoxTests()
)

View File

@@ -19,7 +19,6 @@ import org.jetbrains.kotlin.test.frontend.classic.ClassicFrontend2IrConverter
import org.jetbrains.kotlin.test.frontend.classic.ClassicFrontendFacade
import org.jetbrains.kotlin.test.model.FrontendKinds
import org.jetbrains.kotlin.test.runners.AbstractKotlinCompilerWithTargetBackendTest
import org.jetbrains.kotlin.test.runners.codegen.commonConfigurationForCodegenTest
import org.jetbrains.kotlin.test.services.ModuleTransformerForSwitchingBackend
@OptIn(TestInfrastructureInternals::class)
@@ -37,7 +36,7 @@ abstract class AbstractJvmIrAgainstOldBoxTestBase(targetBackend: TargetBackend)
::ClassicJvmBackendFacade
)
commonHandlersForCodegenTest()
commonHandlersForBoxTest()
useFrontend2BackendConverters(::ClassicFrontend2IrConverter)
useBackendFacades(::JvmIrBackendFacade)

View File

@@ -23,7 +23,7 @@ abstract class AbstractJvmBlackBoxCodegenTestBase<R : ResultingArtifact.Frontend
override fun TestConfigurationBuilder.configuration() {
commonConfigurationForCodegenTest(targetFrontend, frontendFacade, frontendToBackendConverter, backendFacade)
commonHandlersForCodegenTest()
commonHandlersForBoxTest()
useArtifactsHandlers(::BytecodeListingHandler)
useAfterAnalysisCheckers(::BlackBoxCodegenSuppressor)
}

View File

@@ -37,7 +37,7 @@ open class AbstractBackendAgainstBackendBoxTestBase(
useFrontend2BackendConverters(::ClassicFrontend2IrConverter)
useBackendFacades(::JvmIrBackendFacade)
commonHandlersForCodegenTest()
commonHandlersForBoxTest()
useInlineHandlers()
useAfterAnalysisCheckers(::BlackBoxCodegenSuppressor.bind(CodegenTestDirectives.IGNORE_BACKEND_MULTI_MODULE))

View File

@@ -11,7 +11,6 @@ import org.jetbrains.kotlin.test.backend.handlers.*
import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder
import org.jetbrains.kotlin.test.directives.CodegenTestDirectives.DUMP_SMAP
import org.jetbrains.kotlin.test.directives.CodegenTestDirectives.RUN_DEX_CHECKER
import org.jetbrains.kotlin.test.directives.JvmEnvironmentConfigurationDirectives.USE_PSI_CLASS_FILES_READING
import org.jetbrains.kotlin.test.model.*
import org.jetbrains.kotlin.test.services.configuration.CommonEnvironmentConfigurator
import org.jetbrains.kotlin.test.services.configuration.JvmEnvironmentConfigurator
@@ -51,6 +50,13 @@ fun <R : ResultingArtifact.FrontendOutput<R>> TestConfigurationBuilder.commonCon
useBackendFacades(backendFacade)
}
fun TestConfigurationBuilder.commonHandlersForBoxTest() {
commonHandlersForCodegenTest()
useArtifactsHandlers(
::JvmBoxRunner
)
}
fun TestConfigurationBuilder.commonHandlersForCodegenTest() {
useFrontendHandlers(
::NoCompilationErrorsHandler,
@@ -58,7 +64,6 @@ fun TestConfigurationBuilder.commonHandlersForCodegenTest() {
)
useArtifactsHandlers(
::JvmBoxRunner,
::NoJvmSpecificCompilationErrorsHandler,
::DxCheckerHandler,
)

View File

@@ -15,6 +15,7 @@ import com.intellij.openapi.editor.ScrollType
import com.intellij.openapi.fileEditor.FileEditorManager
import com.intellij.openapi.progress.ProcessCanceledException
import com.intellij.openapi.project.Project
import com.intellij.openapi.ui.ComboBox
import com.intellij.openapi.ui.Messages
import com.intellij.openapi.util.Computable
import com.intellij.openapi.util.Pair
@@ -51,9 +52,7 @@ import java.awt.FlowLayout
import java.io.PrintWriter
import java.io.StringWriter
import java.util.*
import javax.swing.JButton
import javax.swing.JCheckBox
import javax.swing.JPanel
import javax.swing.*
import kotlin.math.min
sealed class BytecodeGenerationResult {
@@ -68,7 +67,7 @@ class KotlinBytecodeToolWindow(private val myProject: Project, private val toolW
private val enableOptimization: JCheckBox
private val enableAssertions: JCheckBox
private val decompile: JButton
private val jvm8Target: JCheckBox
private val jvmTargets: JComboBox<String>
private val ir: JCheckBox
private inner class UpdateBytecodeToolWindowTask : LongRunningReadTask<Location, BytecodeGenerationResult>(this) {
@@ -114,9 +113,7 @@ class KotlinBytecodeToolWindow(private val myProject: Project, private val toolW
configuration.put(JVMConfigurationKeys.DISABLE_OPTIMIZATION, true)
}
if (jvm8Target.isSelected) {
configuration.put(JVMConfigurationKeys.JVM_TARGET, JvmTarget.JVM_1_8)
}
configuration.put(JVMConfigurationKeys.JVM_TARGET, JvmTarget.fromString(jvmTargets.selectedItem as String)!!)
if (ir.isSelected) {
configuration.put(JVMConfigurationKeys.IR, true)
@@ -207,13 +204,16 @@ class KotlinBytecodeToolWindow(private val myProject: Project, private val toolW
enableInline = JCheckBox(KotlinJvmBundle.message("checkbox.text.inline"), true)
enableOptimization = JCheckBox(KotlinJvmBundle.message("checkbox.text.optimization"), true)
enableAssertions = JCheckBox(KotlinJvmBundle.message("checkbox.text.assertions"), true)
jvm8Target = JCheckBox(KotlinJvmBundle.message("checkbox.text.jvm.8.target"), false)
jvmTargets = ComboBox(JvmTarget.values().map { it.description }.toTypedArray())
jvmTargets.selectedItem = JvmTarget.DEFAULT.description
ir = JCheckBox(KotlinJvmBundle.message("checkbox.text.ir"), false)
optionPanel.add(enableInline)
optionPanel.add(enableOptimization)
optionPanel.add(enableAssertions)
optionPanel.add(ir)
optionPanel.add(jvm8Target)
optionPanel.add(JLabel("Target:"))
optionPanel.add(jvmTargets)
InfinitePeriodicalTask(
UPDATE_DELAY.toLong(),