diff --git a/crates/cli-support/src/js/js2rust.rs b/crates/cli-support/src/js/js2rust.rs index 9ed3a924..61a5020d 100644 --- a/crates/cli-support/src/js/js2rust.rs +++ b/crates/cli-support/src/js/js2rust.rs @@ -248,8 +248,9 @@ impl<'a, 'b> Js2Rust<'a, 'b> { } if optional { + self.cx.expose_is_like_none(); + if arg.is_wasm_native() { - self.cx.expose_is_like_none(); self.js_arguments .push((name.clone(), "number | undefined".to_string())); @@ -272,7 +273,6 @@ impl<'a, 'b> Js2Rust<'a, 'b> { } if arg.is_abi_as_u32() { - self.cx.expose_is_like_none(); self.js_arguments .push((name.clone(), "number | undefined".to_string())); @@ -321,7 +321,6 @@ impl<'a, 'b> Js2Rust<'a, 'b> { match *arg { Descriptor::Boolean => { - self.cx.expose_is_like_none(); self.js_arguments .push((name.clone(), "boolean | undefined".to_string())); if self.cx.config.debug { @@ -337,42 +336,38 @@ impl<'a, 'b> Js2Rust<'a, 'b> { } self.rust_arguments .push(format!("isLikeNone({0}) ? 0xFFFFFF : {0} ? 1 : 0", name)); - return Ok(self); } Descriptor::Char => { - self.cx.expose_is_like_none(); self.js_arguments .push((name.clone(), "string | undefined".to_string())); self.rust_arguments .push(format!("isLikeNone({0}) ? 0xFFFFFF : {0}.codePointAt(0)", name)); - return Ok(self); } Descriptor::Enum { hole } => { - self.cx.expose_is_like_none(); self.js_arguments .push((name.clone(), "number | undefined".to_string())); self.rust_arguments .push(format!("isLikeNone({0}) ? {1} : {0}", name, hole)); - return Ok(self); } Descriptor::RustStruct(ref s) => { self.js_arguments .push((name.clone(), format!("{} | undefined", s))); 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_not_moved(&name); self.prelude(&format!("ptr{} = {}.ptr;", i, name)); self.prelude(&format!("{}.ptr = 0;", name)); self.prelude("}"); self.rust_arguments.push(format!("ptr{}", i)); - return Ok(self); } _ => bail!( "unsupported optional argument type for calling Rust function from JS: {:?}", arg ), - }; + } + + return Ok(self); } if let Some(s) = arg.rust_struct() { diff --git a/crates/cli-support/src/js/rust2js.rs b/crates/cli-support/src/js/rust2js.rs index 5c663364..b5d68ddf 100644 --- a/crates/cli-support/src/js/rust2js.rs +++ b/crates/cli-support/src/js/rust2js.rs @@ -389,8 +389,9 @@ impl<'a, 'b> Rust2Js<'a, 'b> { return Ok(()); } if optional { + self.cx.expose_is_like_none(); + if ty.is_wasm_native() { - self.cx.expose_is_like_none(); self.cx.expose_uint32_memory(); match ty { Descriptor::I32 => self.cx.expose_int32_memory(), @@ -425,7 +426,6 @@ impl<'a, 'b> Rust2Js<'a, 'b> { } if ty.is_abi_as_u32() { - self.cx.expose_is_like_none(); self.ret_expr = " const val = JS; return isLikeNone(val) ? 0xFFFFFF : val; @@ -435,7 +435,6 @@ impl<'a, 'b> Rust2Js<'a, 'b> { } if let Some(signed) = ty.get_64() { - self.cx.expose_is_like_none(); self.cx.expose_uint32_memory(); let f = if signed { self.cx.expose_int64_memory(); @@ -458,13 +457,11 @@ impl<'a, 'b> Rust2Js<'a, 'b> { match *ty { Descriptor::Boolean => { - self.cx.expose_is_like_none(); self.ret_expr = " const val = JS; return isLikeNone(val) ? 0xFFFFFF : val ? 1 : 0; " .to_string(); - return Ok(()); } Descriptor::Char => { self.ret_expr = " @@ -472,10 +469,8 @@ impl<'a, 'b> Rust2Js<'a, 'b> { return isLikeNone(val) ? 0xFFFFFF : val.codePointAt(0); " .to_string(); - return Ok(()); } Descriptor::Enum { hole } => { - self.cx.expose_is_like_none(); self.ret_expr = format!( " const val = JS; @@ -483,14 +478,13 @@ impl<'a, 'b> Rust2Js<'a, 'b> { ", hole ); - return Ok(()); } Descriptor::RustStruct(ref class) => { // Like below, assert the type self.ret_expr = format!( "\ const val = JS; - if (val === undefined || val === null) + if (isLikeNone(val)) return 0; if (!(val instanceof {0})) {{ throw new Error('expected value of type {0}'); @@ -501,13 +495,14 @@ impl<'a, 'b> Rust2Js<'a, 'b> { ", class ); - return Ok(()); } _ => bail!( "unsupported optional return type for calling JS function from Rust: {:?}", ty ), }; + + return Ok(()); } if ty.is_number() { self.ret_expr = "return JS;".to_string();