Не задается строка через webassembly

Есть код на js, и c++ который компилится в wasm. дальше я передаю в функцию указатель на конкретную область памяти (2000) куда мне wasm должен записать значение строки. но в результате эта область памяти равна нулю, т.е. такое впечатление что не записывается.

let moduleMemory = null
let tableMemory = null

let moduleExports = null
let bytes = null

function initializePage() {
  moduleMemory = new WebAssembly.Memory({
    initial: 1,
    maximum: 1,
  })

  tableMemory = new WebAssembly.Table({
    initial: 0,
    maximum: 0,
    element: 'anyfunc',
  })

  const importObject = {
    env: {
      __memory_base: 0,
      __table_base: 0,
      memory: moduleMemory,
      table: tableMemory,
    },
    wasi_snapshot_preview1: {
      proc_exit: () => {},
    },
  }

  WebAssembly.instantiateStreaming(fetch('./validate.wasm'), importObject).then((result) => {
    moduleExports = result.instance.exports
    bytes = new Uint8Array(moduleMemory.buffer)

    const res = moduleExports.setName(2000)

    console.log(res)
    console.log(bytes)
  })
}

код на c++:

#ifdef __EMSCRIPTEN__
  #include <emscripten.h>
#endif

#ifdef __cplusplus
extern "C" {
#endif

#ifdef __EMSCRIPTEN__
  EMSCRIPTEN_KEEPALIVE
#endif
int setName(char* return_name) {
  *return_name = 'a';
  return_name++;
  *return_name = 'b';
  return_name++;
  *return_name = 'c';

  return 0;
}

#ifdef __cplusplus
}
#endif

int main() {
  return 0;
}

пробовал запускать в vs studio вот так, как консольное cpp приложение, работает:

int main() {
    char res[255] = "";

    setName(res);
    printf("print: %s", res);
    return 0;
}

не подскажите почему в консольном приложении записывает строку, а в wasm нет?


Ответы (1 шт):

Автор решения: user2815962

нашел ошибку, если кому будет полезно то вот рабочий код:

let moduleExports = null
let moduleMemory = null
let bytes = null

function initializePage() {
  const importObject = {
    env: {
    },
    wasi_snapshot_preview1: {
      proc_exit: () => {},
    },
  }

  WebAssembly.instantiateStreaming(fetch('./validate.wasm'), importObject).then((result) => {
    moduleExports = result.instance.exports
    moduleMemory = moduleExports.memory
    bytes = new Uint8Array(moduleMemory.buffer)

    moduleExports.setName(2000)

    let res = ''
    for (let i = 0; i < 3; ++i) {
      const code = bytes[2000 + i]
      const char = String.fromCharCode(code)
      res += char
    }

    console.log(res)
  })
}

если коротко, то нужно брать область памяти не ту что в importObject при инициализации указывал, а ту что приходит в ответе в result.instance.exports.memory. и все заработало

→ Ссылка