mirror of
https://github.com/fluencelabs/wasmer
synced 2025-06-19 20:01:20 +00:00
runtime-c-api:
* import.rs - adding `import_object_t` and `wasmer_import_object_destroy` * instance.rs - adding `wasmer_module_import_instantiate`
This commit is contained in:
@ -13,6 +13,7 @@ use std::{ffi::c_void, ptr, slice, sync::Arc};
|
|||||||
use wasmer_runtime::Module;
|
use wasmer_runtime::Module;
|
||||||
use wasmer_runtime_core::{
|
use wasmer_runtime_core::{
|
||||||
export::{Context, Export, FuncPointer},
|
export::{Context, Export, FuncPointer},
|
||||||
|
import::ImportObject,
|
||||||
module::ImportName,
|
module::ImportName,
|
||||||
types::{FuncSig, Type},
|
types::{FuncSig, Type},
|
||||||
};
|
};
|
||||||
@ -25,6 +26,9 @@ pub struct wasmer_import_t {
|
|||||||
pub value: wasmer_import_export_value,
|
pub value: wasmer_import_export_value,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[repr(C)]
|
||||||
|
pub struct wasmer_import_object_t;
|
||||||
|
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub struct wasmer_import_func_t;
|
pub struct wasmer_import_func_t;
|
||||||
@ -352,6 +356,14 @@ pub extern "C" fn wasmer_import_func_destroy(func: *mut wasmer_import_func_t) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Frees memory of the given ImportObject
|
||||||
|
#[no_mangle]
|
||||||
|
pub extern "C" fn wasmer_import_object_destroy(import_object: *mut wasmer_import_object_t) {
|
||||||
|
if !import_object.is_null() {
|
||||||
|
unsafe { Box::from_raw(import_object as *mut ImportObject) };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
struct NamedImportDescriptor {
|
struct NamedImportDescriptor {
|
||||||
module: String,
|
module: String,
|
||||||
name: String,
|
name: String,
|
||||||
|
@ -3,15 +3,19 @@
|
|||||||
use crate::{
|
use crate::{
|
||||||
error::{update_last_error, CApiError},
|
error::{update_last_error, CApiError},
|
||||||
export::{wasmer_exports_t, wasmer_import_export_kind, NamedExport, NamedExports},
|
export::{wasmer_exports_t, wasmer_import_export_kind, NamedExport, NamedExports},
|
||||||
import::wasmer_import_t,
|
import::{wasmer_import_object_t, wasmer_import_t},
|
||||||
memory::wasmer_memory_t,
|
memory::wasmer_memory_t,
|
||||||
|
module::wasmer_module_t,
|
||||||
value::{wasmer_value, wasmer_value_t, wasmer_value_tag},
|
value::{wasmer_value, wasmer_value_t, wasmer_value_tag},
|
||||||
wasmer_result_t,
|
wasmer_result_t,
|
||||||
};
|
};
|
||||||
use libc::{c_char, c_int, c_void};
|
use libc::{c_char, c_int, c_void};
|
||||||
use std::{collections::HashMap, ffi::CStr, slice};
|
use std::{collections::HashMap, ffi::CStr, slice};
|
||||||
use wasmer_runtime::{Ctx, Global, ImportObject, Instance, Memory, Table, Value};
|
use wasmer_runtime::{Ctx, Global, Instance, Memory, Module, Table, Value};
|
||||||
use wasmer_runtime_core::{export::Export, import::Namespace};
|
use wasmer_runtime_core::{
|
||||||
|
export::Export,
|
||||||
|
import::{ImportObject, Namespace},
|
||||||
|
};
|
||||||
|
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
pub struct wasmer_instance_t;
|
pub struct wasmer_instance_t;
|
||||||
@ -108,6 +112,32 @@ pub unsafe extern "C" fn wasmer_instantiate(
|
|||||||
wasmer_result_t::WASMER_OK
|
wasmer_result_t::WASMER_OK
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Given:
|
||||||
|
/// * A prepared `wasmer svm` import-object
|
||||||
|
/// * A compiled wasmer module
|
||||||
|
///
|
||||||
|
/// Instantiates a wasmer instance
|
||||||
|
#[no_mangle]
|
||||||
|
pub unsafe extern "C" fn wasmer_module_import_instantiate(
|
||||||
|
instance: *mut *mut wasmer_instance_t,
|
||||||
|
module: *const wasmer_module_t,
|
||||||
|
import_object: *const wasmer_import_object_t,
|
||||||
|
) -> wasmer_result_t {
|
||||||
|
let import_object: &ImportObject = &*(import_object as *const ImportObject);
|
||||||
|
let module: &Module = &*(module as *const Module);
|
||||||
|
|
||||||
|
let new_instance: Instance = match module.instantiate(import_object) {
|
||||||
|
Ok(instance) => instance,
|
||||||
|
Err(error) => {
|
||||||
|
update_last_error(error);
|
||||||
|
return wasmer_result_t::WASMER_ERROR;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
*instance = Box::into_raw(Box::new(new_instance)) as *mut wasmer_instance_t;
|
||||||
|
|
||||||
|
return wasmer_result_t::WASMER_OK;
|
||||||
|
}
|
||||||
|
|
||||||
/// Calls an instances exported function by `name` with the provided parameters.
|
/// Calls an instances exported function by `name` with the provided parameters.
|
||||||
/// Results are set using the provided `results` pointer.
|
/// Results are set using the provided `results` pointer.
|
||||||
///
|
///
|
||||||
|
@ -95,6 +95,10 @@ typedef struct {
|
|||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|
||||||
|
} wasmer_import_object_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
|
||||||
} wasmer_instance_t;
|
} wasmer_instance_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@ -392,6 +396,11 @@ wasmer_result_t wasmer_import_func_returns(const wasmer_import_func_t *func,
|
|||||||
wasmer_result_t wasmer_import_func_returns_arity(const wasmer_import_func_t *func,
|
wasmer_result_t wasmer_import_func_returns_arity(const wasmer_import_func_t *func,
|
||||||
uint32_t *result);
|
uint32_t *result);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Frees memory of the given ImportObject
|
||||||
|
*/
|
||||||
|
void wasmer_import_object_destroy(wasmer_import_object_t *import_object);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Calls an instances exported function by `name` with the provided parameters.
|
* Calls an instances exported function by `name` with the provided parameters.
|
||||||
* Results are set using the provided `results` pointer.
|
* Results are set using the provided `results` pointer.
|
||||||
@ -526,6 +535,16 @@ wasmer_result_t wasmer_module_deserialize(wasmer_module_t **module,
|
|||||||
*/
|
*/
|
||||||
void wasmer_module_destroy(wasmer_module_t *module);
|
void wasmer_module_destroy(wasmer_module_t *module);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Given:
|
||||||
|
* A prepared `wasmer svm` import-object
|
||||||
|
* A compiled wasmer module
|
||||||
|
* Instantiates a wasmer instance
|
||||||
|
*/
|
||||||
|
wasmer_result_t wasmer_module_import_instantiate(wasmer_instance_t **instance,
|
||||||
|
const wasmer_module_t *module,
|
||||||
|
const wasmer_import_object_t *import_object);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new Instance from the given module and imports.
|
* Creates a new Instance from the given module and imports.
|
||||||
* Returns `wasmer_result_t::WASMER_OK` upon success.
|
* Returns `wasmer_result_t::WASMER_OK` upon success.
|
||||||
|
@ -91,6 +91,10 @@ struct wasmer_import_func_t {
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct wasmer_import_object_t {
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
struct wasmer_instance_t {
|
struct wasmer_instance_t {
|
||||||
|
|
||||||
};
|
};
|
||||||
@ -318,6 +322,9 @@ wasmer_result_t wasmer_import_func_returns(const wasmer_import_func_t *func,
|
|||||||
wasmer_result_t wasmer_import_func_returns_arity(const wasmer_import_func_t *func,
|
wasmer_result_t wasmer_import_func_returns_arity(const wasmer_import_func_t *func,
|
||||||
uint32_t *result);
|
uint32_t *result);
|
||||||
|
|
||||||
|
/// Frees memory of the given ImportObject
|
||||||
|
void wasmer_import_object_destroy(wasmer_import_object_t *import_object);
|
||||||
|
|
||||||
/// Calls an instances exported function by `name` with the provided parameters.
|
/// Calls an instances exported function by `name` with the provided parameters.
|
||||||
/// Results are set using the provided `results` pointer.
|
/// Results are set using the provided `results` pointer.
|
||||||
/// Returns `wasmer_result_t::WASMER_OK` upon success.
|
/// Returns `wasmer_result_t::WASMER_OK` upon success.
|
||||||
@ -418,6 +425,14 @@ wasmer_result_t wasmer_module_deserialize(wasmer_module_t **module,
|
|||||||
/// Frees memory for the given Module
|
/// Frees memory for the given Module
|
||||||
void wasmer_module_destroy(wasmer_module_t *module);
|
void wasmer_module_destroy(wasmer_module_t *module);
|
||||||
|
|
||||||
|
/// Given:
|
||||||
|
/// A prepared `wasmer svm` import-object
|
||||||
|
/// A compiled wasmer module
|
||||||
|
/// Instantiates a wasmer instance
|
||||||
|
wasmer_result_t wasmer_module_import_instantiate(wasmer_instance_t **instance,
|
||||||
|
const wasmer_module_t *module,
|
||||||
|
const wasmer_import_object_t *import_object);
|
||||||
|
|
||||||
/// Creates a new Instance from the given module and imports.
|
/// Creates a new Instance from the given module and imports.
|
||||||
/// Returns `wasmer_result_t::WASMER_OK` upon success.
|
/// Returns `wasmer_result_t::WASMER_OK` upon success.
|
||||||
/// Returns `wasmer_result_t::WASMER_ERROR` upon failure. Use `wasmer_last_error_length`
|
/// Returns `wasmer_result_t::WASMER_ERROR` upon failure. Use `wasmer_last_error_length`
|
||||||
|
Reference in New Issue
Block a user