From 2793187bdae16485fbc430e7a1c9a675ddb64751 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Fri, 1 May 2020 12:51:46 +0200 Subject: [PATCH] Handle IllegalArgumentException in trimMargin intrinsics on JVM #KT-38537 Fixed --- .../org/jetbrains/kotlin/codegen/intrinsics/Trim.kt | 6 +++++- .../codegen/ir/FirBlackBoxCodegenTestGenerated.java | 5 +++++ .../kotlin/backend/common/lower/StringTrimLowering.kt | 6 +++++- .../box/intrinsics/trimMarginWithBlankString.kt | 11 +++++++++++ .../kotlin/codegen/BlackBoxCodegenTestGenerated.java | 5 +++++ .../codegen/LightAnalysisModeTestGenerated.java | 5 +++++ .../codegen/ir/IrBlackBoxCodegenTestGenerated.java | 5 +++++ .../ir/semantics/IrJsCodegenBoxTestGenerated.java | 5 +++++ .../js/test/semantics/JsCodegenBoxTestGenerated.java | 5 +++++ 9 files changed, 51 insertions(+), 2 deletions(-) create mode 100644 compiler/testData/codegen/box/intrinsics/trimMarginWithBlankString.kt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/Trim.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/Trim.kt index 93ca075cef0..8d21c6579e1 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/Trim.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/Trim.kt @@ -33,7 +33,11 @@ class TrimMargin : IntrinsicMethod() { val marginPrefix = argument.valueArgument?.getArgumentExpression() ?.let { codegen.getCompileTimeConstant(it) as? StringValue } ?.value ?: return null - literalText.trimMargin(marginPrefix) + try { + literalText.trimMargin(marginPrefix) + } catch (e: IllegalArgumentException) { + return null + } } else -> error("Unknown value argument type ${argument::class}: $argument") } diff --git a/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java index a286dcc17e9..ee0c85d3df4 100644 --- a/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java @@ -14501,6 +14501,11 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT public void testTostring() throws Exception { runTest("compiler/testData/codegen/box/intrinsics/tostring.kt"); } + + @TestMetadata("trimMarginWithBlankString.kt") + public void testTrimMarginWithBlankString() throws Exception { + runTest("compiler/testData/codegen/box/intrinsics/trimMarginWithBlankString.kt"); + } } @TestMetadata("compiler/testData/codegen/box/ir") diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/StringTrimLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/StringTrimLowering.kt index 48c7a62a48d..cbc896efe0f 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/StringTrimLowering.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/StringTrimLowering.kt @@ -44,7 +44,11 @@ class StringTrimLowering(val context: CommonBackendContext) : FileLoweringPass, val prefixArgument = call.getValueArgument(0) val newString = if (prefixArgument != null) { val prefixString = prefixArgument.getConstantString() ?: return call - receiverString.trimMargin(prefixString) + try { + receiverString.trimMargin(prefixString) + } catch (e: IllegalArgumentException) { + return call + } } else { receiverString.trimMargin() } diff --git a/compiler/testData/codegen/box/intrinsics/trimMarginWithBlankString.kt b/compiler/testData/codegen/box/intrinsics/trimMarginWithBlankString.kt new file mode 100644 index 00000000000..01b8b277680 --- /dev/null +++ b/compiler/testData/codegen/box/intrinsics/trimMarginWithBlankString.kt @@ -0,0 +1,11 @@ +// WITH_RUNTIME +// KJS_WITH_FULL_RUNTIME + +fun box(): String { + try { + "a b c".trimMargin(" ") + return "Fail trimMargin" + } catch (e: IllegalArgumentException) { + return "OK" + } +} diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index 0eb022aa9ca..ccdc1b48b36 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -15721,6 +15721,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { public void testTostring() throws Exception { runTest("compiler/testData/codegen/box/intrinsics/tostring.kt"); } + + @TestMetadata("trimMarginWithBlankString.kt") + public void testTrimMarginWithBlankString() throws Exception { + runTest("compiler/testData/codegen/box/intrinsics/trimMarginWithBlankString.kt"); + } } @TestMetadata("compiler/testData/codegen/box/ir") diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index e32523d02c6..754e86d6149 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -15721,6 +15721,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes public void testTostring() throws Exception { runTest("compiler/testData/codegen/box/intrinsics/tostring.kt"); } + + @TestMetadata("trimMarginWithBlankString.kt") + public void testTrimMarginWithBlankString() throws Exception { + runTest("compiler/testData/codegen/box/intrinsics/trimMarginWithBlankString.kt"); + } } @TestMetadata("compiler/testData/codegen/box/ir") diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index cf5890717dc..e59d046fd31 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -14501,6 +14501,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes public void testTostring() throws Exception { runTest("compiler/testData/codegen/box/intrinsics/tostring.kt"); } + + @TestMetadata("trimMarginWithBlankString.kt") + public void testTrimMarginWithBlankString() throws Exception { + runTest("compiler/testData/codegen/box/intrinsics/trimMarginWithBlankString.kt"); + } } @TestMetadata("compiler/testData/codegen/box/ir") diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java index 1670e47bcb6..a3531190153 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java @@ -12621,6 +12621,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { public void testTostring() throws Exception { runTest("compiler/testData/codegen/box/intrinsics/tostring.kt"); } + + @TestMetadata("trimMarginWithBlankString.kt") + public void testTrimMarginWithBlankString() throws Exception { + runTest("compiler/testData/codegen/box/intrinsics/trimMarginWithBlankString.kt"); + } } @TestMetadata("compiler/testData/codegen/box/ir") diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java index afaad93fc52..9a4fee7d6b4 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java @@ -12686,6 +12686,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { public void testTostring() throws Exception { runTest("compiler/testData/codegen/box/intrinsics/tostring.kt"); } + + @TestMetadata("trimMarginWithBlankString.kt") + public void testTrimMarginWithBlankString() throws Exception { + runTest("compiler/testData/codegen/box/intrinsics/trimMarginWithBlankString.kt"); + } } @TestMetadata("compiler/testData/codegen/box/ir")