Wasmer logo

Build Status License Join the Wasmer Community Number of downloads from crates.io Read our API documentation

Wasmer Runtime C API

Wasmer is a standalone JIT WebAssembly runtime, aiming to be fully compatible with Emscripten, Rust and Go. Learn more.

This crate exposes a C and a C++ API for the Wasmer runtime.

Usage

The C and C++ header files can be found in the source tree of this crate, respectively wasmer.h and wasmer.hh. They are automatically generated, and always up-to-date in this repository.

Here is a simple example to use the C API:

```c

include

include "../wasmer.h"

include

include

int main() { // Read the Wasm file bytes. FILE *file = fopen("sum.wasm", "r"); fseek(file, 0, SEEKEND); long len = ftell(file); uint8t *bytes = malloc(len); fseek(file, 0, SEEK_SET); fread(bytes, 1, len, file); fclose(file);

// Prepare the imports.
wasmer_import_t imports[] = {};

// Instantiate!
wasmer_instance_t *instance = NULL;
wasmer_result_t instantiation_result = wasmer_instantiate(&instance, bytes, len, imports, 0);

assert(instantiation_result == WASMER_OK);

// Let's call a function.
// Start by preparing the arguments.

// Value of argument #1 is `7i32`.
wasmer_value_t argument_one;
argument_one.tag = WASM_I32;
argument_one.value.I32 = 7;

// Value of argument #2 is `8i32`.
wasmer_value_t argument_two;
argument_two.tag = WASM_I32;
argument_two.value.I32 = 8;

// Prepare the arguments.
wasmer_value_t arguments[] = {argument_one, argument_two};

// Prepare the return value.
wasmer_value_t result_one;
wasmer_value_t results[] = {result_one};

// Call the `sum` function with the prepared arguments and the return value.
wasmer_result_t call_result = wasmer_instance_call(instance, "sum", arguments, 2, results, 1);

// Let's display the result.
printf("Call result:  %d\n", call_result);
printf("Result: %d\n", results[0].value.I32);

// `sum(7, 8) == 15`.
assert(results[0].value.I32 == 15);
assert(call_result == WASMER_OK);

wasmer_instance_destroy(instance);

return 0;

} ```

Testing

The tests can be run via cargo test, such as:

sh $ cargo test -- --nocapture

To run tests manually, enter the lib/runtime-c-api/tests directory and run the following commands:

sh $ cmake . $ make $ make test

License

Wasmer is primarily distributed under the terms of the MIT license (LICENSE).