Update c-api examples to Context API

This commit is contained in:
Manos Pitsidianakis
2022-07-02 01:48:51 +03:00
parent 62f07efb08
commit eed0327101
27 changed files with 132 additions and 56 deletions

View File

@@ -21,6 +21,8 @@ int main(int argc, const char *argv[]) {
printf("Initializing...\n");
own wasm_engine_t* engine = wasm_engine_new();
own wasm_store_t* store = wasm_store_new(engine);
wasm_context_t* ctx = wasm_context_new(store, 0);
wasm_store_context_set(store, ctx);
// =====================
wasm_limits_t limits1 = {

View File

@@ -29,7 +29,7 @@ void print_frame(wasm_frame_t* frame) {
wasm_store_t *store = NULL;
own wasm_trap_t* early_exit(const wasm_val_vec_t* args, wasm_val_vec_t* results) {
own wasm_trap_t* early_exit(wasm_context_ref_mut_t* ctx_mut, const wasm_val_vec_t* args, wasm_val_vec_t* results) {
own wasm_message_t trap_message;
wasm_name_new_from_string_nt(&trap_message, "trapping from a host import");
own wasm_trap_t *trap = wasm_trap_new(store, &trap_message);
@@ -42,6 +42,8 @@ int main(int argc, const char *argv[]) {
printf("Initializing...\n");
wasm_engine_t *engine = wasm_engine_new();
store = wasm_store_new(engine);
wasm_context_t* ctx = wasm_context_new(store, 0);
wasm_store_context_set(store, ctx);
// Load binary.
printf("Loading binary...\n");

View File

@@ -20,6 +20,8 @@ int main(int argc, const char* argv[]) {
printf("Creating the store...\n");
wasm_engine_t* engine = wasm_engine_new();
wasm_store_t* store = wasm_store_new(engine);
wasm_context_t* ctx = wasm_context_new(store, 0);
wasm_store_context_set(store, ctx);
printf("Compiling module...\n");
wasm_module_t* module = wasm_module_new(store, &wasm_bytes);

View File

@@ -19,6 +19,8 @@ int main(int argc, const char* argv[]) {
printf("Creating the store...\n");
wasm_engine_t* engine = wasm_engine_new();
wasm_store_t* store = wasm_store_new(engine);
wasm_context_t* ctx = wasm_context_new(store, 0);
wasm_store_context_set(store, ctx);
printf("Compiling module...\n");
wasm_module_t* module = wasm_module_new(store, &wasm_bytes);

View File

@@ -26,6 +26,8 @@ int main(int argc, const char* argv[]) {
printf("Creating the store...\n");
wasm_engine_t* engine = wasm_engine_new_with_config(config);
wasm_store_t* store = wasm_store_new(engine);
wasm_context_t* ctx = wasm_context_new(store, 0);
wasm_store_context_set(store, ctx);
printf("Compiling module...\n");
wasm_module_t* module = wasm_module_new(store, &wasm_bytes);

View File

@@ -1,7 +1,7 @@
#include <stdio.h>
#include "wasmer.h"
wasm_trap_t* host_func_callback(const wasm_val_vec_t* args, wasm_val_vec_t* results) {
wasm_trap_t* host_func_callback(wasm_context_ref_mut_t* ctx_mut, const wasm_val_vec_t* args, wasm_val_vec_t* results) {
printf("Calling back...\n> ");
wasm_val_t val = WASM_I32_VAL(42);
@@ -31,6 +31,8 @@ int main(int argc, const char* argv[]) {
printf("Creating the store...\n");
wasm_engine_t* engine = wasm_engine_new();
wasm_store_t* store = wasm_store_new(engine);
wasm_context_t* ctx = wasm_context_new(store, 0);
wasm_store_context_set(store, ctx);
printf("Compiling module...\n");
wasm_module_t* module = wasm_module_new(store, &wasm_bytes);

View File

@@ -20,6 +20,8 @@ int main(int argc, const char* argv[]) {
printf("Creating the store...\n");
wasm_engine_t* engine = wasm_engine_new();
wasm_store_t* store = wasm_store_new(engine);
wasm_context_t* ctx = wasm_context_new(store, 0);
wasm_store_context_set(store, ctx);
printf("Compiling module...\n");
wasm_module_t* module = wasm_module_new(store, &wasm_bytes);

View File

@@ -28,6 +28,8 @@ int main(int argc, const char* argv[]) {
printf("Creating the store...\n");
wasm_engine_t* engine = wasm_engine_new();
wasm_store_t* store = wasm_store_new(engine);
wasm_context_t* ctx = wasm_context_new(store, 0);
wasm_store_context_set(store, ctx);
printf("Compiling module...\n");
wasm_module_t* module = wasm_module_new(store, &wasm_bytes);

View File

@@ -20,6 +20,8 @@ int main(int argc, const char *argv[]) {
printf("Initializing...\n");
own wasm_engine_t* engine = wasm_engine_new();
own wasm_store_t* store = wasm_store_new(engine);
wasm_context_t* ctx = wasm_context_new(store, 0);
wasm_store_context_set(store, ctx);
// =====================
wasm_limits_t limits1 = {

View File

@@ -28,6 +28,24 @@ int main(int argc, const char* argv[]) {
wasm_engine_t* engine = wasm_engine_new();
wasm_store_t* store = wasm_store_new(engine);
printf("Setting up WASI...\n");
wasi_config_t* config = wasi_config_new("example_program");
// TODO: error checking
const char* js_string = "function greet(name) { return JSON.stringify('Hello, ' + name); }; print(greet('World'));";
wasi_config_arg(config, "--eval");
wasi_config_arg(config, js_string);
wasi_config_capture_stdout(config);
wasi_env_t* wasi_env = wasi_env_new(config);
if (!wasi_env) {
printf("> Error building WASI env!\n");
print_wasmer_error();
return 1;
}
wasm_context_t* ctx = wasm_context_new(store, wasi_env);
wasm_store_context_set(store, ctx);
// Load binary.
printf("Loading binary...\n");
FILE* file = fopen("assets/qjs.wasm", "r");
@@ -55,26 +73,10 @@ int main(int argc, const char* argv[]) {
}
wasm_byte_vec_delete(&binary);
printf("Setting up WASI...\n");
wasi_config_t* config = wasi_config_new("example_program");
// TODO: error checking
const char* js_string = "function greet(name) { return JSON.stringify('Hello, ' + name); }; print(greet('World'));";
wasi_config_arg(config, "--eval");
wasi_config_arg(config, js_string);
wasi_config_capture_stdout(config);
wasi_env_t* wasi_env = wasi_env_new(config);
if (!wasi_env) {
printf("> Error building WASI env!\n");
print_wasmer_error();
return 1;
}
// Instantiate.
printf("Instantiating module...\n");
wasm_extern_vec_t imports;
bool get_imports_result = wasi_get_imports(store, module, wasi_env, &imports);
bool get_imports_result = wasi_get_imports(store, module, &imports);
if (!get_imports_result) {
printf("> Error getting WASI imports!\n");

View File

@@ -1,6 +1,6 @@
use crate::wasm_c_api::store::wasm_store_t;
use libc::c_void;
use wasmer_api::Context;
use wasmer_api::{Context, ContextMut};
/// Opaque type representing a WebAssembly context.
#[allow(non_camel_case_types)]
@@ -38,3 +38,36 @@ pub unsafe extern "C" fn wasm_context_new(
/// See the module's documentation.
#[no_mangle]
pub unsafe extern "C" fn wasm_context_delete(_context: Option<Box<wasm_context_t>>) {}
/// Opaque type representing a mut ref of a WebAssembly context.
#[allow(non_camel_case_types)]
pub struct wasm_context_ref_mut_t<'a> {
pub(crate) inner: ContextMut<'a, *mut c_void>,
}
/// Get the value of `wasm_context_ref_mut_t` data.
#[no_mangle]
pub unsafe extern "C" fn wasm_context_ref_mut_get(ctx: &wasm_context_ref_mut_t) -> *mut c_void {
*ctx.inner.data()
}
/// Set the value of [`ContextMut`] data.
///
#[no_mangle]
pub unsafe extern "C" fn wasm_context_ref_mut_set(
ctx: &mut wasm_context_ref_mut_t,
new_val: *mut c_void,
) {
*ctx.inner.data_mut() = new_val;
}
/// Deletes a WebAssembly context.
///
/// # Example
///
/// See the module's documentation.
#[no_mangle]
pub unsafe extern "C" fn wasm_context_ref_mut_delete(
_context: Option<&mut wasm_context_ref_mut_t>,
) {
}

View File

@@ -1,4 +1,4 @@
use super::super::context::wasm_context_t;
use super::super::context::{wasm_context_ref_mut_t, wasm_context_t};
use super::super::store::wasm_store_t;
use super::super::trap::wasm_trap_t;
use super::super::types::{wasm_functype_t, wasm_valkind_enum};
@@ -32,20 +32,11 @@ impl wasm_func_t {
#[allow(non_camel_case_types)]
pub type wasm_func_callback_t = unsafe extern "C" fn(
context: &mut wasm_context_ref_mut_t,
args: &wasm_val_vec_t,
results: &mut wasm_val_vec_t,
) -> Option<Box<wasm_trap_t>>;
#[allow(non_camel_case_types)]
pub type wasm_func_callback_with_env_t = unsafe extern "C" fn(
env: *mut c_void,
args: &wasm_val_vec_t,
results: &mut wasm_val_vec_t,
) -> Option<Box<wasm_trap_t>>;
#[allow(non_camel_case_types)]
pub type wasm_env_finalizer_t = unsafe extern "C" fn(*mut c_void);
#[no_mangle]
pub unsafe extern "C" fn wasm_func_new(
store: Option<&wasm_store_t>,
@@ -62,7 +53,7 @@ pub unsafe extern "C" fn wasm_func_new(
let func_sig = &function_type.inner().function_type;
let num_rets = func_sig.results().len();
let inner_callback = move |_ctx: wasmer_api::ContextMut<'_, *mut c_void>,
let inner_callback = move |ctx: wasmer_api::ContextMut<'_, *mut c_void>,
args: &[Value]|
-> Result<Vec<Value>, RuntimeError> {
let processed_args: wasm_val_vec_t = args
@@ -81,7 +72,11 @@ pub unsafe extern "C" fn wasm_func_new(
]
.into();
let trap = callback(&processed_args, &mut results);
let trap = callback(
&mut wasm_context_ref_mut_t { inner: ctx },
&processed_args,
&mut results,
);
if let Some(trap) = trap {
return Err(trap.inner);

View File

@@ -224,9 +224,11 @@ mod tests {
// The `sum` host function implementation.
wasm_trap_t* sum_callback(
wasm_context_ref_mut_t* ctx_mut,
const wasm_val_vec_t* arguments,
wasm_val_vec_t* results
) {
(void) ctx_mut;
wasm_val_t sum = {
.kind = WASM_I32,
.of = { arguments->data[0].of.i32 + arguments->data[1].of.i32 },

View File

@@ -7,8 +7,6 @@
#define own
wasm_store_t* global_store = NULL;
// Print a Wasm value
void wasm_val_print(wasm_val_t val) {
switch (val.kind) {
@@ -37,7 +35,7 @@ void wasm_val_print(wasm_val_t val) {
// A function to be called from Wasm code.
own wasm_trap_t* print_callback(
const wasm_val_vec_t* args, wasm_val_vec_t* results
wasm_context_ref_mut_t* ctx_mut, const wasm_val_vec_t* args, wasm_val_vec_t* results
) {
printf("Calling back...\n> ");
wasm_val_print(args->data[0]);
@@ -50,9 +48,9 @@ own wasm_trap_t* print_callback(
// A function closure.
own wasm_trap_t* closure_callback(
const wasm_val_vec_t* args, wasm_val_vec_t* results
wasm_context_ref_mut_t* ctx_mut, const wasm_val_vec_t* args, wasm_val_vec_t* results
) {
int i = *(int*) wasm_store_data_get(global_store);
int i = *(int*) wasm_context_ref_mut_get(ctx_mut);
printf("Calling back closure...\n");
printf("> %d\n", i);
@@ -66,10 +64,10 @@ int main(int argc, const char* argv[]) {
// Initialize.
printf("Initializing...\n");
wasm_engine_t* engine = wasm_engine_new();
global_store = wasm_store_new(engine);
wasm_store_t* store = wasm_store_new(engine);
int i = 42;
wasm_context_t* ctx = wasm_context_new(global_store, &i);
wasm_store_context_set(global_store, ctx);
wasm_context_t* ctx = wasm_context_new(store, &i);
wasm_store_context_set(store, ctx);
// Load binary.
printf("Loading binary...\n");
@@ -91,7 +89,7 @@ int main(int argc, const char* argv[]) {
// Compile.
printf("Compiling module...\n");
own wasm_module_t* module = wasm_module_new(global_store, &binary);
own wasm_module_t* module = wasm_module_new(store, &binary);
if (!module) {
printf("> Error compiling module!\n");
return 1;
@@ -102,10 +100,10 @@ int main(int argc, const char* argv[]) {
// Create external print functions.
printf("Creating callback...\n");
own wasm_functype_t* print_type = wasm_functype_new_1_1(wasm_valtype_new_i32(), wasm_valtype_new_i32());
own wasm_func_t* print_func = wasm_func_new(global_store, print_type, print_callback);
own wasm_func_t* print_func = wasm_func_new(store, print_type, print_callback);
own wasm_functype_t* closure_type = wasm_functype_new_0_1(wasm_valtype_new_i32());
own wasm_func_t* closure_func = wasm_func_new(global_store, closure_type, closure_callback);
own wasm_func_t* closure_func = wasm_func_new(store, closure_type, closure_callback);
wasm_functype_delete(print_type);
wasm_functype_delete(closure_type);
@@ -117,7 +115,7 @@ int main(int argc, const char* argv[]) {
};
wasm_extern_vec_t imports = WASM_ARRAY_VEC(externs);
own wasm_instance_t* instance =
wasm_instance_new(global_store, module, &imports, NULL);
wasm_instance_new(store, module, &imports, NULL);
if (!instance) {
printf("> Error instantiating module!\n");
return 1;
@@ -162,7 +160,7 @@ int main(int argc, const char* argv[]) {
// Shut down.
printf("Shutting down...\n");
wasm_store_delete(global_store);
wasm_store_delete(store);
wasm_engine_delete(engine);
// All done.

View File

@@ -74,6 +74,8 @@ int main(int argc, const char* argv[]) {
printf("Live count %d\n", live_count);
printf("Creating store 1...\n");
wasm_store_t* store1 = wasm_store_new(engine);
wasm_context_t* ctx1 = wasm_context_new(store1, 0);
wasm_store_context_set(store1, ctx1);
printf("Running in store 1...\n");
run_in_store(store1);
@@ -81,6 +83,8 @@ int main(int argc, const char* argv[]) {
printf("Creating store 2...\n");
wasm_store_t* store2 = wasm_store_new(engine);
wasm_context_t* ctx2 = wasm_context_new(store2, 0);
wasm_store_context_set(store2, ctx2);
printf("Running in store 2...\n");
run_in_store(store2);

View File

@@ -52,6 +52,8 @@ int main(int argc, const char* argv[]) {
printf("Initializing...\n");
wasm_engine_t* engine = wasm_engine_new();
wasm_store_t* store = wasm_store_new(engine);
wasm_context_t* ctx = wasm_context_new(store, 0);
wasm_store_context_set(store, ctx);
// Load binary.
printf("Loading binary...\n");

View File

@@ -9,7 +9,7 @@
// A function to be called from Wasm code.
own wasm_trap_t* hello_callback(
const wasm_val_vec_t* args, wasm_val_vec_t* results
wasm_context_ref_mut_t* ctx_mut, const wasm_val_vec_t* args, wasm_val_vec_t* results
) {
printf("Calling back...\n");
printf("> Hello World!\n");
@@ -22,6 +22,8 @@ int main(int argc, const char* argv[]) {
printf("Initializing...\n");
wasm_engine_t* engine = wasm_engine_new();
wasm_store_t* store = wasm_store_new(engine);
wasm_context_t* ctx = wasm_context_new(store, 0);
wasm_store_context_set(store, ctx);
// Load binary.
printf("Loading binary...\n");

View File

@@ -10,7 +10,7 @@
// A function to be called from Wasm code.
own wasm_trap_t* callback(
const wasm_val_vec_t* args, wasm_val_vec_t* results
wasm_context_ref_mut_t* ctx_mut, const wasm_val_vec_t* args, wasm_val_vec_t* results
) {
printf("Calling back...\n> ");
printf("> %p\n",
@@ -127,6 +127,8 @@ int main(int argc, const char* argv[]) {
printf("Initializing...\n");
wasm_engine_t* engine = wasm_engine_new();
wasm_store_t* store = wasm_store_new(engine);
wasm_context_t* ctx = wasm_context_new(store, 0);
wasm_store_context_set(store, ctx);
// Load binary.
printf("Loading binary...\n");

View File

@@ -98,6 +98,8 @@ int main(int argc, const char* argv[]) {
printf("Initializing...\n");
wasm_engine_t* engine = wasm_engine_new();
wasm_store_t* store = wasm_store_new(engine);
wasm_context_t* ctx = wasm_context_new(store, 0);
wasm_store_context_set(store, ctx);
// Load binary.
printf("Loading binary...\n");

View File

@@ -9,7 +9,7 @@
// A function to be called from Wasm code.
own wasm_trap_t* callback(
const wasm_val_vec_t* args, wasm_val_vec_t* results
wasm_context_ref_mut_t* ctx_mut, const wasm_val_vec_t* args, wasm_val_vec_t* results
) {
printf("Calling back...\n> ");
printf("> %"PRIu32" %"PRIu64" %"PRIu64" %"PRIu32"\n",
@@ -44,6 +44,8 @@ int main(int argc, const char* argv[]) {
printf("Initializing...\n");
wasm_engine_t* engine = wasm_engine_new();
wasm_store_t* store = wasm_store_new(engine);
wasm_context_t* ctx = wasm_context_new(store, 0);
wasm_store_context_set(store, ctx);
// Load binary.
printf("Loading binary...\n");

View File

@@ -87,6 +87,8 @@ int main(int argc, const char* argv[]) {
printf("Initializing...\n");
wasm_engine_t* engine = wasm_engine_new();
wasm_store_t* store = wasm_store_new(engine);
wasm_context_t* ctx = wasm_context_new(store, 0);
wasm_store_context_set(store, ctx);
// Load binary.
printf("Loading binary...\n");

View File

@@ -9,7 +9,7 @@
// A function to be called from Wasm code.
own wasm_trap_t* hello_callback(
const wasm_val_vec_t* args, wasm_val_vec_t* results
wasm_context_ref_mut_t* ctx_mut, const wasm_val_vec_t* args, wasm_val_vec_t* results
) {
printf("Calling back...\n");
printf("> Hello World!\n");
@@ -22,6 +22,8 @@ int main(int argc, const char* argv[]) {
printf("Initializing...\n");
wasm_engine_t* engine = wasm_engine_new();
wasm_store_t* store = wasm_store_new(engine);
wasm_context_t* ctx = wasm_context_new(store, 0);
wasm_store_context_set(store, ctx);
// Load binary.
printf("Loading binary...\n");

View File

@@ -23,6 +23,8 @@ int main(int argc, const char* argv[]) {
printf("Initializing...\n");
wasm_engine_t* engine = wasm_engine_new();
wasm_store_t* store = wasm_store_new(engine);
wasm_context_t* ctx = wasm_context_new(store, 0);
wasm_store_context_set(store, ctx);
// Load binary.
printf("Loading binary...\n");

View File

@@ -9,7 +9,7 @@
// A function to be called from Wasm code.
own wasm_trap_t* neg_callback(
const wasm_val_vec_t* args, wasm_val_vec_t* results
wasm_context_ref_mut_t* ctx_mut, const wasm_val_vec_t* args, wasm_val_vec_t* results
) {
printf("Calling back...\n");
results->data[0].kind = WASM_I32;
@@ -78,6 +78,8 @@ int main(int argc, const char* argv[]) {
printf("Initializing...\n");
wasm_engine_t* engine = wasm_engine_new();
wasm_store_t* store = wasm_store_new(engine);
wasm_context_t* ctx = wasm_context_new(store, 0);
wasm_store_context_set(store, ctx);
// Load binary.
printf("Loading binary...\n");

View File

@@ -13,7 +13,7 @@ const int N_THREADS = 10;
const int N_REPS = 3;
// A function to be called from Wasm code.
own wasm_trap_t* callback(const wasm_val_vec_t* args, wasm_val_vec_t* results) {
own wasm_trap_t* callback(wasm_context_ref_mut_t* ctx, const wasm_val_vec_t* args, wasm_val_vec_t* results) {
assert(args->data[0].kind == WASM_I32);
printf("> Thread %d running\n", args->data[0].of.i32);
return NULL;
@@ -31,6 +31,8 @@ void* run(void* args_abs) {
// Rereate store and module.
own wasm_store_t* store = wasm_store_new(args->engine);
wasm_context_t* ctx = wasm_context_new(store, 0);
wasm_store_context_set(store, ctx);
own wasm_module_t* module = wasm_module_obtain(store, args->module);
// Run the example N times.
@@ -119,6 +121,9 @@ int main(int argc, const char *argv[]) {
// Compile and share.
own wasm_store_t* store = wasm_store_new(engine);
wasm_context_t* ctx = wasm_context_new(store, 0);
wasm_store_context_set(store, ctx);
own wasm_module_t* module = wasm_module_new(store, &binary);
if (!module) {
printf("> Error compiling module!\n");

View File

@@ -11,7 +11,7 @@ wasm_store_t* store = NULL;
// A function to be called from Wasm code.
own wasm_trap_t* fail_callback(
const wasm_val_vec_t* args, wasm_val_vec_t* results
wasm_context_ref_mut_t* ctx, const wasm_val_vec_t* args, wasm_val_vec_t* results
) {
printf("Calling back...\n");
own wasm_name_t message;
@@ -37,6 +37,8 @@ int main(int argc, const char* argv[]) {
printf("Initializing...\n");
wasm_engine_t* engine = wasm_engine_new();
store = wasm_store_new(engine);
wasm_context_t* ctx = wasm_context_new(store, 0);
wasm_store_context_set(store, ctx);
// Load binary.
printf("Loading binary...\n");

View File

@@ -146,6 +146,7 @@ WASM_API_EXTERN own wasm_store_t* wasm_store_new(wasm_engine_t*);
// Context
WASM_DECLARE_OWN(context)
WASM_DECLARE_OWN(context_ref_mut)
WASM_API_EXTERN own void wasm_store_context_set(own wasm_store_t*, own wasm_context_t*);
WASM_API_EXTERN own void wasm_store_data_set(own wasm_store_t*, own void*);
@@ -421,9 +422,7 @@ WASM_API_EXTERN own wasm_module_t* wasm_module_deserialize(wasm_store_t*, const
WASM_DECLARE_REF(func)
typedef own wasm_trap_t* (*wasm_func_callback_t)(
const wasm_val_vec_t* args, own wasm_val_vec_t* results);
typedef own wasm_trap_t* (*wasm_func_callback_with_env_t)(
void* env, const wasm_val_vec_t* args, wasm_val_vec_t* results);
wasm_context_ref_mut_t*, const wasm_val_vec_t* args, own wasm_val_vec_t* results);
WASM_API_EXTERN own wasm_func_t* wasm_func_new(
wasm_store_t*, const wasm_functype_t*, wasm_func_callback_t);