diff --git a/crates/backend/src/ast.rs b/crates/backend/src/ast.rs index 8d1ac66c..9da6ed61 100644 --- a/crates/backend/src/ast.rs +++ b/crates/backend/src/ast.rs @@ -2,6 +2,7 @@ use proc_macro2::{Ident, Span, TokenStream, TokenTree}; use quote::ToTokens; use shared; use syn; +use syn::AttrStyle; #[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq))] #[derive(Default)] diff --git a/crates/cli-support/src/js/js2rust.rs b/crates/cli-support/src/js/js2rust.rs index c0d45787..00c24fdf 100644 --- a/crates/cli-support/src/js/js2rust.rs +++ b/crates/cli-support/src/js/js2rust.rs @@ -68,6 +68,9 @@ impl<'a, 'b> Js2Rust<'a, 'b> { /// passed should be `this.ptr`. pub fn method(&mut self, method: bool) -> &mut Self { if method { + self.prelude("if (this.ptr === 0) { + throw new Error('Attempt to use a moved value'); + }"); self.rust_arguments.insert(0, "this.ptr".to_string()); } self @@ -149,6 +152,9 @@ impl<'a, 'b> Js2Rust<'a, 'b> { } else { self.prelude(&format!("\ const ptr{i} = {arg}.ptr;\n\ + if (ptr{i} === 0) {{ + throw new Error('Attempt to use a moved value'); + }} {arg}.ptr = 0;\n\ ", i = i, arg = name)); self.rust_arguments.push(format!("ptr{}", i)); @@ -361,4 +367,4 @@ impl<'a, 'b> Js2Rust<'a, 'b> { let ts = format!("{} {}({}): {};\n", prefix, self.js_name, ts_args, self.ret_ty); (js, ts) } -} +} \ No newline at end of file