问题标签 [duktape]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
64 浏览

javascript - Duktape 关于嵌入式 MCU 堆问题

我在 ESP32 上运行 Duktape。它没有太多的 RAM,但应该足够了,除了加载和编译大型程序。

实际上,我已经遇到了 3kb 大小的 js 程序的问题。我可以将它作为字符串推送到 Duktape 堆栈,但是当我调用duk_compile. 似乎它超出了空闲堆。

在没有太多可用 RAM 的情况下,如何正确加载和编译大型 js 程序?

ESP32 报告说在我编译之前它有大约 100kb 的空闲堆。它很奇怪。

0 投票
1 回答
70 浏览

duktape - 如何在 Duktape 2.5.0 中使用超时来防止 JavaScript 循环等

我正在使用受保护的调用成功运行 Duktape JavaScript——实际上是使用 duk_peval() 调用的。

我想捕获无限循环等。我已阅读指南并了解我需要设置一个定期调用的函数,我可以在其中检查是否已经过了太多时间。如果是这样,我返回 1 来解除 duk_peval 调用。但我不明白如何/在哪里设置该函数 - 大概是在 C(++) 中调用duk_peval()并可能在宏中声明它之前。

正确的设置应该是什么样子?

0 投票
1 回答
58 浏览

javascript - Duktape - 评估时 for of 循环出错

使用以下代码,duktape 为我提供了 for of 循环的解析错误。

有解决方法吗?它也使用缓冲区执行此操作。

0 投票
0 回答
27 浏览

javascript - Android Duktape NullPointerException,而 Internet 不存在

当我的手机上没有互联网时,我得到一个空异常。

它在这里显示错误:

验证结果:字符串?= jsBinder.androidWrapper(函数名,gson.toJson(输入))

  • 输入是任何类型

  • functionName 是字符串类型

  • gson 是 GSON 类型

0 投票
1 回答
59 浏览

duktape - 从 Duktape 调用的 C++ 函数中的错误捕获和恢复

我为 OpenCPN 海上导航程序创建了一个插件,它结合了 Duktape 以提供脚本功能。OpenCPN 使用 wxWidgets。

基本上,该插件为用户提供了一个控制台,该控制台包括一个脚本窗口、一个输出窗口和各种按钮。用户输入他们的脚本(或从 .js 文件加载它)并单击运行。该脚本使用 duk_peval 运行。返回时,我会显示结果,销毁上下文并等待用户再次运行,可能是在修改脚本之后。这一切运作良好。但是,请考虑以下测试脚本:

如果 add 调用中的两个参数相等。该脚本会引发错误,用户可以重试。这一切都有效。

现在我可以将 add实现为 c++ 函数:

如所写,这会将错误传递给致命错误处理程序。我知道我不能尝试进一步使用 Duktape,但我可以显示错误 OK。但是,我没有办法回到插件。规定的操作是退出或中止,但这些都终止托管应用程序,这是绝对不可接受的。理想情况下,我需要能够从 duk_peval 调用中返回错误。

我尝试使用来自外部 C++ 函数的 duk_pcall 运行 add 函数。这会捕获错误,我可以从该外部函数中显示它。但是当我从那个外部函数返回时,脚本在不应该的时候继续执行,并且从 duk_peval 调用的最终返回不知道错误。

我知道我可以在脚本中使用 try/catch,但可能会调用数十次 OpenCPN API,这是不现实的。将错误返回代码一直渗透回去,可能通过几个 C++ 函数,然后到顶层脚本也将非常麻烦,因为脚本和函数可能非常复杂。

谁能建议一种将控制权传回给我的调用插件的方法-最好是从 duk_peval 返回?

0 投票
1 回答
81 浏览

duktape - 如何使用 duk_pcall 多次运行整个 js 文件?

我想用duk_pcall它来做,这是我尝试过的:

  • 首先,我将脚本文件加载到char* string.
  • 其次,用于duk_pcompile_string(ctx, 0, programBody)编译它。
  • 然后,我可以使用duk_pcall(ctx, 0)一次调用它,然后调用duk_pop(ctx).

但是当我尝试duk_pcall第二次使用时,我失败了。

你能给我一些关于如何以正确的方式做到这一点的建议吗?

0 投票
0 回答
32 浏览

duktape - 你可以在没有 duk_destroy_heap/duk_create_heap 的情况下将 duk_context 重置为干净的堆吗?

我希望能够非常快速地运行大量 JavaScript 片段,并且每个片段都可能污染全局命名空间等,但不希望一个片段泄漏/干扰另一个片段。如果我在每个之间进行 duk_destroy_heap/duk_create_heap,它确实会减慢处理速度,例如 ~20 倍。那么,有没有办法将上下文“重置”回初始化状态(以一种有效的方式)?

0 投票
2 回答
39 浏览

duktape - 在 ECMAscript throw() 之后如何获取错误对象?

我可以通过推送一个错误对象然后调用 duk_throw() 在 C++ 代码中抛出错误。duk_pcall() 返回“结果!= DUK_EXEC_SUCCESS”,我可以检查错误对象以确定,例如,调用我的 API 的行号。一切正常,谢谢。

如果脚本使用 EMCAscript throw( ) 抛出错误,duk_pcall( ) 将返回 'outcome != DUK_EXEC_SUCCESS' ,但堆栈上没有错误对象。所以我无法确定行号。由于 throw 可能在使用 require() 加载的脚本中并且对用户不可见,因此很遗憾。

是否可以从 ECMAscript throw() 中获取错误对象?

0 投票
1 回答
52 浏览

javascript - 当对象在 duktape 中被删除/处置时,我该如何做一些清理工作?

我有一个自定义类,它调用本机方法在构造方法中分配缓冲区,如下所示:

当 MyClass 的实例被删除时,缓冲区必须被释放。我可以像下面这样在 javascript 中定义析构函数吗?GC发生时会调用它吗?

0 投票
2 回答
59 浏览

duktape - duktape js - 具有多个上下文,具有自己的全局并引用一个常见的“单例”

我们正在将 JS 嵌入到我们的应用程序中,我们将使用几十个脚本,每个脚本都分配给一个事件。在这些脚本中,我们提供了一个最小的回调 api,

每当该事件发生时都会调用它。脚本必须有自己的全局,因为这个函数总是有相同的名称,我们从 cpp 代码访问它

再一次,我们希望允许脚本之间的最小通信,例如

脚本 1

脚本 2

我们有没有办法做到这一点?也许通过引入一个自己的“ueber-”全局对象,它被定义一次并且在任何地方都可以引用?应该可以从任何脚本向这个“ueber-global object”添加属性,例如

脚本 1

脚本 2