#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
, но это все еще находится на ранней стадии разработки.