From 47ade4530c47638f7d376ae42d13b6ca433a3369 Mon Sep 17 00:00:00 2001 From: Svyatoslav Kuzmich Date: Mon, 7 Aug 2023 16:19:29 +0000 Subject: [PATCH] [Wasm] Add compiler flag to disable exception handling proposal Fail with unreachable instead of throwing an exception Merge-request: KT-MR-11481 Merged-by: Svyatoslav Kuzmich --- .../K2JSCompilerArgumentsCopyGenerated.kt | 1 + .../common/arguments/K2JSCompilerArguments.kt | 10 ++++ .../jetbrains/kotlin/cli/js/K2JsIrCompiler.kt | 1 + .../kotlin/backend/wasm/WasmBackendContext.kt | 2 +- .../jetbrains/kotlin/backend/wasm/compiler.kt | 5 +- .../backend/wasm/ir2wasm/BodyGenerator.kt | 10 ++++ .../ir2wasm/WasmCompiledModuleFragment.kt | 9 ++-- compiler/testData/cli/js/jsExtraHelp.out | 2 + .../codegen/boxWasmJsInterop/noExceptions.kt | 46 +++++++++++++++++++ .../WasmEnvironmentConfigurationDirectives.kt | 4 ++ .../WasmEnvironmentConfigurator.kt | 3 ++ .../kotlin/js/config/JSConfigurationKeys.java | 3 ++ .../wasm/ir/convertors/WasmIrToBinary.kt | 10 ++-- .../wasm/test/handlers/WasmBoxRunner.kt | 6 ++- .../kotlin/wasm/test/tools/WasmVM.kt | 7 +-- ...WasmCodegenWasmJsInteropTestGenerated.java | 6 +++ ...WasmCodegenWasmJsInteropTestGenerated.java | 6 +++ 17 files changed, 118 insertions(+), 13 deletions(-) create mode 100644 compiler/testData/codegen/boxWasmJsInterop/noExceptions.kt diff --git a/compiler/cli/cli-common/gen/org/jetbrains/kotlin/cli/common/arguments/K2JSCompilerArgumentsCopyGenerated.kt b/compiler/cli/cli-common/gen/org/jetbrains/kotlin/cli/common/arguments/K2JSCompilerArgumentsCopyGenerated.kt index 2b281ed77c3..9006f516cce 100644 --- a/compiler/cli/cli-common/gen/org/jetbrains/kotlin/cli/common/arguments/K2JSCompilerArgumentsCopyGenerated.kt +++ b/compiler/cli/cli-common/gen/org/jetbrains/kotlin/cli/common/arguments/K2JSCompilerArgumentsCopyGenerated.kt @@ -73,6 +73,7 @@ fun copyK2JSCompilerArguments(from: K2JSCompilerArguments, to: K2JSCompilerArgum to.wasmGenerateWat = from.wasmGenerateWat to.wasmKClassFqn = from.wasmKClassFqn to.wasmTarget = from.wasmTarget + to.wasmUseTrapsInsteadOfExceptions = from.wasmUseTrapsInsteadOfExceptions return to } diff --git a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JSCompilerArguments.kt b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JSCompilerArguments.kt index 963f7d3254d..60202748f26 100644 --- a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JSCompilerArguments.kt +++ b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JSCompilerArguments.kt @@ -630,6 +630,16 @@ class K2JSCompilerArguments : CommonCompilerArguments() { field = if (value.isNullOrEmpty()) null else value } + @Argument( + value = "-Xwasm-use-traps-instead-of-exceptions", + description = "Trap instead of throwing exceptions" + ) + var wasmUseTrapsInsteadOfExceptions = false + set(value) { + checkFrozen() + field = value + } + @Argument( value = "-Xforce-deprecated-legacy-compiler-usage", description = "The flag is used only for our inner infrastructure. It will be removed soon, so it's unsafe to use it nowadays." diff --git a/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/K2JsIrCompiler.kt b/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/K2JsIrCompiler.kt index 7ae90a4737a..725b48ad1a2 100644 --- a/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/K2JsIrCompiler.kt +++ b/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/K2JsIrCompiler.kt @@ -170,6 +170,7 @@ class K2JsIrCompiler : CLICompiler() { configuration.put(JSConfigurationKeys.WASM_ENABLE_ARRAY_RANGE_CHECKS, arguments.wasmEnableArrayRangeChecks) configuration.put(JSConfigurationKeys.WASM_ENABLE_ASSERTS, arguments.wasmEnableAsserts) configuration.put(JSConfigurationKeys.WASM_GENERATE_WAT, arguments.wasmGenerateWat) + configuration.put(JSConfigurationKeys.WASM_USE_TRAPS_INSTEAD_OF_EXCEPTIONS, arguments.wasmUseTrapsInsteadOfExceptions) configuration.putIfNotNull(JSConfigurationKeys.WASM_TARGET, arguments.wasmTarget?.let(WasmTarget::fromName)) configuration.put(JSConfigurationKeys.OPTIMIZE_GENERATED_JS, arguments.optimizeGeneratedJs) diff --git a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/WasmBackendContext.kt b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/WasmBackendContext.kt index ecf17c4984c..247dec70e1f 100644 --- a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/WasmBackendContext.kt +++ b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/WasmBackendContext.kt @@ -24,11 +24,11 @@ import org.jetbrains.kotlin.ir.declarations.impl.IrExternalPackageFragmentImpl import org.jetbrains.kotlin.ir.declarations.impl.IrFileImpl import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol import org.jetbrains.kotlin.ir.symbols.impl.DescriptorlessExternalPackageFragmentSymbol -import org.jetbrains.kotlin.ir.types.IrSimpleType import org.jetbrains.kotlin.ir.types.IrTypeSystemContext import org.jetbrains.kotlin.ir.types.IrTypeSystemContextImpl import org.jetbrains.kotlin.ir.util.SymbolTable import org.jetbrains.kotlin.ir.util.addChild +import org.jetbrains.kotlin.js.config.JSConfigurationKeys import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name diff --git a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/compiler.kt b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/compiler.kt index bcae046f3d6..bf4524a6ba5 100644 --- a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/compiler.kt +++ b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/compiler.kt @@ -97,7 +97,10 @@ fun compileWasm( generateWat: Boolean = false, generateSourceMaps: Boolean = false, ): WasmCompilerResult { - val compiledWasmModule = WasmCompiledModuleFragment(backendContext.irBuiltIns) + val compiledWasmModule = WasmCompiledModuleFragment( + backendContext.irBuiltIns, + backendContext.configuration.getBoolean(JSConfigurationKeys.WASM_USE_TRAPS_INSTEAD_OF_EXCEPTIONS) + ) val codeGenerator = WasmModuleFragmentGenerator(backendContext, compiledWasmModule, allowIncompleteImplementations = allowIncompleteImplementations) allModules.forEach { codeGenerator.collectInterfaceTables(it) } allModules.forEach { codeGenerator.generateModule(it) } diff --git a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/BodyGenerator.kt b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/BodyGenerator.kt index ea921b52071..a6bab8e28dc 100644 --- a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/BodyGenerator.kt +++ b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/BodyGenerator.kt @@ -137,12 +137,22 @@ class BodyGenerator( override fun visitThrow(expression: IrThrow) { generateExpression(expression.value) + if (context.backendContext.configuration.getBoolean(JSConfigurationKeys.WASM_USE_TRAPS_INSTEAD_OF_EXCEPTIONS)) { + body.buildUnreachable(SourceLocation.NoLocation("Unreachable is inserted instead of a `throw` instruction")) + return + } + body.buildThrow(functionContext.tagIdx, expression.getSourceLocation()) } override fun visitTry(aTry: IrTry) { assert(aTry.isCanonical(irBuiltIns)) { "expected canonical try/catch" } + if (context.backendContext.configuration.getBoolean(JSConfigurationKeys.WASM_USE_TRAPS_INSTEAD_OF_EXCEPTIONS)) { + generateExpression(aTry.tryResult) + return + } + val resultType = context.transformBlockResultType(aTry.type) body.buildTry(null, resultType) generateExpression(aTry.tryResult) diff --git a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/WasmCompiledModuleFragment.kt b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/WasmCompiledModuleFragment.kt index dcf600dd5ed..09492cf610a 100644 --- a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/WasmCompiledModuleFragment.kt +++ b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/WasmCompiledModuleFragment.kt @@ -15,7 +15,10 @@ import org.jetbrains.kotlin.ir.util.isInterface import org.jetbrains.kotlin.wasm.ir.* import org.jetbrains.kotlin.wasm.ir.source.location.SourceLocation -class WasmCompiledModuleFragment(val irBuiltIns: IrBuiltIns) { +class WasmCompiledModuleFragment( + val irBuiltIns: IrBuiltIns, + generateTrapsInsteadOfExceptions: Boolean, +) { val functions = ReferencableAndDefinable() val globalFields = @@ -49,7 +52,7 @@ class WasmCompiledModuleFragment(val irBuiltIns: IrBuiltIns) { ), emptyList() ) - val tag = WasmTag(tagFuncType) + val tags = if (generateTrapsInsteadOfExceptions) emptyList() else listOf(WasmTag(tagFuncType)) val typeInfo = ReferencableAndDefinable() @@ -238,7 +241,7 @@ class WasmCompiledModuleFragment(val irBuiltIns: IrBuiltIns) { elements = emptyList(), data = data, dataCount = true, - tags = listOf(tag) + tags = tags ) module.calculateIds() return module diff --git a/compiler/testData/cli/js/jsExtraHelp.out b/compiler/testData/cli/js/jsExtraHelp.out index 627b35e9ad7..160190709d7 100644 --- a/compiler/testData/cli/js/jsExtraHelp.out +++ b/compiler/testData/cli/js/jsExtraHelp.out @@ -60,6 +60,8 @@ where advanced options include: -Xwasm-generate-wat Generate wat file -Xwasm-kclass-fqn Enable support for FQ names in KClass -Xwasm-target Set up Wasm target (wasm-js or wasm-wasi) + -Xwasm-use-traps-instead-of-exceptions + Trap instead of throwing exceptions -Xallow-any-scripts-in-source-roots Allow to compile any scripts along with regular Kotlin sources -Xallow-kotlin-package Allow compiling code in package 'kotlin' and allow not requiring kotlin.stdlib in module-info diff --git a/compiler/testData/codegen/boxWasmJsInterop/noExceptions.kt b/compiler/testData/codegen/boxWasmJsInterop/noExceptions.kt new file mode 100644 index 00000000000..62787cab4bb --- /dev/null +++ b/compiler/testData/codegen/boxWasmJsInterop/noExceptions.kt @@ -0,0 +1,46 @@ +// TARGET_BACKEND: WASM +// DISABLE_WASM_EXCEPTION_HANDLING +// MODULE: main +// FILE: foo.kt + +@JsExport +fun sumNumbers(x: Int): Int = + (0..x).toList().sum() + +@JsExport +fun add(x: Int, y: Int): Int = + x + y + +@JsExport +fun throws() { + try { + error("Test Error") + } catch (e: Throwable) { + // This code normally catches the error, + // but with exception handling disabled it should fail with trap + } +} + + +// FILE: entry.mjs + +import wasmExports from "./index.mjs"; + +if (wasmExports.add(10, 20) !== 30) { + throw "Fail add"; +} + +if (wasmExports.sumNumbers(10) !== 55) { + throw "Fail sumNumbers"; +} + +var thrown = false; +try { + wasmExports.throws(); +} catch(e) { + thrown = true; +} + +if (!thrown) { + throw "Fail exception was not thrown"; +} \ No newline at end of file diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/directives/WasmEnvironmentConfigurationDirectives.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/directives/WasmEnvironmentConfigurationDirectives.kt index d563dc285f8..87aed3463f0 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/directives/WasmEnvironmentConfigurationDirectives.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/directives/WasmEnvironmentConfigurationDirectives.kt @@ -13,6 +13,10 @@ object WasmEnvironmentConfigurationDirectives : SimpleDirectivesContainer() { description = "Run kotlin.test unit tests (function marked with @Test)", ) + val DISABLE_WASM_EXCEPTION_HANDLING by directive( + description = "Generate wasm without EH proposal and test in runtime with EH turned off", + ) + // Next directives are used only inside test system and must not be present in test file val PATH_TO_TEST_DIR by stringDirective( diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/services/configuration/WasmEnvironmentConfigurator.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/services/configuration/WasmEnvironmentConfigurator.kt index f66a88221f0..70a682f7ce7 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/services/configuration/WasmEnvironmentConfigurator.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/services/configuration/WasmEnvironmentConfigurator.kt @@ -21,6 +21,7 @@ import org.jetbrains.kotlin.test.directives.JsEnvironmentConfigurationDirectives import org.jetbrains.kotlin.test.directives.JsEnvironmentConfigurationDirectives.PROPERTY_LAZY_INITIALIZATION import org.jetbrains.kotlin.test.directives.JsEnvironmentConfigurationDirectives.SOURCE_MAP_EMBED_SOURCES import org.jetbrains.kotlin.test.directives.WasmEnvironmentConfigurationDirectives +import org.jetbrains.kotlin.test.directives.WasmEnvironmentConfigurationDirectives.DISABLE_WASM_EXCEPTION_HANDLING import org.jetbrains.kotlin.test.directives.model.DirectivesContainer import org.jetbrains.kotlin.test.directives.model.RegisteredDirectives import org.jetbrains.kotlin.test.frontend.classic.moduleDescriptorProvider @@ -155,5 +156,7 @@ class WasmEnvironmentConfigurator(testServices: TestServices) : EnvironmentConfi configuration.put(JSConfigurationKeys.SOURCE_MAP_EMBED_SOURCES, sourceMapSourceEmbedding) configuration.put(CommonConfigurationKeys.EXPECT_ACTUAL_LINKER, EXPECT_ACTUAL_LINKER in registeredDirectives) + + configuration.put(JSConfigurationKeys.WASM_USE_TRAPS_INSTEAD_OF_EXCEPTIONS, DISABLE_WASM_EXCEPTION_HANDLING in registeredDirectives) } } \ No newline at end of file diff --git a/js/js.frontend/src/org/jetbrains/kotlin/js/config/JSConfigurationKeys.java b/js/js.frontend/src/org/jetbrains/kotlin/js/config/JSConfigurationKeys.java index 89607dcc9c7..7f2cc9040f4 100644 --- a/js/js.frontend/src/org/jetbrains/kotlin/js/config/JSConfigurationKeys.java +++ b/js/js.frontend/src/org/jetbrains/kotlin/js/config/JSConfigurationKeys.java @@ -124,6 +124,9 @@ public class JSConfigurationKeys { public static final CompilerConfigurationKey WASM_TARGET = CompilerConfigurationKey.create("wasm target"); + public static final CompilerConfigurationKey WASM_USE_TRAPS_INSTEAD_OF_EXCEPTIONS = + CompilerConfigurationKey.create("use wasm traps instead of throwing exceptions"); + public static final CompilerConfigurationKey ZIP_FILE_SYSTEM_ACCESSOR = CompilerConfigurationKey.create("zip file system accessor, used for klib reading"); diff --git a/wasm/wasm.ir/src/org/jetbrains/kotlin/wasm/ir/convertors/WasmIrToBinary.kt b/wasm/wasm.ir/src/org/jetbrains/kotlin/wasm/ir/convertors/WasmIrToBinary.kt index f63daeda78f..82b6f3d3c70 100644 --- a/wasm/wasm.ir/src/org/jetbrains/kotlin/wasm/ir/convertors/WasmIrToBinary.kt +++ b/wasm/wasm.ir/src/org/jetbrains/kotlin/wasm/ir/convertors/WasmIrToBinary.kt @@ -123,9 +123,11 @@ class WasmIrToBinary( } // tag section - appendSection(WasmBinary.Section.TAG) { - appendVectorSize(tags.size) - tags.forEach { appendTag(it) } + if (tags.isNotEmpty()) { + appendSection(WasmBinary.Section.TAG) { + appendVectorSize(tags.size) + tags.forEach { appendTag(it) } + } } appendSection(WasmBinary.Section.GLOBAL) { @@ -607,7 +609,7 @@ abstract class ByteWriter { fun writeUByte(v: UByte) { writeByte(v.toByte()) } - + fun writeUInt32(v: UInt) { writeByte(v.toByte()) writeByte((v shr 8).toByte()) diff --git a/wasm/wasm.tests/test/org/jetbrains/kotlin/wasm/test/handlers/WasmBoxRunner.kt b/wasm/wasm.tests/test/org/jetbrains/kotlin/wasm/test/handlers/WasmBoxRunner.kt index e8a0f0a6ae6..99098a60d68 100644 --- a/wasm/wasm.tests/test/org/jetbrains/kotlin/wasm/test/handlers/WasmBoxRunner.kt +++ b/wasm/wasm.tests/test/org/jetbrains/kotlin/wasm/test/handlers/WasmBoxRunner.kt @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.js.JavaScript import org.jetbrains.kotlin.test.DebugMode import org.jetbrains.kotlin.test.InTextDirectivesUtils import org.jetbrains.kotlin.test.directives.WasmEnvironmentConfigurationDirectives +import org.jetbrains.kotlin.test.directives.WasmEnvironmentConfigurationDirectives.DISABLE_WASM_EXCEPTION_HANDLING import org.jetbrains.kotlin.test.directives.WasmEnvironmentConfigurationDirectives.RUN_UNIT_TESTS import org.jetbrains.kotlin.test.model.TestFile import org.jetbrains.kotlin.test.services.TestServices @@ -191,6 +192,8 @@ class WasmBoxRunner( val testFileText = originalFile.readText() val failsIn: List = InTextDirectivesUtils.findListWithPrefixes(testFileText, "// WASM_FAILS_IN: ") + val disableExceptions = DISABLE_WASM_EXCEPTION_HANDLING in testServices.moduleStructure.allDirectives + val exceptions = listOf(WasmVM.V8, WasmVM.SpiderMonkey).mapNotNull map@{ vm -> try { if (debugMode >= DebugMode.DEBUG) { @@ -199,7 +202,8 @@ class WasmBoxRunner( vm.run( "./${entryMjs}", jsFilePaths, - workingDirectory = dir + workingDirectory = dir, + disableExceptionHandlingIfPossible = disableExceptions ) if (vm.shortName in failsIn) { return@map AssertionError("The test expected to fail in ${vm.name}. Please update the testdata.") diff --git a/wasm/wasm.tests/test/org/jetbrains/kotlin/wasm/test/tools/WasmVM.kt b/wasm/wasm.tests/test/org/jetbrains/kotlin/wasm/test/tools/WasmVM.kt index 4d7302204ac..c629ee3f16f 100644 --- a/wasm/wasm.tests/test/org/jetbrains/kotlin/wasm/test/tools/WasmVM.kt +++ b/wasm/wasm.tests/test/org/jetbrains/kotlin/wasm/test/tools/WasmVM.kt @@ -17,10 +17,10 @@ internal sealed class WasmVM(val shortName: String) { val name: String = javaClass.simpleName protected val tool = ExternalTool(System.getProperty("javascript.engine.path.$name")) - abstract fun run(entryMjs: String, jsFiles: List, workingDirectory: File?) + abstract fun run(entryMjs: String, jsFiles: List, workingDirectory: File?, disableExceptionHandlingIfPossible: Boolean = false) object V8 : WasmVM("V8") { - override fun run(entryMjs: String, jsFiles: List, workingDirectory: File?) { + override fun run(entryMjs: String, jsFiles: List, workingDirectory: File?, disableExceptionHandlingIfPossible: Boolean) { tool.run( "--experimental-wasm-gc", "--wasm-final-types", @@ -34,10 +34,11 @@ internal sealed class WasmVM(val shortName: String) { } object SpiderMonkey : WasmVM("SM") { - override fun run(entryMjs: String, jsFiles: List, workingDirectory: File?) { + override fun run(entryMjs: String, jsFiles: List, workingDirectory: File?, disableExceptionHandlingIfPossible: Boolean) { tool.run( "--wasm-verbose", "--wasm-gc", + *if (disableExceptionHandlingIfPossible) arrayOf("--no-wasm-exceptions") else emptyArray(), "--wasm-function-references", *jsFiles.flatMap { listOf("-f", it) }.toTypedArray(), "--module=$entryMjs", diff --git a/wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/FirWasmCodegenWasmJsInteropTestGenerated.java b/wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/FirWasmCodegenWasmJsInteropTestGenerated.java index b1dc05a9f55..18348e29e1c 100644 --- a/wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/FirWasmCodegenWasmJsInteropTestGenerated.java +++ b/wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/FirWasmCodegenWasmJsInteropTestGenerated.java @@ -139,6 +139,12 @@ public class FirWasmCodegenWasmJsInteropTestGenerated extends AbstractFirWasmCod runTest("compiler/testData/codegen/boxWasmJsInterop/nameClash.kt"); } + @Test + @TestMetadata("noExceptions.kt") + public void testNoExceptions() throws Exception { + runTest("compiler/testData/codegen/boxWasmJsInterop/noExceptions.kt"); + } + @Test @TestMetadata("nullableExternRefs.kt") public void testNullableExternRefs() throws Exception { diff --git a/wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/K1WasmCodegenWasmJsInteropTestGenerated.java b/wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/K1WasmCodegenWasmJsInteropTestGenerated.java index 66db239d690..376ff24c2a6 100644 --- a/wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/K1WasmCodegenWasmJsInteropTestGenerated.java +++ b/wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/K1WasmCodegenWasmJsInteropTestGenerated.java @@ -139,6 +139,12 @@ public class K1WasmCodegenWasmJsInteropTestGenerated extends AbstractK1WasmCodeg runTest("compiler/testData/codegen/boxWasmJsInterop/nameClash.kt"); } + @Test + @TestMetadata("noExceptions.kt") + public void testNoExceptions() throws Exception { + runTest("compiler/testData/codegen/boxWasmJsInterop/noExceptions.kt"); + } + @Test @TestMetadata("nullableExternRefs.kt") public void testNullableExternRefs() throws Exception {