Fix call_indirect.

This commit is contained in:
losfair
2019-03-12 11:31:55 +08:00
parent c5ef0a96e9
commit 683cb2090c
6 changed files with 22 additions and 14 deletions

View File

@ -4,7 +4,7 @@
(elem (i32.const 10) $add)
(func $main (export "main") (result i32)
(call_indirect (type $binop) (i32.const 42) (i32.const 1) (i32.const 9))
(call_indirect (type $binop) (i32.const 42) (i32.const 1) (i32.const 10))
)
(func $add (param i32) (param i32) (result i32)
(i32.add (get_local 0) (get_local 1))

View File

@ -3141,25 +3141,24 @@ unsafe extern "C" fn call_indirect(
if elem_index >= table.count as usize {
panic!("element index out of bounds");
}
let func_index = *(table.base as *mut u32).offset(elem_index as isize) as usize;
let anyfunc = &*(table.base as *mut vm::Anyfunc).offset(elem_index as isize);
let ctx: &X64ExecutionContext =
&*CURRENT_EXECUTION_CONTEXT.with(|x| *x.borrow().last().unwrap());
println!(
"SIG INDEX = {}, FUNC INDEX = {}, ELEM INDEX = {}",
sig_index, func_index, elem_index
);
let func_index = anyfunc.func_index.unwrap();
// TODO: Fix table reading. Hardcoding func index = 1 for debugging here.
let func_index = 1usize;
/*println!(
"SIG INDEX = {}, FUNC INDEX = {:?}, ELEM INDEX = {}",
sig_index, func_index, elem_index
);*/
if ctx.signatures[SigIndex::new(sig_index)]
!= ctx.signatures[ctx.function_signatures[FuncIndex::new(func_index)]]
!= ctx.signatures[ctx.function_signatures[func_index]]
{
panic!("signature mismatch");
}
let func = ctx.function_pointers[func_index].0;
let func = ctx.function_pointers[func_index.index() as usize].0;
CALL_WASM(
stack_top,
stack_base as usize - stack_top as usize,

View File

@ -194,7 +194,7 @@ impl LocalBacking {
}
};
elements[init_base + i] = vm::Anyfunc { func, ctx, sig_id };
elements[init_base + i] = vm::Anyfunc { func, ctx, sig_id, func_index: Some(func_index) };
}
});
}
@ -232,7 +232,12 @@ impl LocalBacking {
}
};
elements[init_base + i] = vm::Anyfunc { func, ctx, sig_id };
elements[init_base + i] = vm::Anyfunc {
func,
ctx,
sig_id,
func_index: Some(func_index),
};
}
});
}

View File

@ -428,7 +428,7 @@ pub struct DynFunc<'a> {
pub(crate) signature: Arc<FuncSig>,
module: &'a ModuleInner,
pub(crate) instance_inner: &'a InstanceInner,
func_index: FuncIndex,
pub func_index: FuncIndex,
}
impl<'a> DynFunc<'a> {

View File

@ -110,6 +110,7 @@ impl AnyfuncTable {
func: ptr,
ctx: ptr::null_mut(),
sig_id,
func_index: None,
}
}
AnyfuncInner::Managed(ref func) => {
@ -120,6 +121,7 @@ impl AnyfuncTable {
func: func.raw(),
ctx: func.instance_inner.vmctx,
sig_id,
func_index: Some(func.func_index),
}
}
};

View File

@ -3,7 +3,7 @@ use crate::{
memory::Memory,
module::ModuleInner,
structures::TypedIndex,
types::{LocalOrImport, MemoryIndex},
types::{FuncIndex, LocalOrImport, MemoryIndex},
};
use std::{ffi::c_void, mem, ptr};
@ -283,6 +283,7 @@ pub struct Anyfunc {
pub func: *const Func,
pub ctx: *mut Ctx,
pub sig_id: SigId,
pub func_index: Option<FuncIndex>,
}
impl Anyfunc {
@ -291,6 +292,7 @@ impl Anyfunc {
func: ptr::null(),
ctx: ptr::null_mut(),
sig_id: SigId(u32::max_value()),
func_index: None,
}
}