рдореИрдВ AS рдФрд░ JS рд╕реЗ рдореЗрдореЛрд░реА рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП MDN рдЙрджрд╛рд╣рд░рдг рдЬреИрд╕реЗ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред
рд▓реЗрдХрд┐рди u8/i8 рдХреЛ рдЫреЛрдбрд╝рдХрд░, рд╕рднреА рдкрд░реАрдХреНрд╖рдг рдкреИрдЯрд░реНрди рд╡рд┐рдлрд▓ рд╣реЛ рдЧрдП рдФрд░ рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ JS рджреНрд╡рд╛рд░рд╛ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рдбреЗрдЯрд╛ AS рджреНрд╡рд╛рд░рд╛ рджрд┐рдЦрд╛рдП рдЧрдП рдбреЗрдЯрд╛ рд╕реЗ рднрд┐рдиреНрди рд╣реИред
рдореИрдВ рдлреНрд▓реЛрдЯ рдореЗрдВ рдбреЗрдЯрд╛ рдХреИрд╕реЗ рд╕реНрдЯреЛрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ?
рдореЗрд░реЗ рдХреЛрдб рдЬреИрд╕реЗ:
```index.ts
// рдЕрд╕реЗрдВрдмрд▓реА/index.ts
рдирд┐рд░реНрдпрд╛рдд рд╕рдорд╛рд░реЛрд╣ readMemoryU8 (рдСрдлрд╝рд╕реЗрдЯ: рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ): u8 {
рд╡рд╛рдкрд╕реА рднрд╛рд░
}
рдирд┐рд░реНрдпрд╛рдд рд╕рдорд╛рд░реЛрд╣ рд▓рд┐рдЦреЗрдВ рдореЗрдореЛрд░реАрдпреВ 8 (рдСрдлрд╝рд╕реЗрдЯ: рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдорд╛рди: рдпреВ 8): рд╢реВрдиреНрдп {
рджреБрдХрд╛рди
}
рдирд┐рд░реНрдпрд╛рдд рд╕рдорд╛рд░реЛрд╣ readMemoryU16 (рдСрдлрд╝рд╕реЗрдЯ: рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ): u16 {
рд╡рд╛рдкрд╕реА рднрд╛рд░
}
рдПрдХреНрд╕рдкреЛрд░реНрдЯ рдлрдВрдХреНрд╢рди рд░рд╛рдЗрдЯрдореЗрдореЛрд░реАрдпреВ16 (рдСрдлрд╝рд╕реЗрдЯ: рдпреВрдЬрд╝, рд╡реИрд▓реНрдпреВ: рдпреВ16): рд╢реВрдиреНрдп {
рджреБрдХрд╛рди
}
рдирд┐рд░реНрдпрд╛рдд рд╕рдорд╛рд░реЛрд╣ readMemoryF64 (рдСрдлрд╝рд╕реЗрдЯ: рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ): f64 {
рд╡рд╛рдкрд╕реА рднрд╛рд░
}
рдПрдХреНрд╕рдкреЛрд░реНрдЯ рдлрдВрдХреНрд╢рди рд░рд╛рдЗрдЯрдореЗрдорд░реАрдПрдл 64 (рдСрдлрд╕реЗрдЯ: рдпреВрдЬ, рд╡реИрд▓реНрдпреВ: рдПрдл 64): рд╢реВрдиреНрдп {
рджреБрдХрд╛рди
}
//...
```index.js
// index.js
const fs = require("fs");
const compiled = new WebAssembly.Module(fs.readFileSync(__dirname + "/build/optimized.wasm"));
const imports = {};
Object.defineProperty(module, "exports", {
get: () => new WebAssembly.Instance(compiled, imports).exports
});
```index.test.js
// __tests__/index.test.js
const wasm = рдЖрд╡рд╢реНрдпрдХрддрд╛ ('../index');
рдХреЙрдиреНрд╕реНрдЯ рдореЗрдореЛрд░реА = wasm.memory;
рд╡рд░реНрдгрди рдХрд░реЗрдВ ('рдЯреЗрд╕реНрдЯ WASM', () => {
рдкрд╣рд▓реЗ рд╕рднреА (() => {
рдХреЙрдиреНрд╕реНрдЯ рдореЗрдо = рдирдпрд╛ Uint8Array (рдореЗрдореЛрд░реА.рдмрдлрд░);
рдЕрдЧрд░ (рдореЗрдоред рд▓рдВрдмрд╛рдИ <1) {
рдореЗрдореЛрд░реА.рдЧреНрд░реЛ (1);
}
wasm.memory.grow(1);
});
рдкрд░реАрдХреНрд╖рдг ('uint8 рдкрдврд╝реЗрдВ / рд▓рд┐рдЦреЗрдВ', () => {
рдХреЙрдиреНрд╕реНрдЯ рдореЗрдо = рдирдпрд╛ Uint8Array (рдореЗрдореЛрд░реА.рдмрдлрд░);
mem.set([1, 3, 5]);
console.log([0, 1, 2, 3, 4, 5].map(wasm.readMemoryU8));
// [ 1, 3, 5, 0, 0, 0 ]
console.log(mem.subarray(0, 6));
//Uint8Array [ 1, 3, 5, 0, 0, 0 ]
expect(wasm.readMemoryU8(1)).toBe(3);
wasm.writeMemoryU8(1, 6);
expect(wasm.readMemoryU8(1)).toBe(6);
expect(mem[1]).toBe(6);
expect(wasm.readMemoryU8(0)).toBe(1);
expect(wasm.readMemoryU8(2)).toBe(5);
});
рдкрд░реАрдХреНрд╖рдг ('uint16 рдкрдврд╝реЗрдВ / рд▓рд┐рдЦреЗрдВ', () => {
рдХреЙрдиреНрд╕реНрдЯ рдореЗрдо = рдирдпрд╛ Uint16Array (рдореЗрдореЛрд░реА.рдмрдлрд░);
mem.set([1, 3, 257]);
console.log([0, 1, 2, 3, 4, 5].map(wasm.readMemoryU16));
// [ 1, 768, 3, 256, 257 ]
console.log(mem.subarray(0, 6));
// Uint16Array [ 1, 3, 257, 0, 0, 0 ]
expect(wasm.readMemoryU16(0)).toBe(1);
expect(wasm.readMemoryU16(1)).toBe(3); // failed
wasm.writeMemoryU16(1, 6);
expect(wasm.readMemoryU16(1)).toBe(6);
expect(mem[1]).toBe(6);
expect(wasm.readMemoryU16(2)).toBe(5);
});
рдкрд░реАрдХреНрд╖рдг ('рдлреНрд▓реЛрдЯ 64 рдкрдврд╝реЗрдВ / рд▓рд┐рдЦреЗрдВ', () => {
рдХреЙрдиреНрд╕реНрдЯ рдореЗрдо = рдирдпрд╛ рдлреНрд▓реЛрдЯ64рдПрд░реЗ (рдореЗрдореЛрд░реА.рдмрдлрд░);
mem.set([1, -3.2, 25.8]);
console.log([0, 1, 2, 3, 4, 5].map(wasm.readMemoryF64));
// [ 1,
// -3.0065162379579438e-182,
// -2.413170169815393e-185,
// -2.3536706995205933e-185,
// -2.3534382797147542e-185,
// -2.3534373718248877e-185 ]
console.log(mem.subarray(0, 6));
// Float64Array [ 1, -3.2, 25.8, 0, 0, 0 ]
expect(wasm.readMemoryF64(0)).toBe(1);
expect(wasm.readMemoryF64(1)).toBe(-3.2); // failed
wasm.writeMemoryI16(1, -6.5);
expect(wasm.readMemoryF64(1)).toBe(-6.5);
expect(mem[1]).toBe(-6.5);
expect(wasm.readMemoryI16(2)).toBe(25.8);
});
});
```
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдСрдлрд╝рд╕реЗрдЯ рдХреЗ рд▓рд┐рдП рдЗрдВрдХреНрд░реАрдореЗрдВрдЯ рд╣рдореЗрд╢рд╛ 1
рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ 8-рдмрд┐рдЯ рдорд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рд╣реИ, рд▓реЗрдХрд┐рди 16-рдмрд┐рдЯ рдХреЗ рд▓рд┐рдП $# 2
4
рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЖрджрд┐, рдпрд╣рд╛рдБ рдПрдХ рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИ рдЬрд╣рд╛рдБ рдорд╛рди рдПрдХ рджреВрд╕рд░реЗ рдХреЛ рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рдХрд░ рджреЗрддреЗ рд╣реИрдВред
@dcodeIO
рдпрд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИред рдЬрдм store<f64>(0, 1.5)
, рддреЛ store<f64>(1, 2.7)
, рдЗрд╕ рд╕рдордп рдореЗрдВ load<f64>(0)
рдПрдХ рдЕрдЬреАрдм рдореВрд▓реНрдп рд▓реМрдЯрд╛рдПрдЧрд╛ред рд▓реЗрдХрд┐рди load<f64>(1)
рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛ 2.7
ред
рдЖрдкрдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ offset
рд╕рдЯреАрдХ рд╕реНрдореГрддрд┐ рд╕реНрдерд┐рддрд┐ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдЗрдВрдбреЗрдХреНрд╕ рдкрд╛рд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдЧреБрдгрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред f64
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рдСрдлрд╝рд╕реЗрдЯ рдХреЛ 8
рдмрд╛рдЗрдЯреНрд╕ рд╕реЗ рдмрдврд╝рд╛рдирд╛ рд╣реЛрдЧрд╛ (рдпрд╣ 64-рдмрд┐рдЯ рдорд╛рди рд╣реИ) рддрд╛рдХрд┐ рдорд╛рди рдПрдХ рджреВрд╕рд░реЗ рдХреЛ рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рди рдХрд░реЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП
export function readMemoryF64(index: u32): f64 {
return load<f64>(index << alignof<f64>());
}
export function writeMemoryF64(index: u32, value: f64): void {
store<f64>(index << alignof<f64>(), value);
}
@dcodeIO
рдкрд░реАрдХреНрд╖рд╛ рдЙрддреНрддреАрд░реНрдг рдХреА!
рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж!
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдЖрдкрдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ
offset
рд╕рдЯреАрдХ рд╕реНрдореГрддрд┐ рд╕реНрдерд┐рддрд┐ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдЗрдВрдбреЗрдХреНрд╕ рдкрд╛рд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдЧреБрдгрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИредf64
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рдСрдлрд╝рд╕реЗрдЯ рдХреЛ8
рдмрд╛рдЗрдЯреНрд╕ рд╕реЗ рдмрдврд╝рд╛рдирд╛ рд╣реЛрдЧрд╛ (рдпрд╣ 64-рдмрд┐рдЯ рдорд╛рди рд╣реИ) рддрд╛рдХрд┐ рдорд╛рди рдПрдХ рджреВрд╕рд░реЗ рдХреЛ рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рди рдХрд░реЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП