Как правильно распределить память между моим модулем AssemblyScript и моим JS? - PullRequest
1 голос
/ 17 февраля 2020

Я следую этому коду здесь , пытаясь разделить память между моим кодом AssemblyScript и моим JS:

  let aryPtr = instance.exports.allocateF32Array(3);
  let ary = new Float32Array(instance.exports.memory.buffer, aryPtr, 3);

  ary[0] = 1.0;
  ary[1] = 2.0;
  instance.exports.addArray(aryPtr);

И моим index.ts:

export function allocateF32Array(length: i32): Float32Array {
  return new Float32Array(length);
}

export function addArray(data: Float32Array): i32 {
  data[2] = data[0] + data[1];
  return data.length;
}

Но это приводит к RuntimeError: memory access out of bounds в addArray. Я неправильно понял, как это должно работать?

1 Ответ

1 голос
/ 17 февраля 2020

Я рекомендую использовать загрузчик для таких целей.

На JavaScript (node.js например) стороне:

const fs = require("fs");
const loader = require("@assemblyscript/loader");
const module = loader.instantiateSync(
  fs.readFileSync("optimized.wasm"),
  {}
);
var ptrArr = module.__retain(module.__allocArray(module.FLOAT32ARRAY, [1, 2, 0]));
console.log('length:', module.addArray(ptrArr));

const arr = module.__getFloat32Array(ptrArr);
console.log('result:', arr[2]);

// free array
module.__release(ptrArr);

На стороне AssemblyScript:

export const FLOAT32ARRAY = idof<Float32Array>();

export function addArray(data: Float32Array): i32 {
  data[2] = data[0] + data[1];
  return data.length;
}
...