Properly process special symbols during indy-with-constants concatenation
#KT-47320 Fixed
This commit is contained in:
@@ -22,6 +22,7 @@ import java.lang.StringBuilder
|
|||||||
class StringConcatGenerator(val mode: JvmStringConcat, val mv: InstructionAdapter) {
|
class StringConcatGenerator(val mode: JvmStringConcat, val mv: InstructionAdapter) {
|
||||||
|
|
||||||
private val template = StringBuilder("")
|
private val template = StringBuilder("")
|
||||||
|
private val specialSymbolsInTemplate = arrayListOf<String>()
|
||||||
private val paramTypes = arrayListOf<Type>()
|
private val paramTypes = arrayListOf<Type>()
|
||||||
private var justFlushed = false
|
private var justFlushed = false
|
||||||
|
|
||||||
@@ -42,7 +43,16 @@ class StringConcatGenerator(val mode: JvmStringConcat, val mv: InstructionAdapte
|
|||||||
if (mode == JvmStringConcat.INDY_WITH_CONSTANTS) {
|
if (mode == JvmStringConcat.INDY_WITH_CONSTANTS) {
|
||||||
when (stackValue) {
|
when (stackValue) {
|
||||||
is StackValue.Constant -> {
|
is StackValue.Constant -> {
|
||||||
template.append(stackValue.value)
|
val value = stackValue.value
|
||||||
|
if (value is String && (value.contains("\u0001") || value.contains("\u0002"))) {
|
||||||
|
template.append("\u0002") //reference to special symbols added on next line
|
||||||
|
specialSymbolsInTemplate.add(value)
|
||||||
|
} else if (value is Char && (value == 1.toChar() || value == 2.toChar())) {
|
||||||
|
template.append("\u0002") //reference to special symbols added on next line
|
||||||
|
specialSymbolsInTemplate.add(value.toString())
|
||||||
|
} else {
|
||||||
|
template.append(value)
|
||||||
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
TRUE -> {
|
TRUE -> {
|
||||||
@@ -104,7 +114,7 @@ class StringConcatGenerator(val mode: JvmStringConcat, val mv: InstructionAdapte
|
|||||||
"makeConcatWithConstants",
|
"makeConcatWithConstants",
|
||||||
Type.getMethodDescriptor(JAVA_STRING_TYPE, *paramTypes.toTypedArray()),
|
Type.getMethodDescriptor(JAVA_STRING_TYPE, *paramTypes.toTypedArray()),
|
||||||
bootstrap,
|
bootstrap,
|
||||||
arrayOf(template.toString())
|
arrayOf(template.toString()) + specialSymbolsInTemplate
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
val bootstrap = Handle(
|
val bootstrap = Handle(
|
||||||
@@ -123,6 +133,7 @@ class StringConcatGenerator(val mode: JvmStringConcat, val mv: InstructionAdapte
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
template.clear()
|
template.clear()
|
||||||
|
specialSymbolsInTemplate.clear()
|
||||||
paramTypes.clear()
|
paramTypes.clear()
|
||||||
paramTypes.add(JAVA_STRING_TYPE)
|
paramTypes.add(JAVA_STRING_TYPE)
|
||||||
template.append("\u0001")
|
template.append("\u0001")
|
||||||
|
|||||||
+6
@@ -5134,6 +5134,12 @@ public class FirBytecodeTextTestGenerated extends AbstractFirBytecodeTextTest {
|
|||||||
runTest("compiler/testData/codegen/bytecodeText/stringOperations/concatDynamicIndyDataClass.kt");
|
runTest("compiler/testData/codegen/bytecodeText/stringOperations/concatDynamicIndyDataClass.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("concatDynamicSpecialSymbols.kt")
|
||||||
|
public void testConcatDynamicSpecialSymbols() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/bytecodeText/stringOperations/concatDynamicSpecialSymbols.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("concatDynamicUnit.kt")
|
@TestMetadata("concatDynamicUnit.kt")
|
||||||
public void testConcatDynamicUnit() throws Exception {
|
public void testConcatDynamicUnit() throws Exception {
|
||||||
|
|||||||
+17
@@ -0,0 +1,17 @@
|
|||||||
|
// JVM_TARGET: 9
|
||||||
|
|
||||||
|
fun box(a: String, b: String?) {
|
||||||
|
val s = a + "\u0001" + 2.toChar() + 3.toChar() + 4L + b + 5.0 + 6F + '7' + b + "\u0002" + 1.toChar()
|
||||||
|
}
|
||||||
|
|
||||||
|
// 1 INVOKEDYNAMIC makeConcatWithConstants
|
||||||
|
|
||||||
|
// JVM_TEMPLATES
|
||||||
|
// 1 "\\u0001\\u0002\\u0002\\u00034\\u00015.06.07\\u0001\\u0002\\u0002"
|
||||||
|
// 2 "\\u0001"
|
||||||
|
// 2 "\\u0002"
|
||||||
|
|
||||||
|
// JVM_IR_TEMPLATES
|
||||||
|
// 1 "\\u0001\\u0002\\u00015.06.07\\u0001\\u0002"
|
||||||
|
// 1 "\\u0001\\u0002\\u00034"
|
||||||
|
// 1 "\\u0002\\u0001"
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
// JVM_TARGET: 9
|
||||||
|
|
||||||
|
fun test(a: String, b: String?): String {
|
||||||
|
return a + "\u0001" + 2.toChar() + 3.toChar() + 4L + b + 5.0 + 6F + '7' + b + "\u0002" + 1.toChar()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
val test = test("O", "K")
|
||||||
|
return if (test != "O\u0001\u0002\u00034K5.06.07K\u0002\u0001") "fail ${test}" else "OK"
|
||||||
|
}
|
||||||
+6
@@ -5002,6 +5002,12 @@ public class BytecodeTextTestGenerated extends AbstractBytecodeTextTest {
|
|||||||
runTest("compiler/testData/codegen/bytecodeText/stringOperations/concatDynamicIndyDataClass.kt");
|
runTest("compiler/testData/codegen/bytecodeText/stringOperations/concatDynamicIndyDataClass.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("concatDynamicSpecialSymbols.kt")
|
||||||
|
public void testConcatDynamicSpecialSymbols() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/bytecodeText/stringOperations/concatDynamicSpecialSymbols.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("concatDynamicUnit.kt")
|
@TestMetadata("concatDynamicUnit.kt")
|
||||||
public void testConcatDynamicUnit() throws Exception {
|
public void testConcatDynamicUnit() throws Exception {
|
||||||
|
|||||||
+6
@@ -5134,6 +5134,12 @@ public class IrBytecodeTextTestGenerated extends AbstractIrBytecodeTextTest {
|
|||||||
runTest("compiler/testData/codegen/bytecodeText/stringOperations/concatDynamicIndyDataClass.kt");
|
runTest("compiler/testData/codegen/bytecodeText/stringOperations/concatDynamicIndyDataClass.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("concatDynamicSpecialSymbols.kt")
|
||||||
|
public void testConcatDynamicSpecialSymbols() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/bytecodeText/stringOperations/concatDynamicSpecialSymbols.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("concatDynamicUnit.kt")
|
@TestMetadata("concatDynamicUnit.kt")
|
||||||
public void testConcatDynamicUnit() throws Exception {
|
public void testConcatDynamicUnit() throws Exception {
|
||||||
|
|||||||
+1
@@ -92,5 +92,6 @@ internal fun runJvmInstance(
|
|||||||
|
|
||||||
val process = ProcessBuilder(*command).inheritIO().start()
|
val process = ProcessBuilder(*command).inheritIO().start()
|
||||||
process.waitFor(1, TimeUnit.MINUTES)
|
process.waitFor(1, TimeUnit.MINUTES)
|
||||||
|
process.outputStream.flush()
|
||||||
AbstractBlackBoxCodegenTest.assertEquals(0, process.exitValue())
|
AbstractBlackBoxCodegenTest.assertEquals(0, process.exitValue())
|
||||||
}
|
}
|
||||||
|
|||||||
+5
@@ -59,6 +59,11 @@ public class Jdk9BlackBoxCodegenTestGenerated extends AbstractJdk9BlackBoxCodege
|
|||||||
runTest("compiler/testData/codegen/java9/box/concatDynamicInlineClasses.kt");
|
runTest("compiler/testData/codegen/java9/box/concatDynamicInlineClasses.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("concatDynamicSpecialSymbols.kt")
|
||||||
|
public void testConcatDynamicSpecialSymbols() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/java9/box/concatDynamicSpecialSymbols.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("concatDynamicWithInline.kt")
|
@TestMetadata("concatDynamicWithInline.kt")
|
||||||
public void testConcatDynamicWithInline() throws Exception {
|
public void testConcatDynamicWithInline() throws Exception {
|
||||||
runTest("compiler/testData/codegen/java9/box/concatDynamicWithInline.kt");
|
runTest("compiler/testData/codegen/java9/box/concatDynamicWithInline.kt");
|
||||||
|
|||||||
+5
@@ -60,6 +60,11 @@ public class Jdk9IrBlackBoxCodegenTestGenerated extends AbstractJdk9IrBlackBoxCo
|
|||||||
runTest("compiler/testData/codegen/java9/box/concatDynamicInlineClasses.kt");
|
runTest("compiler/testData/codegen/java9/box/concatDynamicInlineClasses.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("concatDynamicSpecialSymbols.kt")
|
||||||
|
public void testConcatDynamicSpecialSymbols() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/java9/box/concatDynamicSpecialSymbols.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("concatDynamicWithInline.kt")
|
@TestMetadata("concatDynamicWithInline.kt")
|
||||||
public void testConcatDynamicWithInline() throws Exception {
|
public void testConcatDynamicWithInline() throws Exception {
|
||||||
runTest("compiler/testData/codegen/java9/box/concatDynamicWithInline.kt");
|
runTest("compiler/testData/codegen/java9/box/concatDynamicWithInline.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user