【问题标题】:Why is my Kotlin/JS program failing with "RangeError: Maximum call stack size exceeded"?为什么我的 Kotlin/JS 程序因“RangeError:超出最大调用堆栈大小”而失败?
【发布时间】:2022-06-24 04:48:50
【问题描述】:

我编写了一个在某些 JavaScript 引擎上崩溃的 Kotlin/JS 程序。

它在 GraalVM 上像这样崩溃:

RangeError: Maximum call stack size exceeded
    at <js> 839(myprogram.js:394:1174923-1174934)
    at <js> e(myprogram.js:394:1175309-1175342)
    at <js> 724(myprogram.js:394:1174990-1174995)
    at <js> e(myprogram.js:394:1175309-1175342)
    at <js> :anonymous(myprogram.js:394:1175222-1175358)
    at <js> :program(myprogram.js:394:13041-1175382)
    at org.graalvm.polyglot.Context.eval(Context.java:345)

在 Duktape 上是这样失败的:

com.squareup.duktape.DuktapeException: RangeError: compiler recursion limit (line 1)
    at com.squareup.duktape.Duktape.evaluate(Native Method)
    at com.squareup.duktape.Duktape.evaluate(Duktape.java:60)

此崩溃是从 Kotlin 1.4.10 升级到 1.6.21 时引入的。

【问题讨论】:

    标签: graalvm kotlin-js duktape


    【解决方案1】:

    Kotlin/JS 在生产构建中使用代码收缩器。代码收缩器 Terser 会生成非常长的语句,超出某些编译器的默认限制。

    要解决此问题,请将 Terser 配置为生成更小的行。创建一个文件,subproject/webpack.config.d/myWebpackConfig.js,其中 subproject 是生成 Kotlin/JS 可执行文件的 Gradle 模块。

    在该文件中,粘贴以下内容:

    config.optimization = config.optimization || {};
    const TerserPlugin = require("terser-webpack-plugin");
    config.optimization.minimizer = [
        new TerserPlugin({
            terserOptions: {
                compress: {
                    sequences: 10
                },
            },
        }),
    ];
    

    更改sequences 选项的值是关键。默认值为 200,每行可容纳 200 条逻辑语句。通过将其缩小到 10 个 Terser 会发出更小的语句。

    【讨论】:

      猜你喜欢
      • 2014-04-03
      • 1970-01-01
      • 1970-01-01
      • 2018-02-06
      • 1970-01-01
      • 2021-09-21
      • 2021-05-30
      相关资源
      最近更新 更多