mirror of
https://github.com/fluencelabs/wasm-bindgen
synced 2025-04-01 18:01:06 +00:00
Merge pull request #1398 from RReverser/is-like-none
Consistently expose `is_like_none`
This commit is contained in:
commit
e3aabcb27d
@ -248,8 +248,9 @@ impl<'a, 'b> Js2Rust<'a, 'b> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if optional {
|
if optional {
|
||||||
if arg.is_wasm_native() {
|
|
||||||
self.cx.expose_is_like_none();
|
self.cx.expose_is_like_none();
|
||||||
|
|
||||||
|
if arg.is_wasm_native() {
|
||||||
self.js_arguments
|
self.js_arguments
|
||||||
.push((name.clone(), "number | undefined".to_string()));
|
.push((name.clone(), "number | undefined".to_string()));
|
||||||
|
|
||||||
@ -272,7 +273,6 @@ impl<'a, 'b> Js2Rust<'a, 'b> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if arg.is_abi_as_u32() {
|
if arg.is_abi_as_u32() {
|
||||||
self.cx.expose_is_like_none();
|
|
||||||
self.js_arguments
|
self.js_arguments
|
||||||
.push((name.clone(), "number | undefined".to_string()));
|
.push((name.clone(), "number | undefined".to_string()));
|
||||||
|
|
||||||
@ -321,7 +321,6 @@ impl<'a, 'b> Js2Rust<'a, 'b> {
|
|||||||
|
|
||||||
match *arg {
|
match *arg {
|
||||||
Descriptor::Boolean => {
|
Descriptor::Boolean => {
|
||||||
self.cx.expose_is_like_none();
|
|
||||||
self.js_arguments
|
self.js_arguments
|
||||||
.push((name.clone(), "boolean | undefined".to_string()));
|
.push((name.clone(), "boolean | undefined".to_string()));
|
||||||
if self.cx.config.debug {
|
if self.cx.config.debug {
|
||||||
@ -337,42 +336,38 @@ impl<'a, 'b> Js2Rust<'a, 'b> {
|
|||||||
}
|
}
|
||||||
self.rust_arguments
|
self.rust_arguments
|
||||||
.push(format!("isLikeNone({0}) ? 0xFFFFFF : {0} ? 1 : 0", name));
|
.push(format!("isLikeNone({0}) ? 0xFFFFFF : {0} ? 1 : 0", name));
|
||||||
return Ok(self);
|
|
||||||
}
|
}
|
||||||
Descriptor::Char => {
|
Descriptor::Char => {
|
||||||
self.cx.expose_is_like_none();
|
|
||||||
self.js_arguments
|
self.js_arguments
|
||||||
.push((name.clone(), "string | undefined".to_string()));
|
.push((name.clone(), "string | undefined".to_string()));
|
||||||
self.rust_arguments
|
self.rust_arguments
|
||||||
.push(format!("isLikeNone({0}) ? 0xFFFFFF : {0}.codePointAt(0)", name));
|
.push(format!("isLikeNone({0}) ? 0xFFFFFF : {0}.codePointAt(0)", name));
|
||||||
return Ok(self);
|
|
||||||
}
|
}
|
||||||
Descriptor::Enum { hole } => {
|
Descriptor::Enum { hole } => {
|
||||||
self.cx.expose_is_like_none();
|
|
||||||
self.js_arguments
|
self.js_arguments
|
||||||
.push((name.clone(), "number | undefined".to_string()));
|
.push((name.clone(), "number | undefined".to_string()));
|
||||||
self.rust_arguments
|
self.rust_arguments
|
||||||
.push(format!("isLikeNone({0}) ? {1} : {0}", name, hole));
|
.push(format!("isLikeNone({0}) ? {1} : {0}", name, hole));
|
||||||
return Ok(self);
|
|
||||||
}
|
}
|
||||||
Descriptor::RustStruct(ref s) => {
|
Descriptor::RustStruct(ref s) => {
|
||||||
self.js_arguments
|
self.js_arguments
|
||||||
.push((name.clone(), format!("{} | undefined", s)));
|
.push((name.clone(), format!("{} | undefined", s)));
|
||||||
self.prelude(&format!("let ptr{} = 0;", i));
|
self.prelude(&format!("let ptr{} = 0;", i));
|
||||||
self.prelude(&format!("if ({0} !== null && {0} !== undefined) {{", name));
|
self.prelude(&format!("if (!isLikeNone({0})) {{", name));
|
||||||
self.assert_class(&name, s);
|
self.assert_class(&name, s);
|
||||||
self.assert_not_moved(&name);
|
self.assert_not_moved(&name);
|
||||||
self.prelude(&format!("ptr{} = {}.ptr;", i, name));
|
self.prelude(&format!("ptr{} = {}.ptr;", i, name));
|
||||||
self.prelude(&format!("{}.ptr = 0;", name));
|
self.prelude(&format!("{}.ptr = 0;", name));
|
||||||
self.prelude("}");
|
self.prelude("}");
|
||||||
self.rust_arguments.push(format!("ptr{}", i));
|
self.rust_arguments.push(format!("ptr{}", i));
|
||||||
return Ok(self);
|
|
||||||
}
|
}
|
||||||
_ => bail!(
|
_ => bail!(
|
||||||
"unsupported optional argument type for calling Rust function from JS: {:?}",
|
"unsupported optional argument type for calling Rust function from JS: {:?}",
|
||||||
arg
|
arg
|
||||||
),
|
),
|
||||||
};
|
}
|
||||||
|
|
||||||
|
return Ok(self);
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(s) = arg.rust_struct() {
|
if let Some(s) = arg.rust_struct() {
|
||||||
|
@ -389,8 +389,9 @@ impl<'a, 'b> Rust2Js<'a, 'b> {
|
|||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
if optional {
|
if optional {
|
||||||
if ty.is_wasm_native() {
|
|
||||||
self.cx.expose_is_like_none();
|
self.cx.expose_is_like_none();
|
||||||
|
|
||||||
|
if ty.is_wasm_native() {
|
||||||
self.cx.expose_uint32_memory();
|
self.cx.expose_uint32_memory();
|
||||||
match ty {
|
match ty {
|
||||||
Descriptor::I32 => self.cx.expose_int32_memory(),
|
Descriptor::I32 => self.cx.expose_int32_memory(),
|
||||||
@ -425,7 +426,6 @@ impl<'a, 'b> Rust2Js<'a, 'b> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ty.is_abi_as_u32() {
|
if ty.is_abi_as_u32() {
|
||||||
self.cx.expose_is_like_none();
|
|
||||||
self.ret_expr = "
|
self.ret_expr = "
|
||||||
const val = JS;
|
const val = JS;
|
||||||
return isLikeNone(val) ? 0xFFFFFF : val;
|
return isLikeNone(val) ? 0xFFFFFF : val;
|
||||||
@ -435,7 +435,6 @@ impl<'a, 'b> Rust2Js<'a, 'b> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if let Some(signed) = ty.get_64() {
|
if let Some(signed) = ty.get_64() {
|
||||||
self.cx.expose_is_like_none();
|
|
||||||
self.cx.expose_uint32_memory();
|
self.cx.expose_uint32_memory();
|
||||||
let f = if signed {
|
let f = if signed {
|
||||||
self.cx.expose_int64_memory();
|
self.cx.expose_int64_memory();
|
||||||
@ -458,13 +457,11 @@ impl<'a, 'b> Rust2Js<'a, 'b> {
|
|||||||
|
|
||||||
match *ty {
|
match *ty {
|
||||||
Descriptor::Boolean => {
|
Descriptor::Boolean => {
|
||||||
self.cx.expose_is_like_none();
|
|
||||||
self.ret_expr = "
|
self.ret_expr = "
|
||||||
const val = JS;
|
const val = JS;
|
||||||
return isLikeNone(val) ? 0xFFFFFF : val ? 1 : 0;
|
return isLikeNone(val) ? 0xFFFFFF : val ? 1 : 0;
|
||||||
"
|
"
|
||||||
.to_string();
|
.to_string();
|
||||||
return Ok(());
|
|
||||||
}
|
}
|
||||||
Descriptor::Char => {
|
Descriptor::Char => {
|
||||||
self.ret_expr = "
|
self.ret_expr = "
|
||||||
@ -472,10 +469,8 @@ impl<'a, 'b> Rust2Js<'a, 'b> {
|
|||||||
return isLikeNone(val) ? 0xFFFFFF : val.codePointAt(0);
|
return isLikeNone(val) ? 0xFFFFFF : val.codePointAt(0);
|
||||||
"
|
"
|
||||||
.to_string();
|
.to_string();
|
||||||
return Ok(());
|
|
||||||
}
|
}
|
||||||
Descriptor::Enum { hole } => {
|
Descriptor::Enum { hole } => {
|
||||||
self.cx.expose_is_like_none();
|
|
||||||
self.ret_expr = format!(
|
self.ret_expr = format!(
|
||||||
"
|
"
|
||||||
const val = JS;
|
const val = JS;
|
||||||
@ -483,14 +478,13 @@ impl<'a, 'b> Rust2Js<'a, 'b> {
|
|||||||
",
|
",
|
||||||
hole
|
hole
|
||||||
);
|
);
|
||||||
return Ok(());
|
|
||||||
}
|
}
|
||||||
Descriptor::RustStruct(ref class) => {
|
Descriptor::RustStruct(ref class) => {
|
||||||
// Like below, assert the type
|
// Like below, assert the type
|
||||||
self.ret_expr = format!(
|
self.ret_expr = format!(
|
||||||
"\
|
"\
|
||||||
const val = JS;
|
const val = JS;
|
||||||
if (val === undefined || val === null)
|
if (isLikeNone(val))
|
||||||
return 0;
|
return 0;
|
||||||
if (!(val instanceof {0})) {{
|
if (!(val instanceof {0})) {{
|
||||||
throw new Error('expected value of type {0}');
|
throw new Error('expected value of type {0}');
|
||||||
@ -501,13 +495,14 @@ impl<'a, 'b> Rust2Js<'a, 'b> {
|
|||||||
",
|
",
|
||||||
class
|
class
|
||||||
);
|
);
|
||||||
return Ok(());
|
|
||||||
}
|
}
|
||||||
_ => bail!(
|
_ => bail!(
|
||||||
"unsupported optional return type for calling JS function from Rust: {:?}",
|
"unsupported optional return type for calling JS function from Rust: {:?}",
|
||||||
ty
|
ty
|
||||||
),
|
),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
return Ok(());
|
||||||
}
|
}
|
||||||
if ty.is_number() {
|
if ty.is_number() {
|
||||||
self.ret_expr = "return JS;".to_string();
|
self.ret_expr = "return JS;".to_string();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user