Функция AssmeblyScript не вызывается

#typescript #assemblyscript

Вопрос:

У меня есть следующий модуль AssmemblyScript:

 export function add(a: i32, b: i32): i32 {
  return a   b;
}

export function printNum(a: string): f64 {
  return parseFloat(a);
}

 

Который генерируется с помощью asc assembly/index.ts --target release

Затем я использую это в файлах машинописи моего хоста:

 import fs from "fs";
import loader from "@assemblyscript/loader";
import { join } from "path";

const wasmModule = loader.instantiateSync(fs.readFileSync(join(__dirname, "..", "/build/untouched.wasm")), {});
module.exports = wasmModule.exports;

 

И я могу позвонить add просто отлично:

 const { add, printNum } = require("./wasm");
console.log(add(1, 2)); // correctly prints 3
 

Однако попытка вызова printNum не приводит к сбою процесса моего узла, но процесс завершается успешно, без вызова кода:

     const [row] = await db.getWhere({});
    console.log("balance", row.balance, typeof row.balance); // balance 123456789123456789.123456789123456789 string
    try {
      const result = printNum(row.balance);
      console.log("result", result);
    } catch (error) {
      console.log(error);
    }
    console.log(add(1, 2));

    console.log("done");
 

printNum Функция никогда не вызывается, или она вызывается и внутренне ошибается? Я не получаю никаких ошибок в catch и последующих двух консолях.журналы никогда не вызываются

Если я закомментирую всю printNum попытку/уловку, эти следующие две консоли.журналы выполняются

С чего мне начать отладку этого? Или кто-нибудь может обнаружить какие-либо ошибки в самом моем printNum методе AssemblyScript, которые могут вызвать это?

Ответ №1:

printNum принимает указатель на строку. Для создания новой строки используйте __newString и передайте возвращенный указатель на printNum .

 const { add, printNum, __newString } = require("./wasm");
const result = printNum(__newString(row.balance));
 

Ссылка

Комментарии:

1. Ты прав! Понял это после того, как написал. В стороне, знаете ли вы, почему export function printNum(a: string): string { const num = <f64>parseFloat(a); const res: f64 = num 1; return res.toString(); } бы вернуть «123456789123456790.0» после того, как его так назвали: const ptr = __newString(row.balance); const result = printNum(ptr); ? Для меня, переходя в «123456789123456789.123456789123456789», следует вернуть «123456789123456790.123456789123456789»

2. f64 может содержать только определенную точность. Просто вставьте номер в консоль разработчика и распечатайте его, чтобы он уже был усечен.

3. попался! Содержит ли AssemblyScript тип числа, который соответствовал бы такой точности?

4. f64 уже является двойным. Для всего остального вам понадобится что-то вроде as-bignum , но это все еще находится на ранней стадии разработки.