Как описано здесь Я пытаюсь вызвать функцию 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
с результирующим «двоичным» (в моем случае это общая библиотека.
Когда я вызываю foo()
из C ++, как показано, вызывается реализация JS, но параметры нарушены, например. b
становится 0, тогда как a
кажется нормальным (но на самом деле успешно передаются только значения до INT_MAX).
Когда я добавляю еще один int32_t
аргумент, я вижу, что значение для b
get's сместилось на c - так что похоже, что a
интерпретируется как 32 значение бита, в то время как следующие 32 бита a
принимаются за b
, а b
- c
:
aaaaaaaabbbbcccc <- alignment on stack
aaaabbbbcccc <- interpreted alignment on stack
Это известное поведение? Я делаю что-то неправильно? Это ошибка?
Я использую версию EMSDK sdk-1.38.28-64bit
.