如here所述,我正在尝试调用JavaScript函数foo()
,该函数采用64位整数和其他任何类型作为C ++的参数:
// declaration
extern "C" {
void foo(int64_t a, int32_t b);
}
// call
foo(123456789, 4);
在foo.js
中,我实现了foo()
:
mergeInto(LibraryManager.library, {
foo: function(a, b) {
console.log(a, b);
}});
..并通过--js-library foo.js
将其“链接”到生成的“二进制文件”(在我的情况下是共享库。
如图所示,当我从C ++调用foo()
时,调用了JS实现,但参数已损坏,例如b
变为0,而a
似乎没问题(但实际上只有成功传递最大INT_MAX的值)。
当我添加另一个int32_t
参数时,我可以看到b
的值已被移位到 c -因此看起来像{{ 1}}被解释为32位值,而a
的后32位被视为a
,而b
被视为b
:
c
这是已知行为吗?难道我做错了什么?这是错误吗?
我正在使用EMSDK版本aaaaaaaabbbbcccc <- alignment on stack
aaaabbbbcccc <- interpreted alignment on stack
。