This commit is contained in:
Ivan Enderlin
2021-03-01 16:41:44 +01:00
parent fd5a9b50d6
commit cbbdfdaefa

View File

@@ -1,5 +1,63 @@
// C API for metering.
//! Unstable non-standard Wasmer-specific API that contains everything
//! to create a the middleware metering API.
//!
//! # Example
//!
//! ```rust
//! # use inline_c::assert_c;
//! # fn main() {
//! # (assert_c! {
//! # #include "tests/wasmer_wasm.h"
//! #
//! int main() {//!//!
//! wasmer_metering_t* metering = wasmer_metering_new(10);
//! wasmer_module_middleware_t* middleware = wasmer_metering_as_middleware(metering);
//!
//! wasm_config_t* config = wasm_config_new();
//! wasm_config_push_middleware(config, middleware);
//!
//! wasm_engine_t* engine = wasm_engin_new_with_config(config);
//!
//! wasm_store_t* store = wasm_store_new(engine);
//!
//! wasm_byte_vec_t wat;
//! wasmer_byte_vec_new_from_string(
//! &wat,
//! "(module\n"
//! " (type $add_t (func (param i32) (result i32)))\n"
//! " (func $add_one_f (type $add_t) (param $value i32) (result i32)\n"
//! " local.get $value\n"
//! " i32.const 1\n"
//! " i32.add)\n"
//! " (export "add_one" (func $add_one_f)))"
//! );
//! wasm_byte_vec_t wasm;
//! wat2wasm(&wat, &wasm);
//!
//! wasm_module_t* module = wasm_module_new(store, &wasm);
//! assert(module);
//!
//! wasm_extern_vec_t imports = WASM_EMPTY_VEC;
//! wasm_trap_t* traps = NULL;
//! wasm_instance_t* instance = wasm_instance_new(store, module, &imports, &traps);
//! assert(instance);
//!
//!
//!
//!
//! wasm_instance_delete(instance);
//! wasm_module_delete(module);
//! wasm_store_delete(store);
//! wasm_engine_delete(engine);
//!
//! return 0;
//! }
//! # })
//! # .success();
//! # }
//! ```
use super::super::super::engine::wasmer_module_middleware_t;
use super::super::super::instance::wasm_instance_t;
use std::sync::Arc;
use wasmer::wasmparser::Operator;
@@ -71,3 +129,14 @@ pub unsafe extern "C" fn wasmer_metering_set_remaining_points(
) {
set_remaining_points(&instance.inner, new_limit);
}
#[no_mangle]
pub unsafe extern "C" fn wasmer_metering_as_middleware(
metering: Option<Box<wasmer_metering_t>>,
) -> Option<Box<wasmer_module_middleware_t>> {
let metering = metering?;
Some(Box::new(wasmer_module_middleware_t {
inner: metering.inner,
}))
}