From d30bdcb096774c1f56d9823fb2fbb78bf5cd3584 Mon Sep 17 00:00:00 2001 From: Jorge Aparicio Date: Sat, 9 Dec 2017 17:14:51 +0100 Subject: safe `&'static mut` references via init.resources --- macros/src/trans.rs | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) (limited to 'macros/src/trans.rs') diff --git a/macros/src/trans.rs b/macros/src/trans.rs index 1008dfe..b540fd1 100644 --- a/macros/src/trans.rs +++ b/macros/src/trans.rs @@ -249,18 +249,30 @@ fn init(app: &App, main: &mut Vec, root: &mut Vec) { let mut rexprs = vec![]; for (name, resource) in init_resources { - let _name = Ident::new(format!("_{}", name.as_ref())); - lifetime = Some(quote!('a)); - let ty = &resource.ty; - fields.push(quote! { - pub #name: &'a mut #ty, - }); + if app.init.resources.contains(name) { + fields.push(quote! { + pub #name: &'static mut #ty, + }); - rexprs.push(quote! { - #name: &mut ::#_name, - }); + let expr = &resource.expr; + rexprs.push(quote!(#name: { + static mut #name: #ty = #expr; + &mut #name + })); + } else { + let _name = Ident::new(format!("_{}", name.as_ref())); + lifetime = Some(quote!('a)); + + fields.push(quote! { + pub #name: &'a mut #ty, + }); + + rexprs.push(quote! { + #name: &mut ::#_name, + }); + } } root.push(quote! { -- cgit v1.2.3