【问题标题】:AssmeblyScript function doesn't get called没有调用 AssmeblyScript 函数
【发布时间】:2021-08-14 14:06:54
【问题描述】:

我有以下 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生成的

然后我在我的主机 TypeScript 文件中使用它:

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 不会使我的 Node 进程崩溃,但进程会成功退出,而不会调用代码:

    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 中没有收到任何错误,并且从不调用后续两个console.logs

如果我将整个printNum try/catch 注释掉,接下来的两个console.log 将被执行

我从哪里开始调试呢?或者任何人都可以在我的 AssemblyScript printNum 方法本身中发现任何可能导致这种情况的错误吗?

【问题讨论】:

    标签: typescript assemblyscript


    【解决方案1】:

    printNum 接受一个指向字符串的指针。要创建一个新字符串,请使用__newString 并将返回的指针传递给printNum

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

    Reference

    【讨论】:

    • 你是对的!发帖后才发现。顺便说一句,你知道为什么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”
    • 一个 f64 只能保持特定的精度。只需将数字粘贴到您的开发控制台中并打印它就会截断它。
    • 知道了! AssemblyScript 是否包含可以适应这种精度的数字类型?
    • f64 已经是双精度数了。对于其他所有内容,您都需要 as-bignum 之类的东西,但这仍处于早期开发阶段。
    猜你喜欢
    • 2018-05-30
    • 2020-04-15
    • 2018-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-17
    相关资源
    最近更新 更多