Skip to content

Commit 78310f9

Browse files
authored
Merge pull request #113 from TheBlueMatt/main
Update args on supertraits of supertraits when cloning trait impls
2 parents f7105f5 + 35baacd commit 78310f9

File tree

2 files changed

+25
-16
lines changed

2 files changed

+25
-16
lines changed

c-bindings-gen/src/main.rs

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -267,8 +267,8 @@ macro_rules! walk_supertraits { ($t: expr, $types: expr, ($( $($pat: pat)|* => $
267267
} } }
268268

269269
macro_rules! get_module_type_resolver {
270-
($module: expr, $crate_libs: expr, $crate_types: expr) => { {
271-
let module: &str = &$module;
270+
($type_in_module: expr, $crate_types: expr) => { {
271+
let module: &str = &$type_in_module;
272272
let mut module_iter = module.rsplitn(2, "::");
273273
module_iter.next().unwrap();
274274
let module = module_iter.next().unwrap();
@@ -304,7 +304,7 @@ fn writeln_trait<'a, 'b, W: std::io::Write>(w: &mut W, t: &'a syn::ItemTrait, ty
304304
(s, _i, _) => {
305305
if let Some(supertrait) = types.crate_types.traits.get(s) {
306306
supertrait_name = s.to_string();
307-
supertrait_resolver = get_module_type_resolver!(supertrait_name, types.crate_libs, types.crate_types);
307+
supertrait_resolver = get_module_type_resolver!(supertrait_name, types.crate_types);
308308
gen_types.learn_associated_types(&supertrait, &supertrait_resolver);
309309
break;
310310
}
@@ -600,10 +600,10 @@ fn writeln_trait<'a, 'b, W: std::io::Write>(w: &mut W, t: &'a syn::ItemTrait, ty
600600
},
601601
(s, i, generic_args) => {
602602
if let Some(supertrait) = types.crate_types.traits.get(s) {
603-
let resolver = get_module_type_resolver!(s, types.crate_libs, types.crate_types);
603+
let resolver = get_module_type_resolver!(s, types.crate_types);
604604
macro_rules! impl_supertrait {
605605
($s: expr, $supertrait: expr, $i: expr, $generic_args: expr) => {
606-
let resolver = get_module_type_resolver!($s, types.crate_libs, types.crate_types);
606+
let resolver = get_module_type_resolver!($s, types.crate_types);
607607

608608
// Blindly assume that the same imports where `supertrait` is defined are also
609609
// imported here. This will almost certainly break at some point, but it should be
@@ -971,7 +971,7 @@ fn writeln_impl<W: std::io::Write>(w: &mut W, w_uses: &mut HashSet<String, NonRa
971971
(s, _i, _) => {
972972
if let Some(supertrait) = types.crate_types.traits.get(s) {
973973
supertrait_name = s.to_string();
974-
supertrait_resolver = get_module_type_resolver!(supertrait_name, types.crate_libs, types.crate_types);
974+
supertrait_resolver = get_module_type_resolver!(supertrait_name, types.crate_types);
975975
gen_types.learn_associated_types(&supertrait, &supertrait_resolver);
976976
break;
977977
}
@@ -982,7 +982,7 @@ fn writeln_impl<W: std::io::Write>(w: &mut W, w_uses: &mut HashSet<String, NonRa
982982
// mappings from a trai defined in a different file, we may mis-resolve or
983983
// fail to resolve the mapped types. Thus, we have to construct a new
984984
// resolver for the module that the trait was defined in here first.
985-
let mut trait_resolver = get_module_type_resolver!(full_trait_path, types.crate_libs, types.crate_types);
985+
let mut trait_resolver = get_module_type_resolver!(full_trait_path, types.crate_types);
986986
gen_types.learn_associated_types(trait_obj, &trait_resolver);
987987
let mut impl_associated_types = HashMap::new();
988988
for item in i.items.iter() {
@@ -1115,7 +1115,7 @@ fn writeln_impl<W: std::io::Write>(w: &mut W, w_uses: &mut HashSet<String, NonRa
11151115
}
11161116
write_impl_fields!(s, supertrait_obj, t, "\t", types);
11171117

1118-
let resolver = get_module_type_resolver!(s, types.crate_libs, types.crate_types);
1118+
let resolver = get_module_type_resolver!(s, types.crate_types);
11191119
walk_supertraits!(supertrait_obj, Some(&resolver), (
11201120
(s, t, _) => {
11211121
if let Some(supertrait_obj) = types.crate_types.traits.get(s) {
@@ -1254,15 +1254,22 @@ fn writeln_impl<W: std::io::Write>(w: &mut W, w_uses: &mut HashSet<String, NonRa
12541254
writeln!(w, "extern \"C\" fn {}_{}_cloned(new_obj: &mut crate::{}) {{", trait_obj.ident, ident, full_trait_path).unwrap();
12551255
writeln!(w, "\tnew_obj.this_arg = {}_clone_void(new_obj.this_arg);", ident).unwrap();
12561256
writeln!(w, "\tnew_obj.free = Some({}_free_void);", ident).unwrap();
1257-
walk_supertraits!(trait_obj, Some(&types), (
1258-
(s, t, _) => {
1259-
if types.crate_types.traits.get(s).is_some() {
1260-
assert!(!types.is_clonable(s)); // We don't currently support cloning with a clonable supertrait
1261-
writeln!(w, "\tnew_obj.{}.this_arg = new_obj.this_arg;", t).unwrap();
1262-
writeln!(w, "\tnew_obj.{}.free = None;", t).unwrap();
1257+
1258+
fn seek_supertraits<W: std::io::Write>(w: &mut W, pfx: &str, tr: &syn::ItemTrait, types: &TypeResolver) {
1259+
walk_supertraits!(tr, Some(types), (
1260+
(s, t, _) => {
1261+
if types.crate_types.traits.get(s).is_some() {
1262+
assert!(!types.is_clonable(s)); // We don't currently support cloning with a clonable supertrait
1263+
writeln!(w, "\tnew_obj.{}{}.this_arg = new_obj.this_arg;", pfx, t).unwrap();
1264+
writeln!(w, "\tnew_obj.{}{}.free = None;", pfx, t).unwrap();
1265+
let tr = types.crate_types.traits.get(s).unwrap();
1266+
let resolver = get_module_type_resolver!(s, types.crate_types);
1267+
seek_supertraits(w, &format!("{}.", t), tr, &resolver);
1268+
}
12631269
}
1264-
}
1265-
) );
1270+
) );
1271+
}
1272+
seek_supertraits(w, "", trait_obj, types);
12661273
writeln!(w, "}}").unwrap();
12671274
}
12681275
write!(w, "\n").unwrap();

lightning-c-bindings/src/lightning/sign.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2188,6 +2188,8 @@ extern "C" fn WriteableEcdsaChannelSigner_InMemorySigner_cloned(new_obj: &mut cr
21882188
new_obj.free = Some(InMemorySigner_free_void);
21892189
new_obj.EcdsaChannelSigner.this_arg = new_obj.this_arg;
21902190
new_obj.EcdsaChannelSigner.free = None;
2191+
new_obj.EcdsaChannelSigner.ChannelSigner.this_arg = new_obj.this_arg;
2192+
new_obj.EcdsaChannelSigner.ChannelSigner.free = None;
21912193
}
21922194

21932195
#[no_mangle]

0 commit comments

Comments
 (0)