2

我正在开发一个多平台的 RISC-V 模拟器Kotlin,我已经被一个问题困住了一个多星期。我已经尝试了所有可以在网上找到的东西,但我没有运气。

给你一点背景信息:我正在尝试将这个项目(在这里你可以下载我的代码)绑定到VMB(虚拟主板,在这里你可以通过WebSockets. 我已经完成了通信部分并在JVM分支上对其进行了测试(我还制作了另一个小型 Kotlin JS项目,其中只有通信部分的代码,它工作正常,但由于某种原因,当我把所有东西放在一起时,它只是不起作用)。它构建没有任何错误,甚至可以正常工作(扩展),直到我尝试连接到VMB,然后我在浏览器的控制台中收到错误消息Uncaught TypeError: this.resultContinuation_0 is undefined. 我已经在这个问题上浪费了很多时间,而且我很确定这只是我遗漏的一些小东西(甚至可能很明显)。

重现问题的步骤:

  1. 下载项目(您将同时需要venusVMB
  2. grunt如果您没有,请下载并安装在您的机器上
  3. vmb文件夹中双击mother.exe并确保单击电源按钮(它仅适用于 Windows,抱歉)
  4. 打开venus项目并使用(通常将项目识别为自动)InteliJ构建它gradleIntelliJgradle
  5. 构建完成后,在文件夹中打开一个Powershell或运行cmdvenusgrut dist
  6. 结果现在应该在out目录中。
  7. 您可能需要XAMPP在本地服务器上托管文件,以防万一CORS Error
  8. 当您打开页面时,转到Simulator选项卡,然后单击Assemble & Simulate from Editor按钮。
  9. 您现在应该能够在控制台中看到错误。

任何帮助都非常感谢,因为我已经被这个问题困扰了好几天了。谢谢!

编辑:

进一步挖掘后,我注意到每当我调用suspend函数时都会出现问题onclick

例如:我在中创建了一个函数Driver.kt

    @JsName("connect")
    suspend fun connect() {
        sim.connectToMotherboard()
    }

挂起的函数在哪里connectToMotherboard(),每当按下按钮时我都会调用它。

HTML:

<button class="button is-primary" onclick="driver.connect()">Connect to Motherboard</button>

这给了我与标题中提到的相同的错误。为开发人员下载后Firefox,我收到了以下消息:

Uncaught TypeError: can't access property "context", this.resultContinuation_0 is undefined
4

1 回答 1

1

好的,问题是我@JSName在 HTML 代码中调用了一些函数。像这样的东西:

@JsName("doSomething")
suspend fun doSomething() {
    // some code...
}

然后在我的 HTML 代码中,我有一些这样的行:

<button id="someButton" class="button" onclick="doSomething()">Click Me</button>

这里的关键是suspend关键字。如果从 JS/HTML 调用“普通”函数没有问题,但suspend不能从 HTML 调用函数。它必须在一个launch块或 a中Coroutine,否则Continuation将是null。所以我把kotlin代码改成这样:

val myButton = document.getElementById("someButton")
simulatorRunButton!!.addEventListener("click", {
    launch(EmptyCoroutineContext) {
        doSomething()
    }
})

当然,在这样做之后,我必须onclick从我的 HTML 对象中删除该部分,如下所示:

<button id="someButton" class="button">Click Me</button>
于 2020-07-14T15:43:53.707 回答