Странное поведение i64 при вызове функции JavaScript из C ++ с использованием Emscripten: - PullRequest
2 голосов
/ 06 марта 2019

Как описано здесь Я пытаюсь вызвать функцию 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.

...