[WASM] Write to WebAssembly Memory from JavaScript

We write a function that converts a string to lowercase in WebAssembly, demonstrating how to set the input string from JavaScript.

WASM Fiddle: https://wasdk.github.io/WasmFiddle/?h1s69

Demo Repo: https://github.com/guybedford/wasm-intro

 

We want to create a funcrtion 'toLowerCase', which enable JS to write in Memory.

To write data into WASM, we need to variables in C code, one is 'inStr' which get original input (for example 'Hello World'), another is 'outStr' which will transform to lower case string (for example: 'hello world').

C code:

void consoleLog (char* offset, int len);

char inStr[20];
char outStr[20];

char* getInStrOffset () {
  return &inStr[0];
}

void toLowerCase() {
  for (int i = 0; i < 20; i++ ) {
    char c = inStr[i];
    if (c > 64 &&  c < 91) {
      c = c + 32;
    }
    outStr[i] = c;
  }
  consoleLog(&outStr[0], 20);
}

 

JS: Some code to get wasm instance.

var wasmModule = new WebAssembly.Module(wasmCode);
var wasmInstance = new WebAssembly.Instance(wasmModule, {
  env: {
    consoleLog (offset, len) {
      const strBuf = new Uint8Array(mem.buffer, offset, len);
      log(new TextDecoder().decode(strBuf));
    }
  }
});
const mem = wasmInstance.exports.memory;

 

Now we need to write data from JS to WASM memory, the way to do it is just to put data into 'inStr':

const mem = wasmInstance.exports.memory;

function writeString (str, offset) {
  const strBuf = new TextEncoder().encode(str);
  const outBuf = new Uint8Array(mem.buffer, offset, strBuf.length);
  



      for (let i = 0; i < strBuf.length; i++) {
        outBuf[i] = strBuf[i];
      }
  }
}

writeString('Hello Web Assembly', wasmInstance.exports.getInStrOffset());

Because what 'wasmInstance.exports.getInStrOffset()' return us is the first char address of 'inStr', then we use for loop to write data into 'inStr'.

After writting the data, then we can call 'toLowerCase' to see the result:

var wasmModule = new WebAssembly.Module(wasmCode);
var wasmInstance = new WebAssembly.Instance(wasmModule, {
  env: {
    consoleLog (offset, len) {
      const strBuf = new Uint8Array(mem.buffer, offset, len);
      log(new TextDecoder().decode(strBuf));
    }
  }
});
const mem = wasmInstance.exports.memory;

function writeString (str, offset) {
  const strBuf = new TextEncoder().encode(str);
  const outBuf = new Uint8Array(mem.buffer, offset, strBuf.length);
  



      for (let i = 0; i < strBuf.length; i++) {
        outBuf[i] = strBuf[i];
      }
  }
}

writeString('Hello Web Assembly', wasmInstance.exports.getInStrOffset());
wasmInstance.exports.toLowerCase();

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值