wasmer-c-api 7.2.0-alpha.2

Wasmer C API library
Documentation
#include <stdio.h>

#include "wasmer.h"

int main(int argc, const char* argv[]) {
  const char* wat_string =
      "(module\n"
      "   (type $mem_size_t (func (result i32)))\n"
      "   (type $get_at_t (func (param i32) (result i32)))\n"
      "   (type $set_at_t (func (param i32) (param i32)))\n"
      "   (memory $mem 1)\n"
      "   (func $get_at (type $get_at_t) (param $idx i32) (result i32)\n"
      "     (i32.load (local.get $idx)))\n"
      "   (func $set_at (type $set_at_t) (param $idx i32) (param $val i32)\n"
      "     (i32.store (local.get $idx) (local.get $val)))\n"
      "   (func $mem_size (type $mem_size_t) (result i32)\n"
      "     (memory.size))\n"
      "   (export \"get_at\" (func $get_at))\n"
      "   (export \"set_at\" (func $set_at))\n"
      "   (export \"mem_size\" (func $mem_size))\n"
      "   (export \"memory\" (memory $mem)))";

  wasm_byte_vec_t wat;
  wasm_byte_vec_new(&wat, strlen(wat_string), wat_string);
  wasm_byte_vec_t wasm_bytes;
  wat2wasm(&wat, &wasm_bytes);
  wasm_byte_vec_delete(&wat);

  printf("Creating the store...\n");
  wasm_engine_t* engine = wasm_engine_new();
  wasm_store_t* store = wasm_store_new(engine);

  printf("Compiling module...\n");
  wasm_module_t* module = wasm_module_new(store, &wasm_bytes);

  if (!module) {
    printf("> Error compiling module!\n");

    return 1;
  }

  wasm_byte_vec_delete(&wasm_bytes);

  printf("Creating imports...\n");
  wasm_extern_vec_t import_object = WASM_EMPTY_VEC;

  printf("Instantiating module...\n");
  wasm_instance_t* instance =
      wasm_instance_new(store, module, &import_object, NULL);

  if (!instance) {
    printf("> Error instantiating module!\n");

    return 1;
  }

  printf("Retrieving exports...\n");
  wasm_extern_vec_t exports;
  wasm_instance_exports(instance, &exports);

  if (exports.size == 0) {
    printf("> Error accessing exports!\n");

    return 1;
  }

  wasm_func_t* get_at = wasm_extern_as_func(exports.data[0]);
  wasm_func_t* set_at = wasm_extern_as_func(exports.data[1]);
  wasm_func_t* mem_size = wasm_extern_as_func(exports.data[2]);
  wasm_memory_t* memory = wasm_extern_as_memory(exports.data[3]);

  printf("Querying memory size...\n");
  wasm_memory_pages_t pages = wasm_memory_size(memory);
  size_t data_size = wasm_memory_data_size(memory);
  printf("Memory size (pages): %d\n", pages);
  printf("Memory size (bytes): %d\n", (int)data_size);

  printf("Growing memory...\n");
  if (!wasm_memory_grow(memory, 2)) {
    printf("> Error growing memory!\n");

    return 1;
  }

  wasm_memory_pages_t new_pages = wasm_memory_size(memory);
  printf("New memory size (pages): %d\n", new_pages);

  int mem_addr = 0x2220;
  int val = 0xFEFEFFE;

  wasm_val_t set_at_args_val[2] = {WASM_I32_VAL(mem_addr), WASM_I32_VAL(val)};
  wasm_val_vec_t set_at_args = WASM_ARRAY_VEC(set_at_args_val);
  wasm_val_vec_t set_at_results = WASM_EMPTY_VEC;
  wasm_func_call(set_at, &set_at_args, &set_at_results);

  wasm_val_t get_at_args_val[1] = {WASM_I32_VAL(mem_addr)};
  wasm_val_vec_t get_at_args = WASM_ARRAY_VEC(get_at_args_val);
  wasm_val_t get_at_results_val[1] = {WASM_INIT_VAL};
  wasm_val_vec_t get_at_results = WASM_ARRAY_VEC(get_at_results_val);
  wasm_func_call(get_at, &get_at_args, &get_at_results);

  printf("Value at 0x%04x: %d\n", mem_addr, get_at_results_val[0].of.i32);

  wasm_extern_vec_delete(&exports);
  wasm_module_delete(module);
  wasm_instance_delete(instance);
  wasm_store_delete(store);
  wasm_engine_delete(engine);
}