From b35a522d28628ab0fd1b4a978358f898096d8aee Mon Sep 17 00:00:00 2001 From: Mark McCaskey Date: Mon, 16 Sep 2019 15:01:18 -0700 Subject: [PATCH 1/5] Add method to call function at index on Ctx --- lib/runtime-core/src/instance.rs | 2 +- lib/runtime-core/src/vm.rs | 25 ++++++++++++++++++++++++- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/lib/runtime-core/src/instance.rs b/lib/runtime-core/src/instance.rs index e6ba365f6ef..97b2d362927 100644 --- a/lib/runtime-core/src/instance.rs +++ b/lib/runtime-core/src/instance.rs @@ -518,7 +518,7 @@ impl LikeNamespace for Rc { } #[must_use] -fn call_func_with_index( +pub(crate) fn call_func_with_index( info: &ModuleInfo, runnable: &dyn RunnableModule, import_backing: &ImportBacking, diff --git a/lib/runtime-core/src/vm.rs b/lib/runtime-core/src/vm.rs index 51f883318d1..7c811e36ecf 100644 --- a/lib/runtime-core/src/vm.rs +++ b/lib/runtime-core/src/vm.rs @@ -1,9 +1,11 @@ pub use crate::backing::{ImportBacking, LocalBacking, INTERNALS_SIZE}; use crate::{ + error::{CallError, CallResult, RuntimeError}, + instance::call_func_with_index, memory::{Memory, MemoryType}, module::{ModuleInfo, ModuleInner}, structures::TypedIndex, - types::{LocalOrImport, MemoryIndex}, + types::{FuncIndex, LocalOrImport, MemoryIndex, Value}, vmcalls, }; use std::{ @@ -393,6 +395,27 @@ impl Ctx { (*self.internal.internals)[field.index()] = value; } } + + /// Calls a host or Wasm function at the given index + pub fn call_with_index(&mut self, index: FuncIndex, args: &[Value]) -> CallResult> { + let module = unsafe { &(*self.module) }; + if module.info.func_assoc.get(index).is_none() { + return Err(CallError::Runtime(RuntimeError::Trap { + msg: format!("Index out of bounds: {}", index.index()).into_boxed_str(), + })); + } + let mut output = vec![]; + call_func_with_index( + &module.info, + module.runnable_module.as_ref(), + unsafe { &*self.import_backing }, + self as *mut Ctx, + index, + args, + &mut output, + )?; + Ok(output) + } } #[doc(hidden)] From 5741a2cf7004afa3e341c49294d374254495ada9 Mon Sep 17 00:00:00 2001 From: Mark McCaskey Date: Wed, 18 Sep 2019 16:06:46 -0700 Subject: [PATCH 2/5] Implement function lookups using the table --- lib/runtime-core/src/instance.rs | 56 +++++++++++++++++---------- lib/runtime-core/src/table/anyfunc.rs | 2 +- lib/runtime-core/src/table/mod.rs | 3 +- lib/runtime-core/src/vm.rs | 54 ++++++++++++++++---------- 4 files changed, 71 insertions(+), 44 deletions(-) diff --git a/lib/runtime-core/src/instance.rs b/lib/runtime-core/src/instance.rs index 97b2d362927..f1ce0a19376 100644 --- a/lib/runtime-core/src/instance.rs +++ b/lib/runtime-core/src/instance.rs @@ -518,7 +518,7 @@ impl LikeNamespace for Rc { } #[must_use] -pub(crate) fn call_func_with_index( +fn call_func_with_index( info: &ModuleInfo, runnable: &dyn RunnableModule, import_backing: &ImportBacking, @@ -527,29 +527,12 @@ pub(crate) fn call_func_with_index( args: &[Value], rets: &mut Vec, ) -> CallResult<()> { - rets.clear(); - let sig_index = *info .func_assoc .get(func_index) .expect("broken invariant, incorrect func index"); let signature = &info.signatures[sig_index]; - let num_results = signature.returns().len(); - let num_results = num_results - + signature - .returns() - .iter() - .filter(|&&ty| ty == Type::V128) - .count(); - rets.reserve(num_results); - - if !signature.check_param_value_types(args) { - Err(ResolveError::Signature { - expected: signature.clone(), - found: args.iter().map(|val| val.ty()).collect(), - })? - } let func_ptr = match func_index.local_or_import(info) { LocalOrImport::Local(local_func_index) => { @@ -567,6 +550,39 @@ pub(crate) fn call_func_with_index( } }; + let wasm = runnable + .get_trampoline(info, sig_index) + .expect("wasm trampoline"); + + call_func_with_index_inner(ctx_ptr, func_ptr, signature, wasm, args, rets) +} + +pub(crate) fn call_func_with_index_inner( + ctx_ptr: *mut vm::Ctx, + func_ptr: NonNull, + signature: &FuncSig, + wasm: Wasm, + args: &[Value], + rets: &mut Vec, +) -> CallResult<()> { + rets.clear(); + + let num_results = signature.returns().len(); + let num_results = num_results + + signature + .returns() + .iter() + .filter(|&&ty| ty == Type::V128) + .count(); + rets.reserve(num_results); + + if !signature.check_param_value_types(args) { + Err(ResolveError::Signature { + expected: signature.clone(), + found: args.iter().map(|val| val.ty()).collect(), + })? + } + let mut raw_args: SmallVec<[u64; 8]> = SmallVec::new(); for v in args { match v { @@ -598,9 +614,7 @@ pub(crate) fn call_func_with_index( trampoline, invoke, invoke_env, - } = runnable - .get_trampoline(info, sig_index) - .expect("wasm trampoline"); + } = wasm; let run_wasm = |result_space: *mut u64| unsafe { let mut trap_info = WasmTrapInfo::Unknown; diff --git a/lib/runtime-core/src/table/anyfunc.rs b/lib/runtime-core/src/table/anyfunc.rs index 789f67ada2b..8336b502882 100644 --- a/lib/runtime-core/src/table/anyfunc.rs +++ b/lib/runtime-core/src/table/anyfunc.rs @@ -44,7 +44,7 @@ impl<'a> From> for Anyfunc<'a> { } pub struct AnyfuncTable { - backing: Vec, + pub backing: Vec, max: Option, } diff --git a/lib/runtime-core/src/table/mod.rs b/lib/runtime-core/src/table/mod.rs index 2e11507b1de..8fb32150157 100644 --- a/lib/runtime-core/src/table/mod.rs +++ b/lib/runtime-core/src/table/mod.rs @@ -9,8 +9,7 @@ use std::{cell::RefCell, fmt, ptr, rc::Rc}; mod anyfunc; -pub use self::anyfunc::Anyfunc; -use self::anyfunc::AnyfuncTable; +pub use self::anyfunc::{Anyfunc, AnyfuncTable}; use crate::error::GrowError; pub enum Element<'a> { diff --git a/lib/runtime-core/src/vm.rs b/lib/runtime-core/src/vm.rs index 7c811e36ecf..a4abc7b0298 100644 --- a/lib/runtime-core/src/vm.rs +++ b/lib/runtime-core/src/vm.rs @@ -1,17 +1,19 @@ pub use crate::backing::{ImportBacking, LocalBacking, INTERNALS_SIZE}; use crate::{ - error::{CallError, CallResult, RuntimeError}, - instance::call_func_with_index, + error::CallResult, + instance::call_func_with_index_inner, memory::{Memory, MemoryType}, module::{ModuleInfo, ModuleInner}, + sig_registry::SigRegistry, structures::TypedIndex, - types::{FuncIndex, LocalOrImport, MemoryIndex, Value}, + types::{LocalOrImport, MemoryIndex, TableIndex, Value}, vmcalls, }; use std::{ cell::UnsafeCell, ffi::c_void, - mem, ptr, + mem, + ptr::{self, NonNull}, sync::atomic::{AtomicUsize, Ordering}, sync::Once, }; @@ -397,24 +399,36 @@ impl Ctx { } /// Calls a host or Wasm function at the given index - pub fn call_with_index(&mut self, index: FuncIndex, args: &[Value]) -> CallResult> { - let module = unsafe { &(*self.module) }; - if module.info.func_assoc.get(index).is_none() { - return Err(CallError::Runtime(RuntimeError::Trap { - msg: format!("Index out of bounds: {}", index.index()).into_boxed_str(), - })); - } - let mut output = vec![]; - call_func_with_index( - &module.info, - module.runnable_module.as_ref(), - unsafe { &*self.import_backing }, - self as *mut Ctx, - index, + pub fn call_with_index(&mut self, index: TableIndex, args: &[Value]) -> CallResult> { + let anyfunc_table = + unsafe { &*((**self.internal.tables).table as *mut crate::table::AnyfuncTable) }; + let entry = anyfunc_table.backing[index.index()]; + + let fn_ptr = entry.func; + let sig_id = entry.sig_id; + let signature = SigRegistry.lookup_signature(unsafe { std::mem::transmute(sig_id.0) }); + let mut rets = vec![]; + + let wasm = { + let module = unsafe { &*self.module }; + let runnable = &module.runnable_module; + + let sig_index = SigRegistry.lookup_sig_index(signature.clone()); + runnable + .get_trampoline(&module.info, sig_index) + .expect("wasm trampoline") + }; + + call_func_with_index_inner( + self as *mut Ctx, /* doesn't handle all cases */ + NonNull::new(fn_ptr as *mut _).unwrap(), + &signature, + wasm, args, - &mut output, + &mut rets, )?; - Ok(output) + + Ok(rets) } } From ccd369ff0c4b2510babee32caf81a281c1b3c9c7 Mon Sep 17 00:00:00 2001 From: Mark McCaskey Date: Wed, 18 Sep 2019 16:43:47 -0700 Subject: [PATCH 3/5] Add example, rename Ctx fn, make things pub(crate), misc changes --- .github/pull_request_template.md | 2 +- CHANGELOG.md | 2 ++ Cargo.toml | 6 +++- examples/callback-guest.rs | 24 ++++++++++++++ examples/callback-guest.wasm | Bin 0 -> 31667 bytes examples/callback.rs | 46 ++++++++++++++++++++++++++ lib/runtime-core/src/table/anyfunc.rs | 2 +- lib/runtime-core/src/table/mod.rs | 3 +- lib/runtime-core/src/vm.rs | 16 +++++---- 9 files changed, 90 insertions(+), 11 deletions(-) create mode 100644 examples/callback-guest.rs create mode 100755 examples/callback-guest.wasm create mode 100644 examples/callback.rs diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 609e0c83f7c..b29669d33b3 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -12,4 +12,4 @@ links to related issues, and the context of the PR. # Review -- [ ] Create a short description of the the change in the CHANGELOG.md file +- [ ] Add a short description of the the change to the CHANGELOG.md file diff --git a/CHANGELOG.md b/CHANGELOG.md index 4672f8d701b..ed517016d93 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ Blocks of changes will separated by version increments. ## **[Unreleased]** +- [#803](https://github.com/wasmerio/wasmer/issues/803) Add method to `Ctx` to invoke functions by their `TableIndex` + ## 0.7.0 - 2019-09-12 Special thanks to @YaronWittenstein @penberg for their contributions. diff --git a/Cargo.toml b/Cargo.toml index 31ba526bd0b..06b2c2854dc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -58,7 +58,7 @@ members = [ "lib/wasi-tests", "lib/emscripten-tests", "lib/middleware-common-tests", - "examples/plugin-for-example" + "examples/plugin-for-example", ] [build-dependencies] @@ -105,3 +105,7 @@ managed = ["backend-singlepass", "wasmer-runtime-core/managed"] [[example]] name = "plugin" crate-type = ["bin"] + +[[example]] +name = "callback" +crate-type = ["bin"] diff --git a/examples/callback-guest.rs b/examples/callback-guest.rs new file mode 100644 index 00000000000..129ad05c8ac --- /dev/null +++ b/examples/callback-guest.rs @@ -0,0 +1,24 @@ +extern "C" { + fn call_guest_fn(f: u32) -> u32; + fn call_guest_fn2(f: u32) -> u32; + fn host_callback() -> u32; +} + +#[no_mangle] +fn test_callback() -> u32 { + 42 +} + +#[no_mangle] +fn test_callback2() -> u32 { + 45 +} + +fn main() { + unsafe { call_guest_fn(test_callback as usize as u32) }; + unsafe { call_guest_fn(host_callback as usize as u32) }; + unsafe { call_guest_fn(test_callback2 as usize as u32) }; + unsafe { call_guest_fn2(test_callback2 as usize as u32) }; + unsafe { call_guest_fn2(test_callback as usize as u32) }; + unsafe { call_guest_fn2(host_callback as usize as u32) }; +} diff --git a/examples/callback-guest.wasm b/examples/callback-guest.wasm new file mode 100755 index 0000000000000000000000000000000000000000..05558297595555751c3b484fce3f763f1828c182 GIT binary patch literal 31667 zcmeI53!Ge4o#)Se)T67a)0Ge)B!S#2BXl4nout#<2_StlBq4;CsQ5yYCTU2z^B~=w z03RK?0>LK=I_$`*qd0@&i;fAB3XV1194-St{Y`bBf^L4xSbEgN_5A7Ird9|A}tKDiE?z%CbceyCYb$0N{@o|MP z41y>Z;glkWaPRHFw_Ju6aB!1YsDLap)G(H>!rES}G4owVg8{W4w3OgsX)YjsnIkWCpyExuEw0ob+cdQFs8kE;W zL7XcV3R~wbUU=D?y3Suwd|6VTTdbUR>Vj3PPwyoG@#cN*sy5j5K z@W#@gJsR8?yY$>LU+0$-#;Ll6X{fKre}xOF<16H=Tn~cDm$|e$S`U}HBuwMJu)?J> zQeDfXI-tLw@Yx8bSZ{x^4i;6opO$6Vcf>&U&I_|5mf|3^D@^NkO`?|bij;^$9| zl{?*rBftJ9hyU#8{r~wH;P8{zn7g{2v2`8pD)T**-QCEYYB!Z%AB1ho63lhJinYk# zXNZtyJCZ0Kj0Pz?TeV;JYlO2Annda3NImLwe14XH1ws8zHoWsHiZ4*eCi*& zU2Ur@)ujU?ePNH4ij=yo)J-YjS#>0RmZsHTapmPL8b-_-C4puI8JaRmizDgh-!FQ8MlBj_aXr}BDP$J4AQd%bc^*|v@0g`IN?wn4miK#d^^DdfpFz5^PiRV? zxKmuBisd6|$(I&q90f~?S%MVCTABo6tO|FYu@GJHN1{ubz)K6b!Xiyx+Ik#&1l8+j zi%|N)9W3)zs)Q;tqLm(l$y8r`HDoq@aYx_>Lma&RInOiN3m{6oiI}c;^ZoEuI$b!D zmbH{ni!$K|wT9j#)EX93@7J(^E}Eh*9I%pvqsK};l)8DgU}izbi{t{q;L<1CMY5t< z|EG%N^)0gbl_w)f0KxSI`CveORjQW*>--VEx<{5pu3u~SVjHH992Sydp81jVgB3IF4D%sf#)_L_BpJI<0090hO~N^ z0sy!QCt;CBRT>|Pr57Jyg0c0k)9&(z(j^DdDOFU`P~BujO0;;b1s#|zRhAE-+O<$?6Ne(KjQ}j_ zd0Yqe)@#(Pn-m;E5{=aP+Jc~>yCyWGDz_}EVgXs(2@YJE^r7-d|pTefGjhHDtkvO@u@uexhDyp>_$$MB` zRtuWFJ3}j_lRRO}W_#1n#!a{wwjyrQU~{J*vbwZvO^uR%fD9U>sIFO%GHjzNZRiB; z&&stb4QQgqfRmSZM#pzI5W%vvepk7A7W{JxMyF{WT=~awkdqs9)Q!s9NT2g~06Lbg zn+*X9#o)6Am#b%sX*Kr(5g-jW)x$+H0MsES9-aD5LZQioAtP=*JYPnhPEr>sRz4g| zAIJ8y4kK{-O@C993a}^49s#fF6JvRq8;v3zvH;&JiG+kGMVx>FzhxtyL6nA@JK+PU zu0}CUaO+}EG1^EWS(}`|gbXJGLe^ii8L+eAX>zMEw5h-%@@?es91AWoj+H1am5XrH zL4*_SzYPUO+~(?;qO(9=D(9pr5cq3=zc79H-BT_-GrgaS`3avt!u{##16*{Uh@~nB z3n)*&No8Mn38g=EBiX8D7dwR^b06pU67D0&P@Ojqufv0c-j`Ex%*K!`&~`cXk@qa0 zG>cNT`5t#nIAF!cRP3?h;OI%b%;yB>5?5ZuWLih$9BRp4%{a4brLGB)1`WtA@yJ zaIZv1SQqbNo8>?pLRj5udeS1c1Z5O?DlZk{z2p+o5j6;XB5bZdD$?X|qtRg5qD}OW zJf|S-ks=Wn-*+dV^{4OPGRtdCWw5YPsV3u!uElE*x=~fJZWdDmINEBJW9w5tMG=X`<1AQ|4PF7JXzr%<-?85rq$I zZtLqwSkECOXe6PTF(QqTtHDjR%$dM)Gns1j7{~(MXDdauq=8z?#^q$oOvAv|rqDsw zQ+I$REaSrw!BBf79gfv<=~IwVa1zh}v5$$u!3bD@CaMR1L8xQa5pC+s>2g2{F8|9Y zYp?fYcY$2!3Pp3)U5g@y&xVQ&ilhZhJxEyKCex_mpSK>cK1sA$9SLNT_Xd zBv6rupGM>oYcq;>BFrw^1c*isw@C^t#CI|yXE8P$V#8qu&>!SkPG;O@*)v$v+zcl3 z#xhQmx$(8_QG-VOzsal4R^)GShvK9E@?^}o=pkV?vWbSEnLT!*Ye`Xxo# zSfPj<)MD1;DJrt6#G)&6BS`4Vx6ZaX07<&*3{edoMgb2VVI`FE<^=;$^x21^^o`OG zM1yF|1kFlpER|ZN3u75ME*QHo1 z=n~fmM~n@{VBtxesHP_+Et``(&VK5>-sI%K7GzHJpcANfH)+CB2(__BOP@oV&g@+}e zHeOMPiou1gn(F4@sNQnsJLl4XwUk}CO_xg764J_$7G3$XGCMrQV^HMG3^CS3DzquQ zv?Ey{_fi>z5J+SKLs{jB*;~;PK157STf7w6GqMN7G0k{s0rAp8769Ez)=AeAWV4h7 z2(GM8UDT@QEK|c++_a1ZYJXX@Kt76QF~QRap1cNZ8wgA{WH}O9eW$^4Thce69oq#fF zA6b9koxzr++CXuJEn}V>4Ox-=>zOrz0_jcpD&--?<%TV}TxttNl#9rs!WiRS^yu?3 z6&N!Cre*p#Xp^E0i12y za-h!D;Zn%y0X^g7%t=J?D4MYDBlSFbiZ##*w-Hwa`0KeO&s{yg2{KZaPE>{Tfm1%o zrQe!<%T=8(vsvkR%Yj;)z9WOCxUsV%MGueGBHRY-Qd$HCaI-L7f=*USWGgom&raNp zbvFu_hk%Qxl!J+}a=nm-6Y0HQo^l?tjh(m>sY}mD3Tbdi?I|qTv}mFhL|{cQ$G}jh zm6BszMkz;EQ6`Q`@=^kML2W4`9-Ml*R`}nh4muNDmfaDq#@DhJ(=wsM{QV zysH#sXKw(3ANm89IlK2XVX^B~MZBUVLN z5@FDnQvL+38$0KxLFH5hoRLIIIYP=>7$`n4k*#JdDY7u{W1eJaJt;?n0E%#A#2|{g zid#s50oih(o?8SdC?*t)&8pZMw5p&rx_AdL!IMQGb@WNisxOHdT*ZIE7OC>|{;U!n z>qtM#P0b05SvwF}FW?<+>VyTvIO503JdYeR%C;be128kmpf@#+pf1D(VGaO~SO&0Z zU9fP|niogdJq)Y;bg5p2oWsc)2W9aROjc>*%&5tkQW{XuX7Rkq7|5RStH=Ct0JUfb z(+Dh6R0zsla6Q{+Ey{&0^@cu10K|-e*JI$qc(pYvG?qlnEI!H>AEk}(Dg**}qz_xu zM6JQ`0^0^RznDGlY^gZjAOnJxYoZ%QEQ_u(A5j;XF3)dLl+Kptah$`vPh}K_?KHp@ zN={j&&o!iv@jRVgqK=}!)xvKs{gNIS`#h|A4K3Ell(yV_z?K#fd`gC!a;5=w@F9Uc z7EE%1=6+qqh+;RJ0kE->Ejp*&kS={hGvXeIlPVp?auuac(0ib^Iv~Z5IUvE6l@KI7*0WD?pZ-0Fg&I5ganQ%_<|**5;R;AR;Q2RK-wvw~(+Bl<#0 zQLD}jhqBH=wV#pD=h{_*KayO#%qY_?S%qbVUEDsk$wZ2hQq6FjVV;sF+Kfb)w+5%? zXE?P@Ah4!FfwY4}B5xv*XAj)8gIr9*P@LoqLo8fY&X_i@OB>U|PEDqjlJHC`R#K>7 zXd^-6oz|%0h>?tEXSi7ml!T_lDCS3SZN2(xdNS}Tm;_X1oVZGPDQ;}BRk@|_K&Pz< z%3fhOKu*)FZ#u<7zHc*JiY8|Ye`2O=qg2FRN zR?^W=F8w6Z*e0)PZ+J6K#;2?~lhuOm3vjx$6F!fa0jrN!D!(*NZ?k+D?naVh+azO) zz`S@mHA1nNDM&2TjDl?P08R>=DYY1)7R~S$#jS{z7uHPHSuT@7Bmp9|L>7yiEiXtFo7yr}D1Fw_A`&Jc7_rZ!EtlzGYby_; zDOo0Xv)Zbcw-I>#66&V-G(`;eOGYEJa}sk)$#5~5Zlj-!UsH9V5EVDt)@7VgF!RM* z6nrV$gF4F$8zVwN9I=0r#!Di!o@su@fv)}1i}a&WxiSIAxdy3$AD zn*})WgZdAIaa*ZtN6%zZnRw9+1`;tN6K~jcz6B%meRiQ9FESTC+hLK_iWk*l>Ek5! zZYa9dXC2iB_tSJH4Snu_v?NLZruNR7p9Q@Pvg9W=;ac4CbS>j47;$UT`9dkN(WXUM zOVOWXpXA^}4yjDik(45}6PG~I8whE%1N z>>1~)p?qAY1Pfqdk%7DcyqajR~!;jEHq*^SF60lMNCX6O|S_*QwK&k_aN05a$`5=n{6=Y#P z=@QLEOLZHba96cNN-$6RWXj@_dr_bRsw&t>F2qYBp*DDtkfxQ!1#JNV)`f20$1cV4 zcXL5e#{h`@r{97Gg|~t%(B-;CA%#odipQz-7SKygc5Na^S9E`5R#M6zPL;<>zU(Rt zd{gJ4mBW_KGZoDe@xIgW0Qye@*E@9lf^J)=;4)gnG?)$~oRnaoBD7{YW4Zhqsbb-% zF!VIqT;0-mj5vn9WkyI3H;P+2O=s&C|FpV=&e&>Z3=WK?US);}E}fDVUOov%MOUwJ zsIIP;l9jxJgA7K3ppy?Hmx-CO?p{ksVR;=Zq0nAR7JOxcfhTFmJ_R~*m}D~y-(oJ3 zB}J)@1B)0HN(WmPacF`g5?zwbY*}5h>sSUQAEM^6NEV|bydkv3NUA0LFS-7v+eAMT zPBF6axY^N6_uFc;026q#hbL9;@I+I&3-1PCWb0}}{RuEO;nVut+8swC>z2XRMkkot zBCztua;6nX#MHueMm1)Ij54;t0VR`~nH#Y;ZUe^0w@D&73|WxtwVeVT1kSS}7h^@a zxF&8HE6SM__h8DkDdzn?(}jwAnF4+3%r8LzVL1=I$F>feo)nccb`p|nc)-UcLCH16 zixAca-(pd2bhZMKf?Ze<>?7D?b(I)#Db{HuKFDB~g;5+LAn7W4x5EddUcXBcUcy^Y z((AZhP5c3mj#LVprrQlGEg?8b$L4fCfR+kzcM)}$wT zuEoK~kyn7;9YhOYKW5y)pgF!+2K+SLK@%*Cl9`}7kO2cmr9`MACyE%GUPhu@3R!wt z$S!}mU=D!AZ>D0614T4~bYoiRFpEd=h{U6c;f+U8HBxEKHJL^BJZdf@wExHOsBmlK zNAzKkCXcd&mhS}*s1-!{hupbv(Bkf9tRirKS1R@})iy z3o!CVLaepawb2J@BW}qu?HpIo=KSZqrO{Y%>T1@HO*-V*l#b<0ac#`MS+aEz+sg*8 zsbdeUAO<*C#qSrl76$Xp5RufByq}krp_6n&V>S7$soca8SOEaCn^Ja8iB(W^SFR@(y3pwwQnH)Xq(bhn9>mu^(3HzO3{dga$&Vfy~rOm!e#%^g@ z87%;W$#)9nW#M=@auei`5d#jpD9tSmA;3sC0@kRXiUQ6oej$krpR&Uh044YxnOmb> zE%T=^I8A59vN6J2vk?(Bt1N$?`>LBj2bk0XoZwW2vg^6%c5nq?|;&f1+8_XTE6Uu9Nj*YlzKe zS1$4H#9dQ%TxaIcyq&(597sPHW7y&Hmjg5SZJwA9Q!17wp+71grhoO`Dcbt&Wu0;F zrZWUjbV>c8`4EWGBX=_&FJSCxo%W8{9fW+E58pwvL^{lF^F^)sB0pc`=Zn&BzQ@mp zjn-r`)tWZ3lAq7Em~FCMVK5oZ9IDe9x}x}W8Ap7fxN<7OG+W%ZUNFdRHWf!fj)JT} z=LAJr9h4J0s9>Pl$^9 z<7%BrzD!uvNlZi?!_MKL{8a))1K@@VSTde|9J%G{USYG3UTmLhK<%QFBP*x#Cdfk{ za|irjW6Cu(9&-#+PKr7YQe@mhQW`~r=p;+6Brx?Bj`EAm#*W1oHbSKA0Jg|iu&58b z7Dm8UI(VstHbMYTIQk3gDmh1iIE3VP!6PYDnYc*IY*`9mCO--dkSwieirvdbut_XHEu_f#cCcCx1+PvKzrT#ed>h%s;AhD~Qsev7WkK4dR@ew3g|*IF+vrPMASB zwWEi?bVz4?0F6?)R!S!&oyau+J0y?wC~Z;8w-^h(UsOCHm2am>EHr|L=jJf{|pRT0oP!JLc*EUNkkB&N> zfARyjhQ(`tsVD!s=nqLA<3M_h9)vJH6(L)h1`;H#7QJ(rh~9zDV6;|98(}RM4N?z* z%?%*$Cr){E@-nds;suhRT~Q3}cgNYG%X9uxNfz;+e^_I?8OhUOAQmJ|7n54aB}LNB ziz!S0r9Vd3SPkcU{C_Mk*jiV1BG{_a6x>H!J0su;H){FzDuD_L@EzJ=hKnPeONBkm zGGvW~P-92oS%WkeD{TTt)wG%ms-h=gb&iJ zXC(bBy<`H|vxX|t0?<#ibJ}|;NbRu%sXc&`;*5P!eK93Q^bd zp)5L)Lu=?niM-;c8XmH6rIEZ6grt~G6fylbYs*?V<<56UoTZke^`MCLIu>x!mtH~@ z+IKR^w>2%ys5hrxWB4gvz2zjZ0!Cw5D#USvjudDZN!F#6XKMqD2J^Ty6fAltiZZrZ z25HE$|inkAAW&Xz)Lf1t$Pq9qHm-VLB+ zm-9fm!gA?+Q7alRM9a(6t8(xJ{ub8QWc*_FznLpbphXU6^s|BBTpD5!4FNU_zP} zZxTM$A#d#lWG^}B<=xm%B+Us^d%&o)R~zcCd6<}^RWd5UU$&VZvM~HF-jA^w6eZ@m5V|4{l;{N_WnHWf-UOBWk9BVLDYIoBNCigFL>Oif z+HHVu-7KJ+hn@UBhR%civw`+ZFavbumjK$Ic$ooOCzw6Zyl5w&Q9*Wk+TK`;G1Z0< zj~KFLML!1;&kM`8XEK9w)J_xSQhlLEIoeIAG~Zp>2yU>ltiF(xb^aqygog%GW)sDw z<6fp}mdZzvvXrL>L5N*Q-h>mQY}7})wbVE_;&_PXV1hcuO6=jMPvJZ$mQgsOS1h#=Mp1_iTW*=g&Faechkn)uQ8~Vl zDHY{9OvsQDrD~0)GFWMH0GxymN&ShQ!bUAbgd9r3CFBaGc~LjyRoOcFV~h^p=RV^7 z^hMGfN_s#>7>qO}EI~yB+Z(2b12Gw|AEItk{5Xxolawx_)i--T`z5F7|L4yjO~HJ6 zvjFHCL3IPbH47Z#7uwTj<(A>@cw%^N(FuQh_;Wp+bKJwTfZyl(;8YQXwP)D~gt+|M zxu9TLoT+%PLr1r<(CqfxA#V8xZ0F$PEvm!4CC0|-Kk1m`81r;%bYI-;N1 zh{|s^R!=(Qfl}*TnUg&TrO{9JAe!}{AW>r5N)dt1Mt00Nv+^wjR0&WD+VPVsfuulY zwyMk%@>7&_;)tluns4F(`4xyvYqgE#wB@9*vo(qfVH-BU@PR3iM$)lRhCF=xk>Vb? z;iwqxe0kANa^rR4mhq&NPXFThn@1R1+JV|wwVW%p+Of1j|67cui%3Tue+nTd3}X^I zPohCtB)CU$LV%+DeqtB_WOE*eZn2s8g*GN7_=~4fL zdNi%Lfw=fkdXu_pZ$PG)p)Tf(a{7bc^&RC6^Z423nCuj#f7QH6pJ@)*oFkVWYgTEF zGH*I=2pIO_0}s9Jjt%Y_@}$S4oykEJOg%ULh3+y9evjP%i#@u({n5j1H{T5rYZ$tt zg(#3kjHYBGk{)1_OU&7Lk$tw}p_-N{8R~?nfkKT6HjMBgs8i-$=LD&c5SguqVYLg4 zVcV*+Hl!*n$IjqN_#sMQmBtK&O%9Sy@qwLTNy^~fR7a&AB#5IOb&x8_?v;$l%SV(5 zTLNHuIyzvZTYAQc++N4% zrbj=G@(-CFh4O8thmmGX54z`gyYQ2oy|?An{yFqCx6~&;*l{8CLC_T%?QgShL_qxR z(wn8P&SL*0{VS(zAJ7G(bIx)hKM-}2PhNF-HZ6ZlYj)n@lRtH!O!RcsE6ty0f9u9H zJd_s3AF?RoNq0m7{ZsXb%9>uBM#N`=I0cuc-RV8Q&gFAq`sjUJ9|<|&Ys{dAMc?rG z5Avjz{@#bUd?ZN!r3xj+HiX^QqrCIKsA)>i^yQD3-1m)4A;w=iJM-tT6AUJC67j>D9{CjP@weljoZgL*?0zd-V9Pn~y=p?8j5CIWWkY{ixb}ViwjS zv-CL5#qlwdiHO6j?Ww%-198xqz3A5NAS%~siIfhOYz~TIL~^|f)X-{r%da+vXSfZO z2v-Gx6&Esmdi2+(xyj=V0kAvqJ79gRo`k8Nekn;!t+ zmQ=Pb_~ZN%l+>;bAq$KDVj*_ubKWI;GvCtMQ~(`5m~^2b4y`I&a@0-k%BHb;AErYj zvq73=;R5AixF!lAmxbMCt^m1by}MKu4hxR))h-l_r9G*LqrfmZ9%Fw*o+l}3D@)sB z%4qbk8ZZkRHz5}~lwlDUJmsPGa;JrsEmqP>F%WcDtofvV+N1n01HEe~eAWyToUDU; zz0*uZ6X5~F!{MRw&Q8rc6FxK_^ zDpJT&scv)mN3-b9Zf2A8v623KmqTycn6@cmqz5T6@9Kh@76ZU}vmgoaBmsmlh;s{# zDU~zA>&4M#*T3`-&hE;#f||>0fC&*k65$z2gy#T}2p_iy&&(O&xh7%^5nfxX0BnS( z!V+wvctSldTx-7-ii2x$gMQ=-HXs^j@EO9}uYAn_FMNcvX)kS%1(Y?>5onPUG^hX3 zD}L?6$iLi)nB@9=Bu}S0-4>)j@ypK+mu3S!9r(T8)^94p-jxK|A*BKnS%Mhm!C}-7 zVp&Gn62-m_ml)6I|JWbTs$Ro7^piv7YyB#H(uCEpN^FEgO{evtn0{SEZMkoI!+O>) zQXK<-v{AZ*i&7=!OkUv7uzHPUeZe+qkJtXs`W38`%=!5+%(Z@n22-1!BR`S@!uNdJ zy&)ci%i^>H6@m#PB!`stq){)Z!EL|#AX@Axw+~AhOr$T8Nf}w`+yxGmmfps@Bm~b- zxjm!DKh)U`{2RAn`uD%T^4g?ObKWUWT#Ykzg$J4IDR-rqf>G?CM8^mrKJ|>N5W(hD zBgVG-*|Xz>(y(-?jUd;{7NL|)&j=bsDty++=;&F{OT`?$3mqjtz*djz5|S0-)?UB9 z7L|zA$rvD0Qdn52E{28?w4K<_2-1_ydpm~UGw-t*;4hV&NzcP4ehfrQ)D)o9c>}a$ zv9fJ4bz~;Y`5hT4;}DhM6O_DGA|uz@{?%(HmMJaD1;rxT_AgO)Zj|kqaPZ{+Y3|IO zX>JokN~I<{(&7P}4esclqBgYUOUB5yeEDX}7ppHPnAo08NLS0t=X4~E#MRq4Tnq#= zw}ncHTj`!2EcNRt%NubW|vOh@!!jGSd87-*;aEDO4T(rZ?TG{6< zFa?gGCd8wc3yITM3f~TqM!VfD)$XoO{($hAMMO5B>=t|vp^o2c zHokydfZ#n5c%$Z+RnaTh%gf^naMncfY@=Bx#Qx!>&_zo@l(dxKgr!)5-O|kh?j@F@ z-Z;B22|g-_&VMiXtWauj27KH%Vp1JuYi*V{F=K$3IltV&er6TmcZE=ahS0Wp%c^L1 zpS^nI)k04bFL2y?ZsTYcQ=Ve|Dks1XweFGwY3@+D4{7qT^E2<7LK0z{HqT?d6EW>L z5)!}Oi7}+n%WL%$2&{cU`s0&$BZhUFL((MFFYx#=%HJx5b6O{La`sav(nnfZTAzX3 zRt8+6U&X3xo#}^ov%mSm0Q?bg>ILbIg(gFl9jSqjw6|k*XY9=s(^raFQt(G$xj3CQk z1Tz_ope=(Dv}Z7aRt94X2O-Fk7#zY7m?x%UYF(rdh&$MqSL}9%RBFx`OOXa?X6*@J z7UYy(MOZcmbiBYk!Uy> zW*I8u+h*oO7CJNrR_3IbbhT$rNVt=E^zF%<$<+&S5u zR+|k&^;$a)=Hc@An>@7`lE>TmAU> z@Yuxe{ri#|hIa26-nl;6-o0n|hKb~&i;}V3H}0BPw!M@js^Q7@w|#wbLfdcBHsYE7$%NsZ$@Z&m5)kXxAKZ8I*w9Vg%eE(g zG?Z+=a{s>J?a85`J^Wh|V>?#v*?s+v{bR!`_gnK7W8=>-&UuV;3jY{_*8N5%)s-pT zBRtb*kY^#+_5sF*#}DqAU;yf0o%Q_-021DtFkNG9j)!SqvVG&&*ld_s#Qq&C$A)g+ zc4&A9gT8ufH;bCspN#Js+r4j8rJ-cc(AbT`W66%8n}&Amp19SyuQKma=6jH<@H7aJ z9bDUKIfwfU?(vD8D<^h|tSk5K-^nZ${_TeaJiiOL#Rt3h?byF>eE0ao@V<%UrlGOX zWPD<1V%XL`bDQkgHMH+Wz&p5a_?DZ7cT5cL+;gkDnz5EJMsv(}GG=GneI14qT%Jp` zpc{wx4UaKAv>WLdPHx^ku`8Lld4Gbq z4BsMn+G!%3pTXbp^X}ibV_1_uz?`DzuVuVAbb^fe1)QC{>ecD1H*UKkebrXU+cmGb z^2#k&Zf^D8pY^|raak>$RM<5%p4>Dxd}#OngX0q9;o*JBP5XC`BPcsvtMAw7D_)uf zq(klOY3; z>@C0r8>~-OtVn+K- zomqU<$W?7l(OG!jF|_ZTiR60Jz^Lb*n}@GYw79)!+mj7uoMkNPzQtHtk6_Ejl6;H} z?>IO%zWdNHR36%K;Nb2tWJmm%4R^fKX)2av|DoZr8}{tKc}>1*e7l&d;CvPtkbc|F z--;Dnsi(?qFdJcL@Wm?*PS_pK&gD-Z*va(l?tMFlZ%OtaoJjWHfN?pvZ|C@WM1L3) zfh3P7$@M(ay>Cd3bN4Y17xyKulEJ2a{io{uKV=;0{6b;2&d=~-24Z~A?j6IKp7fwJ zfgY3gOKyO9t&P?J>^CCtmouL1>@{4)E4^GL>(4_J;mx=AqaloA6XVIygkSM6c+icz zmp-E7r@2a&nqvf|Y>YM|Ha;5iMrf1H0CKkG53HT`P_)~xI8>0Q;kx_3=) zZ|~aPzTW=cf!=j%d)BU6yL#=KwY_WCuI*dfzjk2ly1t&iReh`b*7WuEt?ldU>+c)r zTi4&yzp8(A|C;{Z{lk_+ z-PTd%9H-@5I!eA0V&}*qyM)j3((5Xsdp-yzrpY-r*{?@qko_p~I*S0hE z4SOdtrg5%X^2~NAy}Iepyni+KbJ;ai=X=ZTy|L9h_U{~CdHw$Vd$vvBrJ#YXW|V~9 z=kO=9*1XqAu&_8hGgxw35}lV{9-d!b5%ff>!qwrY!cWJaDgIsfeC`+Vi_vt) zL$}=e?)Us=&ud@z?z`?;eCD6c>Dqev^DnGedGU2`+V;CYI`W?PzVH2?`d456%GbXB zjeq;+Pdz>D;<@vdt?KPxf5AmtE_>6F_ww-bU;fJ1|LwP*co3^2Y0G7A z-Z^~aeINRbZ+!cS&biArZh7s_;rG1nQ#AhCH-7lk)5qe@xf{3a9Bv#w@;i@w_0jKr z|JZ-O2FV8dDR=JoHs15T7pGr!WGR_Aqt}?s*rpr=Yu(?=GI4Z3;A5Ncx@ppoZ5MH{43G<{0{2ed{fr@rIf+{)Yq zg>cS-j>hL!O;j3xw6KzEOy?S3$StjW=&AO3N0H1|yS_kN_shT_62ui82MhU>oY#YKyc+}Y88&-*@EC|&T18+PCQ{{7p2 z{F66a|G^KP)BT#?xc_6n^}vIleCW%MJeDt4PCaw|#T#Gwi3h*=t@{gSEUdr$YhRC( zm%aS#?llAJFTL#Yt6%k+YsFOCcMRV!I)2NqPQL4bPk-*=sV6T!F!q)=*WZ$hK>lzX ztX$E!{mf`p*W!3-$62}aa+kz&&TV`;zcgMNcNcrhLF1mo{T-*3ijDi$MLUWeJ*VYr z(V|>1I1q2mt&B^Bj>2GaPF(5ei`M5B7UD|b>Mi|iI@c6d6ibKCUeY++T|Bq(i7Vr? zx_)KO8HG}QbH_Oy2g?_y=jJcSmGZC52f1pLYrK0~?b2eY@rgIrHA69%C9Sw4)>jLxNye@Z#Yi<5%Iy!oad=~SWp(agc-9AgI_LJEeZ2GVl2;zS>z(mv zt~2T=RDW%I<8Mmi#eJu5YJ6~h<+UAWG~RxAb9Cp1u2b*4`nv_+J`S5e6cH0$qm@I+pbGC#oL1z zH>DxBhR@*S(@UQFs4q`Xc3I)c)3J8WJ=bOVgbUf7)o1Xxvb7z1g1etj|Dslnlu+gK zJdRHKcfSd=ow^OIy=z1+z5BPQJhh<;J+TKb*mvHg59wi{@$-wRm~!b?b-OZhm*CNC zr%DE#z1jvBH$|Jqvul0zw!IF-kw3LOdv0xL464f z{?gAqpy>r{$U@U6bsMwt97h;c4gm3K6)tARVn>N%pq+ETP<8G+vIFx^#VI{~!5Iq| zwIU}Ce%6vi7gxjIec95Nt9Z6cf9(?t6Q0xU(od)qEOY4}Tj5-O+FFI&dD!~%@lGD( zCR(ww$EBZCF<8YRM5|jZ=j9m{i@j@|lZWNfFMg8yeB$^7F8#XhUOiRVcT5%T?fTlT zFFvZ8$|w_BjhmkISLmeAEqNif@slNXr?}78Pffyj>Bm3C*b5u~VNh+Jqosf7UKhBA zn_9BOrGKavx#{bK<@Aqq6aDSSIl}X_iiO674+kP?`ZxCExd(yw&QJ5?obE?8;n7FB zbm7yO&c7%~+;g`!+-6{3?aWjb zQyVeAtjg-tM?ZRz<`ch!!tfOr52hP_<&uq?xZV8!(h~o7ujSIV m3Ab4Jf)M%UW5@F2FlQ(6+gknKSLC0i{zrYB{mWnFAow55bU4TW literal 0 HcmV?d00001 diff --git a/examples/callback.rs b/examples/callback.rs new file mode 100644 index 00000000000..732a6a1a43f --- /dev/null +++ b/examples/callback.rs @@ -0,0 +1,46 @@ +/// This example demonstrates the use of callbacks: calling functions (Host and Wasm) +/// passed to us from the Wasm via hostcall +use wasmer_runtime::{compile_with, compiler_for_backend, func, imports, Backend, Ctx}; +use wasmer_runtime_core::{structures::TypedIndex, types::TableIndex}; + +static WASM: &'static str = "examples/callback-guest.wasm"; + +/// This function matches our arbitrarily decided callback signature +/// in this example we'll only call functions that take no arguments and return one value +fn host_callback(_ctx: &mut Ctx) -> u32 { + 55 +} + +fn call_guest_fn(ctx: &mut Ctx, guest_fn: u32) -> u32 { + // We get a TableIndex from our raw value passed in + let guest_fn_typed = TableIndex::new(guest_fn as usize); + // and use it to call the corresponding function + let result = ctx.call_with_table_index(guest_fn_typed, &[]).unwrap(); + + println!("Guest fn {} returned {:?}", guest_fn, result); + + 0 +} + +fn main() { + let wasm_bytes = + std::fs::read(WASM).expect(&format!("Could not read in WASM plugin at {}", WASM)); + + let imports = imports! { + "env" => { + "call_guest_fn" => func!(call_guest_fn), + "call_guest_fn2" => func!(call_guest_fn), + "host_callback" => func!(host_callback), + }, + }; + + let compiler = compiler_for_backend(Backend::default()).unwrap(); + let module = compile_with(&wasm_bytes[..], compiler.as_ref()).unwrap(); + let instance = module + .instantiate(&imports) + .expect("failed to instantiate wasm module"); + + let entry_point = instance.func::<(u32, u32), u32>("main").unwrap(); + + entry_point.call(0, 0).expect("START"); +} diff --git a/lib/runtime-core/src/table/anyfunc.rs b/lib/runtime-core/src/table/anyfunc.rs index 8336b502882..4a63c8f6249 100644 --- a/lib/runtime-core/src/table/anyfunc.rs +++ b/lib/runtime-core/src/table/anyfunc.rs @@ -44,7 +44,7 @@ impl<'a> From> for Anyfunc<'a> { } pub struct AnyfuncTable { - pub backing: Vec, + pub(crate) backing: Vec, max: Option, } diff --git a/lib/runtime-core/src/table/mod.rs b/lib/runtime-core/src/table/mod.rs index 8fb32150157..1b61cd75438 100644 --- a/lib/runtime-core/src/table/mod.rs +++ b/lib/runtime-core/src/table/mod.rs @@ -9,7 +9,8 @@ use std::{cell::RefCell, fmt, ptr, rc::Rc}; mod anyfunc; -pub use self::anyfunc::{Anyfunc, AnyfuncTable}; +pub use self::anyfunc::Anyfunc; +pub(crate) use self::anyfunc::AnyfuncTable; use crate::error::GrowError; pub enum Element<'a> { diff --git a/lib/runtime-core/src/vm.rs b/lib/runtime-core/src/vm.rs index a4abc7b0298..e3084a9c5fa 100644 --- a/lib/runtime-core/src/vm.rs +++ b/lib/runtime-core/src/vm.rs @@ -398,14 +398,16 @@ impl Ctx { } } - /// Calls a host or Wasm function at the given index - pub fn call_with_index(&mut self, index: TableIndex, args: &[Value]) -> CallResult> { + /// Calls a host or Wasm function at the given table index + pub fn call_with_table_index( + &mut self, + index: TableIndex, + args: &[Value], + ) -> CallResult> { let anyfunc_table = unsafe { &*((**self.internal.tables).table as *mut crate::table::AnyfuncTable) }; - let entry = anyfunc_table.backing[index.index()]; + let Anyfunc { func, ctx, sig_id } = anyfunc_table.backing[index.index()]; - let fn_ptr = entry.func; - let sig_id = entry.sig_id; let signature = SigRegistry.lookup_signature(unsafe { std::mem::transmute(sig_id.0) }); let mut rets = vec![]; @@ -420,8 +422,8 @@ impl Ctx { }; call_func_with_index_inner( - self as *mut Ctx, /* doesn't handle all cases */ - NonNull::new(fn_ptr as *mut _).unwrap(), + ctx, + NonNull::new(func as *mut _).unwrap(), &signature, wasm, args, From a090bec49081bae2b79d9ce8926333d90153def7 Mon Sep 17 00:00:00 2001 From: Mark McCaskey Date: Wed, 18 Sep 2019 17:12:48 -0700 Subject: [PATCH 4/5] Add examples step in Makefile and add it to integration-tests --- Makefile | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 007e89853b0..5eb9c9aa23e 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -.PHONY: spectests emtests clean build install lint precommit docs +.PHONY: spectests emtests clean build install lint precommit docs examples # Generate files generate-spectests: @@ -111,12 +111,16 @@ test: spectests emtests middleware wasitests circleci-clean test-rest # Integration tests -integration-tests: release-clif +integration-tests: release-clif examples echo "Running Integration Tests" ./integration_tests/lua/test.sh ./integration_tests/nginx/test.sh ./integration_tests/cowsay/test.sh +examples: + cargo run --example plugin + cargo run --example callback + # Utils lint: From 3b200fa4d3e1f798583c7cdf8f0e81b24d02f686 Mon Sep 17 00:00:00 2001 From: Mark McCaskey Date: Thu, 19 Sep 2019 13:53:07 -0700 Subject: [PATCH 5/5] Move callback guest out of direct examples dir --- examples/callback-guest/README.md | 5 +++++ examples/{ => callback-guest}/callback-guest.rs | 0 examples/{ => callback-guest}/callback-guest.wasm | Bin examples/callback.rs | 2 +- 4 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 examples/callback-guest/README.md rename examples/{ => callback-guest}/callback-guest.rs (100%) rename examples/{ => callback-guest}/callback-guest.wasm (100%) diff --git a/examples/callback-guest/README.md b/examples/callback-guest/README.md new file mode 100644 index 00000000000..6439ef00dd4 --- /dev/null +++ b/examples/callback-guest/README.md @@ -0,0 +1,5 @@ +# Call back guest + +This is part of the `callback` example. This Wasm module passes host imports and its own functions to the Wasm host to execute. + +See `examples/callback.rs` for the host diff --git a/examples/callback-guest.rs b/examples/callback-guest/callback-guest.rs similarity index 100% rename from examples/callback-guest.rs rename to examples/callback-guest/callback-guest.rs diff --git a/examples/callback-guest.wasm b/examples/callback-guest/callback-guest.wasm similarity index 100% rename from examples/callback-guest.wasm rename to examples/callback-guest/callback-guest.wasm diff --git a/examples/callback.rs b/examples/callback.rs index 732a6a1a43f..e5969fec971 100644 --- a/examples/callback.rs +++ b/examples/callback.rs @@ -3,7 +3,7 @@ use wasmer_runtime::{compile_with, compiler_for_backend, func, imports, Backend, Ctx}; use wasmer_runtime_core::{structures::TypedIndex, types::TableIndex}; -static WASM: &'static str = "examples/callback-guest.wasm"; +static WASM: &'static str = "examples/callback-guest/callback-guest.wasm"; /// This function matches our arbitrarily decided callback signature /// in this example we'll only call functions that take no arguments and return one value