default values for locals

This commit is contained in:
Svyatoslav Nikolsky
2017-05-03 10:46:59 +03:00
parent 6f668911a5
commit 1498ce1ec1
2 changed files with 12 additions and 1 deletions

View File

@ -305,7 +305,7 @@ fn prepare_function_locals(function_type: &FunctionType, function_body: &FuncBod
})
.collect::<Vec<_>>().into_iter().rev()
// TODO: default values (zero), not null
.chain(function_body.locals().iter().map(|l| VariableInstance::new(true, l.value_type().into(), RuntimeValue::Null)))
.chain(function_body.locals().iter().map(|l| VariableInstance::new(true, l.value_type().into(), RuntimeValue::default(l.value_type().into()))))
.collect::<Result<Vec<_>, _>>()
}

View File

@ -111,6 +111,17 @@ pub trait Float<T>: ArithmeticOps<T> {
}
impl RuntimeValue {
/// Creates new default value of given type.
pub fn default(variable_type: VariableType) -> Self {
match variable_type {
VariableType::AnyFunc => RuntimeValue::AnyFunc(0),
VariableType::I32 => RuntimeValue::I32(0),
VariableType::I64 => RuntimeValue::I64(0),
VariableType::F32 => RuntimeValue::F32(0f32),
VariableType::F64 => RuntimeValue::F64(0f64),
}
}
/// Creates new value by interpreting passed u32 as f32.
pub fn decode_f32(val: u32) -> Self {
RuntimeValue::F32(val.transmute_into())