mirror of
https://github.com/fluencelabs/wasmer
synced 2025-04-25 10:22:19 +00:00
Split middleware-common tests into separate subcrate
This commit is contained in:
parent
5205adabf5
commit
91b199fe12
9
Cargo.lock
generated
9
Cargo.lock
generated
@ -1437,6 +1437,7 @@ dependencies = [
|
|||||||
"wasmer-kernel-loader 0.1.0",
|
"wasmer-kernel-loader 0.1.0",
|
||||||
"wasmer-llvm-backend 0.6.0",
|
"wasmer-llvm-backend 0.6.0",
|
||||||
"wasmer-middleware-common 0.6.0",
|
"wasmer-middleware-common 0.6.0",
|
||||||
|
"wasmer-middleware-common-tests 0.6.0",
|
||||||
"wasmer-runtime 0.6.0",
|
"wasmer-runtime 0.6.0",
|
||||||
"wasmer-runtime-core 0.6.0",
|
"wasmer-runtime-core 0.6.0",
|
||||||
"wasmer-singlepass-backend 0.6.0",
|
"wasmer-singlepass-backend 0.6.0",
|
||||||
@ -1557,11 +1558,19 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "wasmer-middleware-common"
|
name = "wasmer-middleware-common"
|
||||||
version = "0.6.0"
|
version = "0.6.0"
|
||||||
|
dependencies = [
|
||||||
|
"wasmer-runtime-core 0.6.0",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "wasmer-middleware-common-tests"
|
||||||
|
version = "0.6.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"criterion 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
|
"criterion 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"wabt 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"wabt 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"wasmer-clif-backend 0.6.0",
|
"wasmer-clif-backend 0.6.0",
|
||||||
"wasmer-llvm-backend 0.6.0",
|
"wasmer-llvm-backend 0.6.0",
|
||||||
|
"wasmer-middleware-common 0.6.0",
|
||||||
"wasmer-runtime-core 0.6.0",
|
"wasmer-runtime-core 0.6.0",
|
||||||
"wasmer-singlepass-backend 0.6.0",
|
"wasmer-singlepass-backend 0.6.0",
|
||||||
]
|
]
|
||||||
|
11
Cargo.toml
11
Cargo.toml
@ -35,6 +35,7 @@ wasmer-wasi = { path = "lib/wasi", optional = true }
|
|||||||
wasmer-kernel-loader = { path = "lib/kernel-loader", optional = true }
|
wasmer-kernel-loader = { path = "lib/kernel-loader", optional = true }
|
||||||
wasmer-dev-utils = { path = "lib/dev-utils", optional = true }
|
wasmer-dev-utils = { path = "lib/dev-utils", optional = true }
|
||||||
wasmer-wasi-tests = { path = "lib/wasi-tests", optional = true }
|
wasmer-wasi-tests = { path = "lib/wasi-tests", optional = true }
|
||||||
|
wasmer-middleware-common-tests = { path = "lib/middleware-common-tests", optional = true }
|
||||||
wasmer-emscripten-tests = { path = "lib/emscripten-tests", optional = true }
|
wasmer-emscripten-tests = { path = "lib/emscripten-tests", optional = true }
|
||||||
|
|
||||||
[workspace]
|
[workspace]
|
||||||
@ -56,6 +57,7 @@ members = [
|
|||||||
"lib/dev-utils",
|
"lib/dev-utils",
|
||||||
"lib/wasi-tests",
|
"lib/wasi-tests",
|
||||||
"lib/emscripten-tests",
|
"lib/emscripten-tests",
|
||||||
|
"lib/middleware-common-tests",
|
||||||
"examples/plugin-for-example"
|
"examples/plugin-for-example"
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -75,19 +77,22 @@ fast-tests = []
|
|||||||
backend-cranelift = [
|
backend-cranelift = [
|
||||||
"wasmer-runtime-core/backend-cranelift",
|
"wasmer-runtime-core/backend-cranelift",
|
||||||
"wasmer-runtime/cranelift",
|
"wasmer-runtime/cranelift",
|
||||||
"wasmer-middleware-common/clif"
|
"wasmer-middleware-common-tests/clif",
|
||||||
|
"wasmer-wasi-tests/clif"
|
||||||
]
|
]
|
||||||
backend-llvm = [
|
backend-llvm = [
|
||||||
"wasmer-llvm-backend",
|
"wasmer-llvm-backend",
|
||||||
"wasmer-runtime-core/backend-llvm",
|
"wasmer-runtime-core/backend-llvm",
|
||||||
"wasmer-runtime/llvm",
|
"wasmer-runtime/llvm",
|
||||||
"wasmer-middleware-common/llvm"
|
"wasmer-middleware-common-tests/llvm",
|
||||||
|
"wasmer-wasi-tests/llvm"
|
||||||
]
|
]
|
||||||
backend-singlepass = [
|
backend-singlepass = [
|
||||||
"wasmer-singlepass-backend",
|
"wasmer-singlepass-backend",
|
||||||
"wasmer-runtime-core/backend-singlepass",
|
"wasmer-runtime-core/backend-singlepass",
|
||||||
"wasmer-runtime/singlepass",
|
"wasmer-runtime/singlepass",
|
||||||
"wasmer-middleware-common/singlepass"
|
"wasmer-middleware-common-tests/singlepass",
|
||||||
|
"wasmer-wasi-tests/singlepass"
|
||||||
]
|
]
|
||||||
wasi = ["wasmer-wasi"]
|
wasi = ["wasmer-wasi"]
|
||||||
# vfs = ["wasmer-runtime-abi"]
|
# vfs = ["wasmer-runtime-abi"]
|
||||||
|
10
Makefile
10
Makefile
@ -50,13 +50,13 @@ emtests: emtests-unit emtests-singlepass emtests-cranelift emtests-llvm
|
|||||||
|
|
||||||
# Middleware tests
|
# Middleware tests
|
||||||
middleware-singlepass:
|
middleware-singlepass:
|
||||||
cargo test --manifest-path lib/middleware-common/Cargo.toml --release --features singlepass
|
cargo test --manifest-path lib/middleware-common-tests/Cargo.toml --release --features singlepass
|
||||||
|
|
||||||
middleware-cranelift:
|
middleware-cranelift:
|
||||||
cargo test --manifest-path lib/middleware-common/Cargo.toml --release --features clif
|
cargo test --manifest-path lib/middleware-common-tests/Cargo.toml --release --features clif
|
||||||
|
|
||||||
middleware-llvm:
|
middleware-llvm:
|
||||||
cargo test --manifest-path lib/middleware-common/Cargo.toml --release --features llvm
|
cargo test --manifest-path lib/middleware-common-tests/Cargo.toml --release --features llvm
|
||||||
|
|
||||||
middleware: middleware-singlepass middleware-cranelift middleware-llvm
|
middleware: middleware-singlepass middleware-cranelift middleware-llvm
|
||||||
|
|
||||||
@ -99,7 +99,7 @@ capi:
|
|||||||
cargo test -p wasmer-runtime-c-api --release
|
cargo test -p wasmer-runtime-c-api --release
|
||||||
|
|
||||||
test-rest: capi
|
test-rest: capi
|
||||||
cargo test --release --all --exclude wasmer-runtime-c-api --exclude wasmer-emscripten --exclude wasmer-spectests --exclude wasmer-wasi --exclude wasmer-middleware-common --exclude wasmer-singlepass-backend --exclude wasmer-clif-backend --exclude wasmer-llvm-backend --exclude wasmer-wasi-tests --exclude wasmer-emscripten-tests
|
cargo test --release --all --exclude wasmer-runtime-c-api --exclude wasmer-emscripten --exclude wasmer-spectests --exclude wasmer-wasi --exclude wasmer-middleware-common --exclude wasmer-middleware-common-tests --exclude wasmer-singlepass-backend --exclude wasmer-clif-backend --exclude wasmer-llvm-backend --exclude wasmer-wasi-tests --exclude wasmer-emscripten-tests
|
||||||
|
|
||||||
circleci-clean:
|
circleci-clean:
|
||||||
@if [ ! -z "${CIRCLE_JOB}" ]; then rm -f /home/circleci/project/target/debug/deps/libcranelift_wasm* && rm -f /Users/distiller/project/target/debug/deps/libcranelift_wasm*; fi;
|
@if [ ! -z "${CIRCLE_JOB}" ]; then rm -f /home/circleci/project/target/debug/deps/libcranelift_wasm* && rm -f /Users/distiller/project/target/debug/deps/libcranelift_wasm*; fi;
|
||||||
@ -178,4 +178,4 @@ publish-release:
|
|||||||
# cargo install cargo-deps
|
# cargo install cargo-deps
|
||||||
# must install graphviz for `dot`
|
# must install graphviz for `dot`
|
||||||
dep-graph:
|
dep-graph:
|
||||||
cargo deps --optional-deps --filter wasmer-wasi wasmer-wasi-tests wasmer-kernel-loader wasmer-dev-utils wasmer-llvm-backend wasmer-emscripten wasmer-emscripten-tests wasmer-runtime-core wasmer-runtime wasmer-middleware-common wasmer-singlepass-backend wasmer-clif-backend wasmer --manifest-path Cargo.toml | dot -Tpng > wasmer_depgraph.png
|
cargo deps --optional-deps --filter wasmer-wasi wasmer-wasi-tests wasmer-kernel-loader wasmer-dev-utils wasmer-llvm-backend wasmer-emscripten wasmer-emscripten-tests wasmer-runtime-core wasmer-runtime wasmer-middleware-common wasmer-middleware-common-tests wasmer-singlepass-backend wasmer-clif-backend wasmer --manifest-path Cargo.toml | dot -Tpng > wasmer_depgraph.png
|
||||||
|
@ -6,6 +6,7 @@ license = "MIT"
|
|||||||
authors = ["The Wasmer Engineering Team <engineering@wasmer.io>"]
|
authors = ["The Wasmer Engineering Team <engineering@wasmer.io>"]
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
repository = "https://github.com/wasmerio/wasmer"
|
repository = "https://github.com/wasmerio/wasmer"
|
||||||
|
publish = false
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
libc = "0.2.60"
|
libc = "0.2.60"
|
||||||
|
28
lib/middleware-common-tests/Cargo.toml
Normal file
28
lib/middleware-common-tests/Cargo.toml
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
[package]
|
||||||
|
name = "wasmer-middleware-common-tests"
|
||||||
|
version = "0.6.0"
|
||||||
|
authors = ["The Wasmer Engineering Team <engineering@wasmer.io>"]
|
||||||
|
edition = "2018"
|
||||||
|
repository = "https://github.com/wasmerio/wasmer"
|
||||||
|
license = "MIT"
|
||||||
|
publish = false
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
wasmer-runtime-core = { path = "../runtime-core", version = "0.6.0" }
|
||||||
|
wasmer-middleware-common = { path = "../middleware-common", version = "0.6.0" }
|
||||||
|
wasmer-clif-backend = { path = "../clif-backend", version = "0.6.0" }
|
||||||
|
wasmer-llvm-backend = { path = "../llvm-backend", version = "0.6.0", optional = true }
|
||||||
|
wasmer-singlepass-backend = { path = "../singlepass-backend", version = "0.6.0", optional = true }
|
||||||
|
|
||||||
|
[features]
|
||||||
|
clif = []
|
||||||
|
llvm = ["wasmer-llvm-backend"]
|
||||||
|
singlepass = ["wasmer-singlepass-backend"]
|
||||||
|
|
||||||
|
[dev-dependencies]
|
||||||
|
wabt = "0.9.1"
|
||||||
|
criterion = "0.2"
|
||||||
|
|
||||||
|
[[bench]]
|
||||||
|
name = "metering_benchmark"
|
||||||
|
harness = false
|
152
lib/middleware-common-tests/src/lib.rs
Normal file
152
lib/middleware-common-tests/src/lib.rs
Normal file
@ -0,0 +1,152 @@
|
|||||||
|
#[cfg(all(test, any(feature = "singlepass", feature = "llvm")))]
|
||||||
|
mod tests {
|
||||||
|
use wabt::wat2wasm;
|
||||||
|
|
||||||
|
use wasmer_middleware_common::metering::*;
|
||||||
|
use wasmer_runtime_core::codegen::{MiddlewareChain, StreamingCompiler};
|
||||||
|
use wasmer_runtime_core::{backend::Compiler, compile_with, imports, Func};
|
||||||
|
|
||||||
|
#[cfg(feature = "llvm")]
|
||||||
|
fn get_compiler(limit: u64) -> impl Compiler {
|
||||||
|
use wasmer_llvm_backend::ModuleCodeGenerator as LLVMMCG;
|
||||||
|
let c: StreamingCompiler<LLVMMCG, _, _, _, _> = StreamingCompiler::new(move || {
|
||||||
|
let mut chain = MiddlewareChain::new();
|
||||||
|
chain.push(Metering::new(limit));
|
||||||
|
chain
|
||||||
|
});
|
||||||
|
c
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "singlepass")]
|
||||||
|
fn get_compiler(limit: u64) -> impl Compiler {
|
||||||
|
use wasmer_singlepass_backend::ModuleCodeGenerator as SinglePassMCG;
|
||||||
|
let c: StreamingCompiler<SinglePassMCG, _, _, _, _> = StreamingCompiler::new(move || {
|
||||||
|
let mut chain = MiddlewareChain::new();
|
||||||
|
chain.push(Metering::new(limit));
|
||||||
|
chain
|
||||||
|
});
|
||||||
|
c
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(not(any(feature = "llvm", feature = "clif", feature = "singlepass")))]
|
||||||
|
compile_error!("compiler not specified, activate a compiler via features");
|
||||||
|
|
||||||
|
#[cfg(feature = "clif")]
|
||||||
|
fn get_compiler(_limit: u64) -> impl Compiler {
|
||||||
|
compile_error!("cranelift does not implement metering");
|
||||||
|
use wasmer_clif_backend::CraneliftCompiler;
|
||||||
|
CraneliftCompiler::new()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Assemblyscript
|
||||||
|
// export function add_to(x: i32, y: i32): i32 {
|
||||||
|
// for(var i = 0; i < x; i++){
|
||||||
|
// if(i % 1 == 0){
|
||||||
|
// y += i;
|
||||||
|
// } else {
|
||||||
|
// y *= i
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// return y;
|
||||||
|
// }
|
||||||
|
static WAT: &'static str = r#"
|
||||||
|
(module
|
||||||
|
(type $t0 (func (param i32 i32) (result i32)))
|
||||||
|
(type $t1 (func))
|
||||||
|
(func $add_to (export "add_to") (type $t0) (param $p0 i32) (param $p1 i32) (result i32)
|
||||||
|
(local $l0 i32)
|
||||||
|
block $B0
|
||||||
|
i32.const 0
|
||||||
|
set_local $l0
|
||||||
|
loop $L1
|
||||||
|
get_local $l0
|
||||||
|
get_local $p0
|
||||||
|
i32.lt_s
|
||||||
|
i32.eqz
|
||||||
|
br_if $B0
|
||||||
|
get_local $l0
|
||||||
|
i32.const 1
|
||||||
|
i32.rem_s
|
||||||
|
i32.const 0
|
||||||
|
i32.eq
|
||||||
|
if $I2
|
||||||
|
get_local $p1
|
||||||
|
get_local $l0
|
||||||
|
i32.add
|
||||||
|
set_local $p1
|
||||||
|
else
|
||||||
|
get_local $p1
|
||||||
|
get_local $l0
|
||||||
|
i32.mul
|
||||||
|
set_local $p1
|
||||||
|
end
|
||||||
|
get_local $l0
|
||||||
|
i32.const 1
|
||||||
|
i32.add
|
||||||
|
set_local $l0
|
||||||
|
br $L1
|
||||||
|
unreachable
|
||||||
|
end
|
||||||
|
unreachable
|
||||||
|
end
|
||||||
|
get_local $p1)
|
||||||
|
(func $f1 (type $t1))
|
||||||
|
(table $table (export "table") 1 anyfunc)
|
||||||
|
(memory $memory (export "memory") 0)
|
||||||
|
(global $g0 i32 (i32.const 8))
|
||||||
|
(elem (i32.const 0) $f1))
|
||||||
|
"#;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_points_reduced_after_call() {
|
||||||
|
let wasm_binary = wat2wasm(WAT).unwrap();
|
||||||
|
|
||||||
|
let limit = 100u64;
|
||||||
|
|
||||||
|
let module = compile_with(&wasm_binary, &get_compiler(limit)).unwrap();
|
||||||
|
|
||||||
|
let import_object = imports! {};
|
||||||
|
let mut instance = module.instantiate(&import_object).unwrap();
|
||||||
|
|
||||||
|
set_points_used(&mut instance, 0u64);
|
||||||
|
|
||||||
|
let add_to: Func<(i32, i32), i32> = instance.func("add_to").unwrap();
|
||||||
|
let value = add_to.call(3, 4).unwrap();
|
||||||
|
|
||||||
|
// verify it returns the correct value
|
||||||
|
assert_eq!(value, 7);
|
||||||
|
|
||||||
|
// verify it used the correct number of points
|
||||||
|
assert_eq!(get_points_used(&instance), 74);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_traps_after_costly_call() {
|
||||||
|
use wasmer_runtime_core::error::RuntimeError;
|
||||||
|
let wasm_binary = wat2wasm(WAT).unwrap();
|
||||||
|
|
||||||
|
let limit = 100u64;
|
||||||
|
|
||||||
|
let module = compile_with(&wasm_binary, &get_compiler(limit)).unwrap();
|
||||||
|
|
||||||
|
let import_object = imports! {};
|
||||||
|
let mut instance = module.instantiate(&import_object).unwrap();
|
||||||
|
|
||||||
|
set_points_used(&mut instance, 0u64);
|
||||||
|
|
||||||
|
let add_to: Func<(i32, i32), i32> = instance.func("add_to").unwrap();
|
||||||
|
let result = add_to.call(10_000_000, 4);
|
||||||
|
|
||||||
|
let err = result.unwrap_err();
|
||||||
|
match err {
|
||||||
|
RuntimeError::Error { data } => {
|
||||||
|
assert!(data.downcast_ref::<ExecutionLimitExceededError>().is_some());
|
||||||
|
}
|
||||||
|
_ => unreachable!(),
|
||||||
|
}
|
||||||
|
|
||||||
|
// verify it used the correct number of points
|
||||||
|
assert_eq!(get_points_used(&instance), 109); // Used points will be slightly more than `limit` because of the way we do gas checking.
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -9,19 +9,3 @@ edition = "2018"
|
|||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
wasmer-runtime-core = { path = "../runtime-core" }
|
wasmer-runtime-core = { path = "../runtime-core" }
|
||||||
wasmer-clif-backend = { path = "../clif-backend", version = "0.6.0" }
|
|
||||||
wasmer-llvm-backend = { path = "../llvm-backend", version = "0.6.0", optional = true }
|
|
||||||
wasmer-singlepass-backend = { path = "../singlepass-backend", version = "0.6.0", optional = true }
|
|
||||||
|
|
||||||
[dev-dependencies]
|
|
||||||
wabt = "0.9.1"
|
|
||||||
criterion = "0.2"
|
|
||||||
|
|
||||||
[features]
|
|
||||||
clif = []
|
|
||||||
llvm = ["wasmer-llvm-backend"]
|
|
||||||
singlepass = ["wasmer-singlepass-backend"]
|
|
||||||
|
|
||||||
[[bench]]
|
|
||||||
name = "metering_benchmark"
|
|
||||||
harness = false
|
|
||||||
|
@ -128,156 +128,3 @@ pub fn get_points_used_ctx(ctx: &Ctx) -> u64 {
|
|||||||
pub fn set_points_used_ctx(ctx: &mut Ctx, value: u64) {
|
pub fn set_points_used_ctx(ctx: &mut Ctx, value: u64) {
|
||||||
ctx.set_internal(&INTERNAL_FIELD, value);
|
ctx.set_internal(&INTERNAL_FIELD, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(all(test, any(feature = "singlepass", feature = "llvm")))]
|
|
||||||
mod tests {
|
|
||||||
use super::*;
|
|
||||||
use wabt::wat2wasm;
|
|
||||||
|
|
||||||
use wasmer_runtime_core::codegen::{MiddlewareChain, StreamingCompiler};
|
|
||||||
use wasmer_runtime_core::{backend::Compiler, compile_with, imports, Func};
|
|
||||||
|
|
||||||
#[cfg(feature = "llvm")]
|
|
||||||
fn get_compiler(limit: u64) -> impl Compiler {
|
|
||||||
use wasmer_llvm_backend::ModuleCodeGenerator as LLVMMCG;
|
|
||||||
let c: StreamingCompiler<LLVMMCG, _, _, _, _> = StreamingCompiler::new(move || {
|
|
||||||
let mut chain = MiddlewareChain::new();
|
|
||||||
chain.push(Metering::new(limit));
|
|
||||||
chain
|
|
||||||
});
|
|
||||||
c
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(feature = "singlepass")]
|
|
||||||
fn get_compiler(limit: u64) -> impl Compiler {
|
|
||||||
use wasmer_singlepass_backend::ModuleCodeGenerator as SinglePassMCG;
|
|
||||||
let c: StreamingCompiler<SinglePassMCG, _, _, _, _> = StreamingCompiler::new(move || {
|
|
||||||
let mut chain = MiddlewareChain::new();
|
|
||||||
chain.push(Metering::new(limit));
|
|
||||||
chain
|
|
||||||
});
|
|
||||||
c
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(not(any(feature = "llvm", feature = "clif", feature = "singlepass")))]
|
|
||||||
compile_error!("compiler not specified, activate a compiler via features");
|
|
||||||
|
|
||||||
#[cfg(feature = "clif")]
|
|
||||||
fn get_compiler(_limit: u64) -> impl Compiler {
|
|
||||||
compile_error!("cranelift does not implement metering");
|
|
||||||
use wasmer_clif_backend::CraneliftCompiler;
|
|
||||||
CraneliftCompiler::new()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Assemblyscript
|
|
||||||
// export function add_to(x: i32, y: i32): i32 {
|
|
||||||
// for(var i = 0; i < x; i++){
|
|
||||||
// if(i % 1 == 0){
|
|
||||||
// y += i;
|
|
||||||
// } else {
|
|
||||||
// y *= i
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// return y;
|
|
||||||
// }
|
|
||||||
static WAT: &'static str = r#"
|
|
||||||
(module
|
|
||||||
(type $t0 (func (param i32 i32) (result i32)))
|
|
||||||
(type $t1 (func))
|
|
||||||
(func $add_to (export "add_to") (type $t0) (param $p0 i32) (param $p1 i32) (result i32)
|
|
||||||
(local $l0 i32)
|
|
||||||
block $B0
|
|
||||||
i32.const 0
|
|
||||||
set_local $l0
|
|
||||||
loop $L1
|
|
||||||
get_local $l0
|
|
||||||
get_local $p0
|
|
||||||
i32.lt_s
|
|
||||||
i32.eqz
|
|
||||||
br_if $B0
|
|
||||||
get_local $l0
|
|
||||||
i32.const 1
|
|
||||||
i32.rem_s
|
|
||||||
i32.const 0
|
|
||||||
i32.eq
|
|
||||||
if $I2
|
|
||||||
get_local $p1
|
|
||||||
get_local $l0
|
|
||||||
i32.add
|
|
||||||
set_local $p1
|
|
||||||
else
|
|
||||||
get_local $p1
|
|
||||||
get_local $l0
|
|
||||||
i32.mul
|
|
||||||
set_local $p1
|
|
||||||
end
|
|
||||||
get_local $l0
|
|
||||||
i32.const 1
|
|
||||||
i32.add
|
|
||||||
set_local $l0
|
|
||||||
br $L1
|
|
||||||
unreachable
|
|
||||||
end
|
|
||||||
unreachable
|
|
||||||
end
|
|
||||||
get_local $p1)
|
|
||||||
(func $f1 (type $t1))
|
|
||||||
(table $table (export "table") 1 anyfunc)
|
|
||||||
(memory $memory (export "memory") 0)
|
|
||||||
(global $g0 i32 (i32.const 8))
|
|
||||||
(elem (i32.const 0) $f1))
|
|
||||||
"#;
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn test_points_reduced_after_call() {
|
|
||||||
let wasm_binary = wat2wasm(WAT).unwrap();
|
|
||||||
|
|
||||||
let limit = 100u64;
|
|
||||||
|
|
||||||
let module = compile_with(&wasm_binary, &get_compiler(limit)).unwrap();
|
|
||||||
|
|
||||||
let import_object = imports! {};
|
|
||||||
let mut instance = module.instantiate(&import_object).unwrap();
|
|
||||||
|
|
||||||
set_points_used(&mut instance, 0u64);
|
|
||||||
|
|
||||||
let add_to: Func<(i32, i32), i32> = instance.func("add_to").unwrap();
|
|
||||||
let value = add_to.call(3, 4).unwrap();
|
|
||||||
|
|
||||||
// verify it returns the correct value
|
|
||||||
assert_eq!(value, 7);
|
|
||||||
|
|
||||||
// verify it used the correct number of points
|
|
||||||
assert_eq!(get_points_used(&instance), 74);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn test_traps_after_costly_call() {
|
|
||||||
use wasmer_runtime_core::error::RuntimeError;
|
|
||||||
let wasm_binary = wat2wasm(WAT).unwrap();
|
|
||||||
|
|
||||||
let limit = 100u64;
|
|
||||||
|
|
||||||
let module = compile_with(&wasm_binary, &get_compiler(limit)).unwrap();
|
|
||||||
|
|
||||||
let import_object = imports! {};
|
|
||||||
let mut instance = module.instantiate(&import_object).unwrap();
|
|
||||||
|
|
||||||
set_points_used(&mut instance, 0u64);
|
|
||||||
|
|
||||||
let add_to: Func<(i32, i32), i32> = instance.func("add_to").unwrap();
|
|
||||||
let result = add_to.call(10_000_000, 4);
|
|
||||||
|
|
||||||
let err = result.unwrap_err();
|
|
||||||
match err {
|
|
||||||
RuntimeError::Error { data } => {
|
|
||||||
assert!(data.downcast_ref::<ExecutionLimitExceededError>().is_some());
|
|
||||||
}
|
|
||||||
_ => unreachable!(),
|
|
||||||
}
|
|
||||||
|
|
||||||
// verify it used the correct number of points
|
|
||||||
assert_eq!(get_points_used(&instance), 109); // Used points will be slightly more than `limit` because of the way we do gas checking.
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
@ -11,6 +11,7 @@ echo "manually check changes to wasmer.iss"
|
|||||||
# Order to upload packages in
|
# Order to upload packages in
|
||||||
## runtime-core
|
## runtime-core
|
||||||
## win-exception-handler
|
## win-exception-handler
|
||||||
|
## middleware-common
|
||||||
## clif-backend
|
## clif-backend
|
||||||
## llvm-backend
|
## llvm-backend
|
||||||
## singlepass-backend
|
## singlepass-backend
|
||||||
|
Loading…
x
Reference in New Issue
Block a user