Skip to content

Commit

Permalink
Merge #2821
Browse files Browse the repository at this point in the history
2821: build(wasmer/cache): opt 'sys' into default feature r=syrusakbary a=kwonoj

<!-- 
Prior to submitting a PR, review the CONTRIBUTING.md document for recommendations on how to test:
https://github.com/wasmerio/wasmer/blob/master/CONTRIBUTING.md#pull-requests

-->

# Description
Context: this is originated from #2817 (comment) , where SWC (https://github.com/swc-project/swc) trying to setup its package dependencies orthogonally requires two distinct features of wasmer (js / sys), encounters feature selection getting merged by cargo. We have workaround it by manual opt in into each features, but the common dependency we have imports wasmer-cache, which ends up to enabling `sys` mandatory. It is also possible to do some workaround by having a feature with make dep as optional, but I feel it'd be better if `cache` allows to opt out from feature.

I am honestly not sure if this is acceptable or recommended approach to resolve issue. Please feel free to close if that's the case. 

# Review

- [ ] Add a short description of the change to the CHANGELOG.md file


Co-authored-by: OJ Kwon <[email protected]>
Co-authored-by: Syrus Akbary <[email protected]>
  • Loading branch information
3 people authored Mar 18, 2022
2 parents 02d27cd + 5de43d5 commit 5b77bc4
Show file tree
Hide file tree
Showing 7 changed files with 73 additions and 2 deletions.
2 changes: 2 additions & 0 deletions lib/api/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -154,5 +154,7 @@ js-default = ["js", "std", "wasm-types-polyfill"]

wasm-types-polyfill = ["js", "wasmparser"]

js-serializable-module = []

[package.metadata.docs.rs]
features = ["compiler", "core", "cranelift", "default-compiler", "default-dylib", "default-engine", "dylib", "engine", "jit", "native", "singlepass", "sys", "sys-default", "universal"]
37 changes: 37 additions & 0 deletions lib/api/src/js/error.rs
Original file line number Diff line number Diff line change
Expand Up @@ -87,3 +87,40 @@ pub enum WasmError {
#[cfg_attr(feature = "std", error("{0}"))]
Generic(String),
}

/// The Serialize error can occur when serializing a
/// compiled Module into a binary.
/// Copied from wasmer_engine::SerializeError
#[derive(Debug)]
#[cfg_attr(feature = "std", derive(Error))]
pub enum SerializeError {
/// An IO error
#[cfg_attr(feature = "std", error(transparent))]
Io(#[from] std::io::Error),
/// A generic serialization error
#[cfg_attr(feature = "std", error("{0}"))]
Generic(String),
}

/// The Deserialize error can occur when loading a
/// compiled Module from a binary.
/// Copied from wasmer_engine::DeSerializeError
#[derive(Error, Debug)]
pub enum DeserializeError {
/// An IO error
#[cfg_attr(feature = "std", error(transparent))]
Io(#[from] std::io::Error),
/// A generic deserialization error
#[cfg_attr(feature = "std", error("{0}"))]
Generic(String),
/// Incompatible serialized binary
#[cfg_attr(feature = "std", error("incompatible binary: {0}"))]
Incompatible(String),
/// The provided binary is corrupted
#[cfg_attr(feature = "std", error("corrupted binary: {0}"))]
CorruptedBinary(String),
/// The binary was valid, but we got an error when
/// trying to allocate the required resources.
#[cfg_attr(feature = "std", error(transparent))]
Compiler(CompileError),
}
1 change: 1 addition & 0 deletions lib/api/src/js/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ pub use wasmer_derive::WasmerEnv;

pub use crate::js::cell::WasmCell;
pub use crate::js::env::{HostEnvInitError, LazyInit, WasmerEnv};
pub use crate::js::error::{DeserializeError, SerializeError};
pub use crate::js::export::Export;
pub use crate::js::exports::{ExportError, Exportable, Exports, ExportsIterator};
pub use crate::js::externals::{
Expand Down
27 changes: 26 additions & 1 deletion lib/api/src/js/module.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@ use crate::js::resolver::Resolver;
use crate::js::store::Store;
use crate::js::types::{ExportType, ImportType};
// use crate::js::InstantiationError;
use crate::js::error::CompileError;
#[cfg(feature = "wat")]
use crate::js::error::WasmError;
use crate::js::error::{CompileError, DeserializeError, SerializeError};
use crate::js::RuntimeError;
use js_sys::{Reflect, Uint8Array, WebAssembly};
use std::fmt;
Expand Down Expand Up @@ -62,6 +62,8 @@ pub struct Module {
name: Option<String>,
// WebAssembly type hints
type_hints: Option<ModuleTypeHints>,
#[cfg(feature = "js-serializable-module")]
raw_bytes: Option<Vec<u8>>,
}

impl Module {
Expand Down Expand Up @@ -194,6 +196,8 @@ impl Module {
module,
type_hints,
name,
#[cfg(feature = "js-serializable-module")]
raw_bytes: Some(binary.to_vec()),
})
}

Expand Down Expand Up @@ -273,6 +277,25 @@ impl Module {
// self.artifact.module_ref().name.as_deref()
}

/// Serializes a module into a binary representation that the `Engine`
/// can later process via [`Module::deserialize`].
///
#[cfg(feature = "js-serializable-module")]
pub fn serialize(&self) -> Result<Vec<u8>, SerializeError> {
self.raw_bytes.clone().ok_or(SerializeError::Generic(
"Not able to serialize module".to_string(),
))
}

/// Deserializes a serialized Module binary into a `Module`.
///
/// This is safe since deserialization under `js` is essentially same as reconstructing `Module`.
/// We maintain the `unsafe` to preserve the same API as Wasmer
#[cfg(feature = "js-serializable-module")]
pub unsafe fn deserialize(store: &Store, bytes: &[u8]) -> Result<Self, DeserializeError> {
Self::new(store, bytes).map_err(|e| DeserializeError::Compiler(e))
}

/// Sets the name of the current module.
/// This is normally useful for stacktraces and debugging.
///
Expand Down Expand Up @@ -512,6 +535,8 @@ impl From<WebAssembly::Module> for Module {
module,
name: None,
type_hints: None,
#[cfg(feature = "js-serializable-module")]
raw_bytes: None,
}
}
}
4 changes: 3 additions & 1 deletion lib/cache/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ readme = "README.md"
edition = "2018"

[dependencies]
wasmer = { path = "../api", version = "=2.2.1", default-features = false, features = ["sys"] }
wasmer = { path = "../api", version = "=2.2.1", default-features = false}
hex = "0.4"
thiserror = "1"
blake3 = "1.0"
Expand All @@ -25,6 +25,8 @@ wasmer-engine-universal = { path = "../engine-universal", version = "=2.2.1" }
wasmer-engine-dylib = { path = "../engine-dylib", version = "=2.2.1" }

[features]
default = ["wasmer/js-serializable-module", "filesystem"]
filesystem = []
blake3-pure = ["blake3/pure"]

[[bench]]
Expand Down
3 changes: 3 additions & 0 deletions lib/cache/src/filesystem.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
#![cfg_attr(not(feature = "filesystem"), allow(unused))]
use crate::cache::Cache;
use crate::hash::Hash;
use std::fs::{create_dir_all, File};
Expand Down Expand Up @@ -35,6 +36,7 @@ pub struct FileSystemCache {
ext: Option<String>,
}

#[cfg(feature = "filesystem")]
impl FileSystemCache {
/// Construct a new `FileSystemCache` around the specified directory.
pub fn new<P: Into<PathBuf>>(path: P) -> io::Result<Self> {
Expand Down Expand Up @@ -84,6 +86,7 @@ impl FileSystemCache {
}
}

#[cfg(feature = "filesystem")]
impl Cache for FileSystemCache {
type DeserializeError = DeserializeError;
type SerializeError = SerializeError;
Expand Down
1 change: 1 addition & 0 deletions lib/cache/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ mod filesystem;
mod hash;

pub use crate::cache::Cache;
#[cfg(feature = "filesystem")]
pub use crate::filesystem::FileSystemCache;
pub use crate::hash::Hash;

Expand Down

0 comments on commit 5b77bc4

Please sign in to comment.