Assemblyscript: comment puis-je obtenir des chaînes d'AS dans JS

Créé le 3 août 2018  ·  6Commentaires  ·  Source: AssemblyScript/assemblyscript

Je suis assez nouveau dans AS et WA, et mon doute actuel est de savoir comment obtenir des chaînes et des tableaux à partir de JavaScript.

index.js

const fs = require("fs");
const abort = () => { throw new Error('....') };
const compiled = new WebAssembly.Module(fs.readFileSync("aaa.wasm"));
const instance = new WebAssembly.Instance(compiled, { env: { abort } })
const lib = instance.exports

console.log('  say', ':', lib.say("oi"))
console.log('  say', ':', lib.say("hi"))
console.log('  add', ':', lib.add(100, 100))
console.log('teste', ':', lib.teste())

index.ts

import 'allocator/buddy';

export function say(hello: string): string {
  return hello + " world"
}

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

export function teste(): string {
  let x = "ZZZZZZZZZZZZ"
  return x;
}

copier et exécuter avec nodejs

$ asc assembly\index.ts -o aaa.wasm 
$ node index.js

ce que j'obtiens (je soupçonne que ces entiers sont des pointeurs de mémoire, j'ai raison?)

  say : 3136
  say : 3168
  add : 200
teste : 84

ce que j'attends

  say : oi world
  say : hi world
  add : 200
teste : ZZZZZZZZZZZZ

Désolé pour mon anglais médiocre, je viens du Brésil et le portugais est ma langue principale, et merci pour l'aide.

question

Commentaire le plus utile

Je publie simplement mes tests comme référence / exemple à d'autres programmeurs aventuriers:

index.ts

import "allocator/tlsf";

export { memory };

export function say(hello: string): string {
  return hello + " world"
}

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

export function teste(): string {
  let x = "ZZZZZZZZZZZZ"
  return x;
}

export class X {
  teste(): String {
    return "Aew";
  }
}

index.js

const loader = require("./assemblyscript/lib/loader/index");
const fs = require("fs");
const file = fs.readFileSync("index.wasm")
const lib = loader.instantiateBuffer(file, {});
const x = new lib.X()

console.log('   say :' , lib.getString(lib.say(lib.newString("oi"))))
console.log('   say :' , lib.getString(lib.say(lib.newString("hi"))))
console.log('   add :' , lib.add(100, 100))
console.log(' teste :' , lib.getString(lib.teste()))
console.log('method :' , lib.getString(x.teste()))

compiler et exécuter

λ asc index.ts -o index.wasm
λ node index.js

résultats

   say : oi world
   say : hi world
   add : 200
 teste : ZZZZZZZZZZZZ
method : Aew

Tous les 6 commentaires

Le chargeur fournit un utilitaire pour lire une chaîne de la mémoire en utilisant son pointeur (ici: getString ), mais vous pouvez également le faire manuellement en fonction de la disposition de la

J'ai lu la documentation du chargeur et j'essaye de l'utiliser sans succès,
Est-ce que je fais quelque chose de mal?
Ai-je besoin d'installer un chargeur via npm?

index.ts

const loader = require("@assemblyscript/loader");
const file = fs.readFileSync("aaa.wasm")
const fs = require("fs");
const myModule = loader.instatiateBuffer(file, {});

Erreur

internal/modules/cjs/loader.js:583
    throw err;
    ^

Error: Cannot find module '@assemblyscript/loader'
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:581:15)
    at Function.Module._load (internal/modules/cjs/loader.js:507:25)
    at Module.require (internal/modules/cjs/loader.js:637:17)
    at require (internal/modules/cjs/helpers.js:20:18)
    at Object.<anonymous> (C:\terminal\user\personal\wasmTs\index.js:1:78)
    at Module._compile (internal/modules/cjs/loader.js:689:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)
    at Module.load (internal/modules/cjs/loader.js:599:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:538:12)
    at Function.Module._load (internal/modules/cjs/loader.js:530:3)

Le chargeur n'est pas encore sur npm. Pour l'instant, essayez:

const loader = require("assemblyscript/lib/loader");

Wow, cela a fonctionné !!!

J'ai trouvé une erreur dans la documentation du const myModule = loader.instatiateBuffer(fs.readFileSync("myModule.wasm"), myImports); place insta n tiateBuffer.

Merci beaucoup pour l'aide! ^^

Je publie simplement mes tests comme référence / exemple à d'autres programmeurs aventuriers:

index.ts

import "allocator/tlsf";

export { memory };

export function say(hello: string): string {
  return hello + " world"
}

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

export function teste(): string {
  let x = "ZZZZZZZZZZZZ"
  return x;
}

export class X {
  teste(): String {
    return "Aew";
  }
}

index.js

const loader = require("./assemblyscript/lib/loader/index");
const fs = require("fs");
const file = fs.readFileSync("index.wasm")
const lib = loader.instantiateBuffer(file, {});
const x = new lib.X()

console.log('   say :' , lib.getString(lib.say(lib.newString("oi"))))
console.log('   say :' , lib.getString(lib.say(lib.newString("hi"))))
console.log('   add :' , lib.add(100, 100))
console.log(' teste :' , lib.getString(lib.teste()))
console.log('method :' , lib.getString(x.teste()))

compiler et exécuter

λ asc index.ts -o index.wasm
λ node index.js

résultats

   say : oi world
   say : hi world
   add : 200
 teste : ZZZZZZZZZZZZ
method : Aew

Clôture de ce problème pour l'instant car il n'a reçu aucune réponse récemment. N'hésitez pas à le rouvrir si nécessaire!

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

torch2424 picture torch2424  ·  3Commentaires

blooddy picture blooddy  ·  3Commentaires

evgenykuzyakov picture evgenykuzyakov  ·  3Commentaires

DanielMazurkiewicz picture DanielMazurkiewicz  ·  4Commentaires

vladimir-tikhonov picture vladimir-tikhonov  ·  4Commentaires