Allow returning Result from functions

This commit adds support for exporting a function defined in Rust that returns a
`Result`, translating the `Ok` variant to the actual return value and the `Err`
variant to an exception that's thrown in JS.

The support for return types and descriptors was rejiggered a bit to be a bit
more abstract and more well suited for this purpose. We no longer distinguish
between functions with a return value and those without a return value.
Additionally a new trait, `ReturnWasmAbi`, is used for converting return values.
This trait is an internal implementation detail, however, and shouldn't surface
itself to users much (if at all).

Closes #841
This commit is contained in:
Alex Crichton
2018-09-17 18:26:45 -07:00
parent ccced83b0e
commit 7cf4213283
17 changed files with 292 additions and 266 deletions

View File

@ -34,6 +34,7 @@ tys! {
RUST_STRUCT
CHAR
OPTIONAL
UNIT
}
#[derive(Debug)]
@ -61,12 +62,13 @@ pub enum Descriptor {
RustStruct(String),
Char,
Option(Box<Descriptor>),
Unit,
}
#[derive(Debug)]
pub struct Function {
pub arguments: Vec<Descriptor>,
pub ret: Option<Descriptor>,
pub ret: Descriptor,
}
#[derive(Debug)]
@ -128,6 +130,7 @@ impl Descriptor {
Descriptor::RustStruct(name)
}
CHAR => Descriptor::Char,
UNIT => Descriptor::Unit,
other => panic!("unknown descriptor: {}", other),
}
}
@ -295,12 +298,10 @@ impl Function {
let arguments = (0..get(data))
.map(|_| Descriptor::_decode(data))
.collect::<Vec<_>>();
let ret = if get(data) == 0 {
None
} else {
Some(Descriptor::_decode(data))
};
Function { arguments, ret }
Function {
arguments,
ret: Descriptor::_decode(data),
}
}
}