Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
ecf736a
strip binaries in genbindings.sh for better size comparison
TheBlueMatt Nov 26, 2020
70440a5
[bindings] Use consistent imports for MessageSendEvents traits
TheBlueMatt Jan 1, 2021
086434f
[bindings] Replace associated_types HashMaps with common Generics
TheBlueMatt Nov 25, 2020
3f5a287
[bindings] Un-special-case returning an associated type
TheBlueMatt Nov 25, 2020
af3ad4b
[bindings] Pass GenericTypes through to write_template_generic
TheBlueMatt Nov 25, 2020
4edf514
[bindings] Always resolve supertrait types during supertrait walks
TheBlueMatt Nov 25, 2020
dcfd95a
[bindings] Handle MessageSendEventsProvider impl blocks in a util fn
TheBlueMatt Nov 25, 2020
c6d2697
[bindings] Add support for mapping Write as a supertrait
TheBlueMatt Nov 25, 2020
bec92d3
[bindings] Expose secp256k1::Message as ThirtyTwoBytes
TheBlueMatt Jan 4, 2021
b2bf57e
[bindings] Don't export new functions with unexportable types
TheBlueMatt Jan 4, 2021
ce56152
[bindings] Figure out in-file structs and enums before processing
TheBlueMatt Jan 4, 2021
78c2c48
[bindings] Support exposing `bitcoin::OutPoint`s as our common type
TheBlueMatt Jan 4, 2021
734c0a6
[bindings] Separate take_ptr and take_inner
TheBlueMatt Nov 25, 2020
554af1e
[bindings] Be explicit with take_ptr calls
TheBlueMatt Nov 25, 2020
1479016
[bindings] Drop useless `#[no_mangle]` from `pub type` definitions
TheBlueMatt Dec 30, 2020
b243c65
[bindings] Allow unused fns that the bindings can call but don't
TheBlueMatt Jan 4, 2021
30a42f4
Update auto-generated bindings, including bumping cbindgen version
TheBlueMatt Feb 2, 2021
93e562f
[bindings] Update C++ demo for new NetGraphMsgHandler::new() params
TheBlueMatt Jan 1, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 12 additions & 37 deletions c-bindings-gen/src/blocks.rs
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
//! Printing logic for basic blocks of Rust-mapped code - parts of functions and declarations but
//! not the full mapping logic.

use std::collections::HashMap;
use std::fs::File;
use std::io::Write;
use proc_macro2::{TokenTree, Span};
Expand DownExpand Up@@ -77,7 +76,7 @@ pub fn writeln_docs<W: std::io::Write>(w: &mut W, attrs: &[syn::Attribute], pref
///
/// this_param is used when returning Self or accepting a self parameter, and should be the
/// concrete, mapped type.
pub fn write_method_params<W: std::io::Write>(w: &mut W, sig: &syn::Signature, associated_types: &HashMap<&syn::Ident, &syn::Ident>, this_param: &str, types: &mut TypeResolver, generics: Option<&GenericTypes>, self_ptr: bool, fn_decl: bool) {
pub fn write_method_params<W: std::io::Write>(w: &mut W, sig: &syn::Signature, this_param: &str, types: &mut TypeResolver, generics: Option<&GenericTypes>, self_ptr: bool, fn_decl: bool) {
if sig.constness.is_some() || sig.asyncness.is_some() || sig.unsafety.is_some() ||
sig.abi.is_some() || sig.variadic.is_some() {
unimplemented!();
Expand DownExpand Up@@ -140,26 +139,16 @@ pub fn write_method_params<W: std::io::Write>(w: &mut W, sig: &syn::Signature, a
syn::ReturnType::Type(_, rtype) => {
write!(w, " -> ").unwrap();
if let Some(mut remaining_path) = first_seg_self(&*rtype) {
if let Some(associated_seg) = get_single_remaining_path_seg(&mut remaining_path) {
// We're returning an associated type in a trait impl. Its probably a safe bet
// that its also a trait, so just return the trait type.
let real_type = associated_types.get(associated_seg).unwrap();
types.write_c_type(w, &syn::Type::Path(syn::TypePath { qself: None,
path: syn::PathSegment {
ident: (*real_type).clone(),
arguments: syn::PathArguments::None
}.into()
}), generics, true);
} else {
if remaining_path.next().is_none() {
write!(w, "{}", this_param).unwrap();
return;
}
}
if let syn::Type::Reference(r) = &**rtype {
// We can't return a reference, cause we allocate things on the stack.
types.write_c_type(w, &*r.elem, generics, true);
} else {
if let syn::Type::Reference(r) = &**rtype {
// We can't return a reference, cause we allocate things on the stack.
types.write_c_type(w, &*r.elem, generics, true);
} else {
types.write_c_type(w, &*rtype, generics, true);
}
types.write_c_type(w, &*rtype, generics, true);
}
},
_ => {},
Expand DownExpand Up@@ -222,7 +211,7 @@ pub fn write_method_var_decl_body<W: std::io::Write>(w: &mut W, sig: &syn::Signa
///
/// The return value is expected to be bound to a variable named `ret` which is available after a
/// method-call-ending semicolon.
pub fn write_method_call_params<W: std::io::Write>(w: &mut W, sig: &syn::Signature, associated_types: &HashMap<&syn::Ident, &syn::Ident>, extra_indent: &str, types: &TypeResolver, generics: Option<&GenericTypes>, this_type: &str, to_c: bool) {
pub fn write_method_call_params<W: std::io::Write>(w: &mut W, sig: &syn::Signature, extra_indent: &str, types: &TypeResolver, generics: Option<&GenericTypes>, this_type: &str, to_c: bool) {
let mut first_arg = true;
let mut num_unused = 0;
for inp in sig.inputs.iter() {
Expand DownExpand Up@@ -285,26 +274,12 @@ pub fn write_method_call_params<W: std::io::Write>(w: &mut W, sig: &syn::Signatu
syn::ReturnType::Type(_, rtype) => {
write!(w, ";\n\t{}", extra_indent).unwrap();

let self_segs_iter = first_seg_self(&*rtype);
if to_c && first_seg_self(&*rtype).is_some() {
// Assume rather blindly that we're returning an associated trait from a C fn call to a Rust trait object.
write!(w, "ret").unwrap();
} else if !to_c && first_seg_self(&*rtype).is_some() {
if let Some(mut remaining_path) = first_seg_self(&*rtype) {
if let Some(associated_seg) = get_single_remaining_path_seg(&mut remaining_path) {
let real_type = associated_types.get(associated_seg).unwrap();
if let Some(t) = types.crate_types.traits.get(&types.maybe_resolve_ident(&real_type).unwrap()) {
// We're returning an associated trait from a Rust fn call to a C trait
// object.
writeln!(w, "let mut rust_obj = {} {{ inner: Box::into_raw(Box::new(ret)), is_owned: true }};", this_type).unwrap();
writeln!(w, "\t{}let mut ret = {}_as_{}(&rust_obj);", extra_indent, this_type, t.ident).unwrap();
writeln!(w, "\t{}// We want to free rust_obj when ret gets drop()'d, not rust_obj, so wipe rust_obj's pointer and set ret's free() fn", extra_indent).unwrap();
writeln!(w, "\t{}rust_obj.inner = std::ptr::null_mut();", extra_indent).unwrap();
writeln!(w, "\t{}ret.free = Some({}_free_void);", extra_indent, this_type).unwrap();
writeln!(w, "\t{}ret", extra_indent).unwrap();
return;
}
}
}
} else if !to_c && self_segs_iter.is_some() && self_segs_iter.unwrap().next().is_none() {
// If we're returning "Self" (and not "Self::X"), just do it manually
write!(w, "{} {{ inner: Box::into_raw(Box::new(ret)), is_owned: true }}", this_type).unwrap();
} else if to_c {
let new_var = types.write_from_c_conversion_new_var(w, &syn::Ident::new("ret", Span::call_site()), rtype, generics);
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Handle `read_chan_signer` in bindings (761 bindings updates) by TheBlueMatt · Pull Request #767 · lightningdevkit/rust-lightning · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
ecf736a
strip binaries in genbindings.sh for better size comparison
TheBlueMatt Nov 26, 2020
70440a5
[bindings] Use consistent imports for MessageSendEvents traits
TheBlueMatt Jan 1, 2021
086434f
[bindings] Replace associated_types HashMaps with common Generics
TheBlueMatt Nov 25, 2020
3f5a287
[bindings] Un-special-case returning an associated type
TheBlueMatt Nov 25, 2020
af3ad4b
[bindings] Pass GenericTypes through to write_template_generic
TheBlueMatt Nov 25, 2020
4edf514
[bindings] Always resolve supertrait types during supertrait walks
TheBlueMatt Nov 25, 2020
dcfd95a
[bindings] Handle MessageSendEventsProvider impl blocks in a util fn
TheBlueMatt Nov 25, 2020
c6d2697
[bindings] Add support for mapping Write as a supertrait
TheBlueMatt Nov 25, 2020
bec92d3
[bindings] Expose secp256k1::Message as ThirtyTwoBytes
TheBlueMatt Jan 4, 2021
b2bf57e
[bindings] Don't export new functions with unexportable types
TheBlueMatt Jan 4, 2021
ce56152
[bindings] Figure out in-file structs and enums before processing
TheBlueMatt Jan 4, 2021
78c2c48
[bindings] Support exposing `bitcoin::OutPoint`s as our common type
TheBlueMatt Jan 4, 2021
734c0a6
[bindings] Separate take_ptr and take_inner
TheBlueMatt Nov 25, 2020
554af1e
[bindings] Be explicit with take_ptr calls
TheBlueMatt Nov 25, 2020
1479016
[bindings] Drop useless `#[no_mangle]` from `pub type` definitions
TheBlueMatt Dec 30, 2020
b243c65
[bindings] Allow unused fns that the bindings can call but don't
TheBlueMatt Jan 4, 2021
30a42f4
Update auto-generated bindings, including bumping cbindgen version
TheBlueMatt Feb 2, 2021
93e562f
[bindings] Update C++ demo for new NetGraphMsgHandler::new() params
TheBlueMatt Jan 1, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 12 additions & 37 deletions c-bindings-gen/src/blocks.rs
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
//! Printing logic for basic blocks of Rust-mapped code - parts of functions and declarations but
//! not the full mapping logic.

use std::collections::HashMap;
use std::fs::File;
use std::io::Write;
use proc_macro2::{TokenTree, Span};
Expand DownExpand Up@@ -77,7 +76,7 @@ pub fn writeln_docs<W: std::io::Write>(w: &mut W, attrs: &[syn::Attribute], pref
///
/// this_param is used when returning Self or accepting a self parameter, and should be the
/// concrete, mapped type.
pub fn write_method_params<W: std::io::Write>(w: &mut W, sig: &syn::Signature, associated_types: &HashMap<&syn::Ident, &syn::Ident>, this_param: &str, types: &mut TypeResolver, generics: Option<&GenericTypes>, self_ptr: bool, fn_decl: bool) {
pub fn write_method_params<W: std::io::Write>(w: &mut W, sig: &syn::Signature, this_param: &str, types: &mut TypeResolver, generics: Option<&GenericTypes>, self_ptr: bool, fn_decl: bool) {
if sig.constness.is_some() || sig.asyncness.is_some() || sig.unsafety.is_some() ||
sig.abi.is_some() || sig.variadic.is_some() {
unimplemented!();
Expand DownExpand Up@@ -140,26 +139,16 @@ pub fn write_method_params<W: std::io::Write>(w: &mut W, sig: &syn::Signature, a
syn::ReturnType::Type(_, rtype) => {
write!(w, " -> ").unwrap();
if let Some(mut remaining_path) = first_seg_self(&*rtype) {
if let Some(associated_seg) = get_single_remaining_path_seg(&mut remaining_path) {
// We're returning an associated type in a trait impl. Its probably a safe bet
// that its also a trait, so just return the trait type.
let real_type = associated_types.get(associated_seg).unwrap();
types.write_c_type(w, &syn::Type::Path(syn::TypePath { qself: None,
path: syn::PathSegment {
ident: (*real_type).clone(),
arguments: syn::PathArguments::None
}.into()
}), generics, true);
} else {
if remaining_path.next().is_none() {
write!(w, "{}", this_param).unwrap();
return;
}
}
if let syn::Type::Reference(r) = &**rtype {
// We can't return a reference, cause we allocate things on the stack.
types.write_c_type(w, &*r.elem, generics, true);
} else {
if let syn::Type::Reference(r) = &**rtype {
// We can't return a reference, cause we allocate things on the stack.
types.write_c_type(w, &*r.elem, generics, true);
} else {
types.write_c_type(w, &*rtype, generics, true);
}
types.write_c_type(w, &*rtype, generics, true);
}
},
_ => {},
Expand DownExpand Up@@ -222,7 +211,7 @@ pub fn write_method_var_decl_body<W: std::io::Write>(w: &mut W, sig: &syn::Signa
///
/// The return value is expected to be bound to a variable named `ret` which is available after a
/// method-call-ending semicolon.
pub fn write_method_call_params<W: std::io::Write>(w: &mut W, sig: &syn::Signature, associated_types: &HashMap<&syn::Ident, &syn::Ident>, extra_indent: &str, types: &TypeResolver, generics: Option<&GenericTypes>, this_type: &str, to_c: bool) {
pub fn write_method_call_params<W: std::io::Write>(w: &mut W, sig: &syn::Signature, extra_indent: &str, types: &TypeResolver, generics: Option<&GenericTypes>, this_type: &str, to_c: bool) {
let mut first_arg = true;
let mut num_unused = 0;
for inp in sig.inputs.iter() {
Expand DownExpand Up@@ -285,26 +274,12 @@ pub fn write_method_call_params<W: std::io::Write>(w: &mut W, sig: &syn::Signatu
syn::ReturnType::Type(_, rtype) => {
write!(w, ";\n\t{}", extra_indent).unwrap();

let self_segs_iter = first_seg_self(&*rtype);
if to_c && first_seg_self(&*rtype).is_some() {
// Assume rather blindly that we're returning an associated trait from a C fn call to a Rust trait object.
write!(w, "ret").unwrap();
} else if !to_c && first_seg_self(&*rtype).is_some() {
if let Some(mut remaining_path) = first_seg_self(&*rtype) {
if let Some(associated_seg) = get_single_remaining_path_seg(&mut remaining_path) {
let real_type = associated_types.get(associated_seg).unwrap();
if let Some(t) = types.crate_types.traits.get(&types.maybe_resolve_ident(&real_type).unwrap()) {
// We're returning an associated trait from a Rust fn call to a C trait
// object.
writeln!(w, "let mut rust_obj = {} {{ inner: Box::into_raw(Box::new(ret)), is_owned: true }};", this_type).unwrap();
writeln!(w, "\t{}let mut ret = {}_as_{}(&rust_obj);", extra_indent, this_type, t.ident).unwrap();
writeln!(w, "\t{}// We want to free rust_obj when ret gets drop()'d, not rust_obj, so wipe rust_obj's pointer and set ret's free() fn", extra_indent).unwrap();
writeln!(w, "\t{}rust_obj.inner = std::ptr::null_mut();", extra_indent).unwrap();
writeln!(w, "\t{}ret.free = Some({}_free_void);", extra_indent, this_type).unwrap();
writeln!(w, "\t{}ret", extra_indent).unwrap();
return;
}
}
}
} else if !to_c && self_segs_iter.is_some() && self_segs_iter.unwrap().next().is_none() {
// If we're returning "Self" (and not "Self::X"), just do it manually
write!(w, "{} {{ inner: Box::into_raw(Box::new(ret)), is_owned: true }}", this_type).unwrap();
} else if to_c {
let new_var = types.write_from_c_conversion_new_var(w, &syn::Ident::new("ret", Span::call_site()), rtype, generics);
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Handle `read_chan_signer` in bindings (761 bindings updates) by TheBlueMatt · Pull Request #767 · lightningdevkit/rust-lightning · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
ecf736a
strip binaries in genbindings.sh for better size comparison
TheBlueMatt Nov 26, 2020
70440a5
[bindings] Use consistent imports for MessageSendEvents traits
TheBlueMatt Jan 1, 2021
086434f
[bindings] Replace associated_types HashMaps with common Generics
TheBlueMatt Nov 25, 2020
3f5a287
[bindings] Un-special-case returning an associated type
TheBlueMatt Nov 25, 2020
af3ad4b
[bindings] Pass GenericTypes through to write_template_generic
TheBlueMatt Nov 25, 2020
4edf514
[bindings] Always resolve supertrait types during supertrait walks
TheBlueMatt Nov 25, 2020
dcfd95a
[bindings] Handle MessageSendEventsProvider impl blocks in a util fn
TheBlueMatt Nov 25, 2020
c6d2697
[bindings] Add support for mapping Write as a supertrait
TheBlueMatt Nov 25, 2020
bec92d3
[bindings] Expose secp256k1::Message as ThirtyTwoBytes
TheBlueMatt Jan 4, 2021
b2bf57e
[bindings] Don't export new functions with unexportable types
TheBlueMatt Jan 4, 2021
ce56152
[bindings] Figure out in-file structs and enums before processing
TheBlueMatt Jan 4, 2021
78c2c48
[bindings] Support exposing `bitcoin::OutPoint`s as our common type
TheBlueMatt Jan 4, 2021
734c0a6
[bindings] Separate take_ptr and take_inner
TheBlueMatt Nov 25, 2020
554af1e
[bindings] Be explicit with take_ptr calls
TheBlueMatt Nov 25, 2020
1479016
[bindings] Drop useless `#[no_mangle]` from `pub type` definitions
TheBlueMatt Dec 30, 2020
b243c65
[bindings] Allow unused fns that the bindings can call but don't
TheBlueMatt Jan 4, 2021
30a42f4
Update auto-generated bindings, including bumping cbindgen version
TheBlueMatt Feb 2, 2021
93e562f
[bindings] Update C++ demo for new NetGraphMsgHandler::new() params
TheBlueMatt Jan 1, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 12 additions & 37 deletions c-bindings-gen/src/blocks.rs
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
//! Printing logic for basic blocks of Rust-mapped code - parts of functions and declarations but
//! not the full mapping logic.

use std::collections::HashMap;
use std::fs::File;
use std::io::Write;
use proc_macro2::{TokenTree, Span};
Expand DownExpand Up@@ -77,7 +76,7 @@ pub fn writeln_docs<W: std::io::Write>(w: &mut W, attrs: &[syn::Attribute], pref
///
/// this_param is used when returning Self or accepting a self parameter, and should be the
/// concrete, mapped type.
pub fn write_method_params<W: std::io::Write>(w: &mut W, sig: &syn::Signature, associated_types: &HashMap<&syn::Ident, &syn::Ident>, this_param: &str, types: &mut TypeResolver, generics: Option<&GenericTypes>, self_ptr: bool, fn_decl: bool) {
pub fn write_method_params<W: std::io::Write>(w: &mut W, sig: &syn::Signature, this_param: &str, types: &mut TypeResolver, generics: Option<&GenericTypes>, self_ptr: bool, fn_decl: bool) {
if sig.constness.is_some() || sig.asyncness.is_some() || sig.unsafety.is_some() ||
sig.abi.is_some() || sig.variadic.is_some() {
unimplemented!();
Expand DownExpand Up@@ -140,26 +139,16 @@ pub fn write_method_params<W: std::io::Write>(w: &mut W, sig: &syn::Signature, a
syn::ReturnType::Type(_, rtype) => {
write!(w, " -> ").unwrap();
if let Some(mut remaining_path) = first_seg_self(&*rtype) {
if let Some(associated_seg) = get_single_remaining_path_seg(&mut remaining_path) {
// We're returning an associated type in a trait impl. Its probably a safe bet
// that its also a trait, so just return the trait type.
let real_type = associated_types.get(associated_seg).unwrap();
types.write_c_type(w, &syn::Type::Path(syn::TypePath { qself: None,
path: syn::PathSegment {
ident: (*real_type).clone(),
arguments: syn::PathArguments::None
}.into()
}), generics, true);
} else {
if remaining_path.next().is_none() {
write!(w, "{}", this_param).unwrap();
return;
}
}
if let syn::Type::Reference(r) = &**rtype {
// We can't return a reference, cause we allocate things on the stack.
types.write_c_type(w, &*r.elem, generics, true);
} else {
if let syn::Type::Reference(r) = &**rtype {
// We can't return a reference, cause we allocate things on the stack.
types.write_c_type(w, &*r.elem, generics, true);
} else {
types.write_c_type(w, &*rtype, generics, true);
}
types.write_c_type(w, &*rtype, generics, true);
}
},
_ => {},
Expand DownExpand Up@@ -222,7 +211,7 @@ pub fn write_method_var_decl_body<W: std::io::Write>(w: &mut W, sig: &syn::Signa
///
/// The return value is expected to be bound to a variable named `ret` which is available after a
/// method-call-ending semicolon.
pub fn write_method_call_params<W: std::io::Write>(w: &mut W, sig: &syn::Signature, associated_types: &HashMap<&syn::Ident, &syn::Ident>, extra_indent: &str, types: &TypeResolver, generics: Option<&GenericTypes>, this_type: &str, to_c: bool) {
pub fn write_method_call_params<W: std::io::Write>(w: &mut W, sig: &syn::Signature, extra_indent: &str, types: &TypeResolver, generics: Option<&GenericTypes>, this_type: &str, to_c: bool) {
let mut first_arg = true;
let mut num_unused = 0;
for inp in sig.inputs.iter() {
Expand DownExpand Up@@ -285,26 +274,12 @@ pub fn write_method_call_params<W: std::io::Write>(w: &mut W, sig: &syn::Signatu
syn::ReturnType::Type(_, rtype) => {
write!(w, ";\n\t{}", extra_indent).unwrap();

let self_segs_iter = first_seg_self(&*rtype);
if to_c && first_seg_self(&*rtype).is_some() {
// Assume rather blindly that we're returning an associated trait from a C fn call to a Rust trait object.
write!(w, "ret").unwrap();
} else if !to_c && first_seg_self(&*rtype).is_some() {
if let Some(mut remaining_path) = first_seg_self(&*rtype) {
if let Some(associated_seg) = get_single_remaining_path_seg(&mut remaining_path) {
let real_type = associated_types.get(associated_seg).unwrap();
if let Some(t) = types.crate_types.traits.get(&types.maybe_resolve_ident(&real_type).unwrap()) {
// We're returning an associated trait from a Rust fn call to a C trait
// object.
writeln!(w, "let mut rust_obj = {} {{ inner: Box::into_raw(Box::new(ret)), is_owned: true }};", this_type).unwrap();
writeln!(w, "\t{}let mut ret = {}_as_{}(&rust_obj);", extra_indent, this_type, t.ident).unwrap();
writeln!(w, "\t{}// We want to free rust_obj when ret gets drop()'d, not rust_obj, so wipe rust_obj's pointer and set ret's free() fn", extra_indent).unwrap();
writeln!(w, "\t{}rust_obj.inner = std::ptr::null_mut();", extra_indent).unwrap();
writeln!(w, "\t{}ret.free = Some({}_free_void);", extra_indent, this_type).unwrap();
writeln!(w, "\t{}ret", extra_indent).unwrap();
return;
}
}
}
} else if !to_c && self_segs_iter.is_some() && self_segs_iter.unwrap().next().is_none() {
// If we're returning "Self" (and not "Self::X"), just do it manually
write!(w, "{} {{ inner: Box::into_raw(Box::new(ret)), is_owned: true }}", this_type).unwrap();
} else if to_c {
let new_var = types.write_from_c_conversion_new_var(w, &syn::Ident::new("ret", Span::call_site()), rtype, generics);
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Handle `read_chan_signer` in bindings (761 bindings updates) by TheBlueMatt · Pull Request #767 · lightningdevkit/rust-lightning · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
ecf736a
strip binaries in genbindings.sh for better size comparison
TheBlueMatt Nov 26, 2020
70440a5
[bindings] Use consistent imports for MessageSendEvents traits
TheBlueMatt Jan 1, 2021
086434f
[bindings] Replace associated_types HashMaps with common Generics
TheBlueMatt Nov 25, 2020
3f5a287
[bindings] Un-special-case returning an associated type
TheBlueMatt Nov 25, 2020
af3ad4b
[bindings] Pass GenericTypes through to write_template_generic
TheBlueMatt Nov 25, 2020
4edf514
[bindings] Always resolve supertrait types during supertrait walks
TheBlueMatt Nov 25, 2020
dcfd95a
[bindings] Handle MessageSendEventsProvider impl blocks in a util fn
TheBlueMatt Nov 25, 2020
c6d2697
[bindings] Add support for mapping Write as a supertrait
TheBlueMatt Nov 25, 2020
bec92d3
[bindings] Expose secp256k1::Message as ThirtyTwoBytes
TheBlueMatt Jan 4, 2021
b2bf57e
[bindings] Don't export new functions with unexportable types
TheBlueMatt Jan 4, 2021
ce56152
[bindings] Figure out in-file structs and enums before processing
TheBlueMatt Jan 4, 2021
78c2c48
[bindings] Support exposing `bitcoin::OutPoint`s as our common type
TheBlueMatt Jan 4, 2021
734c0a6
[bindings] Separate take_ptr and take_inner
TheBlueMatt Nov 25, 2020
554af1e
[bindings] Be explicit with take_ptr calls
TheBlueMatt Nov 25, 2020
1479016
[bindings] Drop useless `#[no_mangle]` from `pub type` definitions
TheBlueMatt Dec 30, 2020
b243c65
[bindings] Allow unused fns that the bindings can call but don't
TheBlueMatt Jan 4, 2021
30a42f4
Update auto-generated bindings, including bumping cbindgen version
TheBlueMatt Feb 2, 2021
93e562f
[bindings] Update C++ demo for new NetGraphMsgHandler::new() params
TheBlueMatt Jan 1, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 12 additions & 37 deletions c-bindings-gen/src/blocks.rs
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
//! Printing logic for basic blocks of Rust-mapped code - parts of functions and declarations but
//! not the full mapping logic.

use std::collections::HashMap;
use std::fs::File;
use std::io::Write;
use proc_macro2::{TokenTree, Span};
Expand DownExpand Up@@ -77,7 +76,7 @@ pub fn writeln_docs<W: std::io::Write>(w: &mut W, attrs: &[syn::Attribute], pref
///
/// this_param is used when returning Self or accepting a self parameter, and should be the
/// concrete, mapped type.
pub fn write_method_params<W: std::io::Write>(w: &mut W, sig: &syn::Signature, associated_types: &HashMap<&syn::Ident, &syn::Ident>, this_param: &str, types: &mut TypeResolver, generics: Option<&GenericTypes>, self_ptr: bool, fn_decl: bool) {
pub fn write_method_params<W: std::io::Write>(w: &mut W, sig: &syn::Signature, this_param: &str, types: &mut TypeResolver, generics: Option<&GenericTypes>, self_ptr: bool, fn_decl: bool) {
if sig.constness.is_some() || sig.asyncness.is_some() || sig.unsafety.is_some() ||
sig.abi.is_some() || sig.variadic.is_some() {
unimplemented!();
Expand DownExpand Up@@ -140,26 +139,16 @@ pub fn write_method_params<W: std::io::Write>(w: &mut W, sig: &syn::Signature, a
syn::ReturnType::Type(_, rtype) => {
write!(w, " -> ").unwrap();
if let Some(mut remaining_path) = first_seg_self(&*rtype) {
if let Some(associated_seg) = get_single_remaining_path_seg(&mut remaining_path) {
// We're returning an associated type in a trait impl. Its probably a safe bet
// that its also a trait, so just return the trait type.
let real_type = associated_types.get(associated_seg).unwrap();
types.write_c_type(w, &syn::Type::Path(syn::TypePath { qself: None,
path: syn::PathSegment {
ident: (*real_type).clone(),
arguments: syn::PathArguments::None
}.into()
}), generics, true);
} else {
if remaining_path.next().is_none() {
write!(w, "{}", this_param).unwrap();
return;
}
}
if let syn::Type::Reference(r) = &**rtype {
// We can't return a reference, cause we allocate things on the stack.
types.write_c_type(w, &*r.elem, generics, true);
} else {
if let syn::Type::Reference(r) = &**rtype {
// We can't return a reference, cause we allocate things on the stack.
types.write_c_type(w, &*r.elem, generics, true);
} else {
types.write_c_type(w, &*rtype, generics, true);
}
types.write_c_type(w, &*rtype, generics, true);
}
},
_ => {},
Expand DownExpand Up@@ -222,7 +211,7 @@ pub fn write_method_var_decl_body<W: std::io::Write>(w: &mut W, sig: &syn::Signa
///
/// The return value is expected to be bound to a variable named `ret` which is available after a
/// method-call-ending semicolon.
pub fn write_method_call_params<W: std::io::Write>(w: &mut W, sig: &syn::Signature, associated_types: &HashMap<&syn::Ident, &syn::Ident>, extra_indent: &str, types: &TypeResolver, generics: Option<&GenericTypes>, this_type: &str, to_c: bool) {
pub fn write_method_call_params<W: std::io::Write>(w: &mut W, sig: &syn::Signature, extra_indent: &str, types: &TypeResolver, generics: Option<&GenericTypes>, this_type: &str, to_c: bool) {
let mut first_arg = true;
let mut num_unused = 0;
for inp in sig.inputs.iter() {
Expand DownExpand Up@@ -285,26 +274,12 @@ pub fn write_method_call_params<W: std::io::Write>(w: &mut W, sig: &syn::Signatu
syn::ReturnType::Type(_, rtype) => {
write!(w, ";\n\t{}", extra_indent).unwrap();

let self_segs_iter = first_seg_self(&*rtype);
if to_c && first_seg_self(&*rtype).is_some() {
// Assume rather blindly that we're returning an associated trait from a C fn call to a Rust trait object.
write!(w, "ret").unwrap();
} else if !to_c && first_seg_self(&*rtype).is_some() {
if let Some(mut remaining_path) = first_seg_self(&*rtype) {
if let Some(associated_seg) = get_single_remaining_path_seg(&mut remaining_path) {
let real_type = associated_types.get(associated_seg).unwrap();
if let Some(t) = types.crate_types.traits.get(&types.maybe_resolve_ident(&real_type).unwrap()) {
// We're returning an associated trait from a Rust fn call to a C trait
// object.
writeln!(w, "let mut rust_obj = {} {{ inner: Box::into_raw(Box::new(ret)), is_owned: true }};", this_type).unwrap();
writeln!(w, "\t{}let mut ret = {}_as_{}(&rust_obj);", extra_indent, this_type, t.ident).unwrap();
writeln!(w, "\t{}// We want to free rust_obj when ret gets drop()'d, not rust_obj, so wipe rust_obj's pointer and set ret's free() fn", extra_indent).unwrap();
writeln!(w, "\t{}rust_obj.inner = std::ptr::null_mut();", extra_indent).unwrap();
writeln!(w, "\t{}ret.free = Some({}_free_void);", extra_indent, this_type).unwrap();
writeln!(w, "\t{}ret", extra_indent).unwrap();
return;
}
}
}
} else if !to_c && self_segs_iter.is_some() && self_segs_iter.unwrap().next().is_none() {
// If we're returning "Self" (and not "Self::X"), just do it manually
write!(w, "{} {{ inner: Box::into_raw(Box::new(ret)), is_owned: true }}", this_type).unwrap();
} else if to_c {
let new_var = types.write_from_c_conversion_new_var(w, &syn::Ident::new("ret", Span::call_site()), rtype, generics);
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' Handle `read_chan_signer` in bindings (761 bindings updates) by TheBlueMatt · Pull Request #767 · lightningdevkit/rust-lightning · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
ecf736a
strip binaries in genbindings.sh for better size comparison
TheBlueMatt Nov 26, 2020
70440a5
[bindings] Use consistent imports for MessageSendEvents traits
TheBlueMatt Jan 1, 2021
086434f
[bindings] Replace associated_types HashMaps with common Generics
TheBlueMatt Nov 25, 2020
3f5a287
[bindings] Un-special-case returning an associated type
TheBlueMatt Nov 25, 2020
af3ad4b
[bindings] Pass GenericTypes through to write_template_generic
TheBlueMatt Nov 25, 2020
4edf514
[bindings] Always resolve supertrait types during supertrait walks
TheBlueMatt Nov 25, 2020
dcfd95a
[bindings] Handle MessageSendEventsProvider impl blocks in a util fn
TheBlueMatt Nov 25, 2020
c6d2697
[bindings] Add support for mapping Write as a supertrait
TheBlueMatt Nov 25, 2020
bec92d3
[bindings] Expose secp256k1::Message as ThirtyTwoBytes
TheBlueMatt Jan 4, 2021
b2bf57e
[bindings] Don't export new functions with unexportable types
TheBlueMatt Jan 4, 2021
ce56152
[bindings] Figure out in-file structs and enums before processing
TheBlueMatt Jan 4, 2021
78c2c48
[bindings] Support exposing `bitcoin::OutPoint`s as our common type
TheBlueMatt Jan 4, 2021
734c0a6
[bindings] Separate take_ptr and take_inner
TheBlueMatt Nov 25, 2020
554af1e
[bindings] Be explicit with take_ptr calls
TheBlueMatt Nov 25, 2020
1479016
[bindings] Drop useless `#[no_mangle]` from `pub type` definitions
TheBlueMatt Dec 30, 2020
b243c65
[bindings] Allow unused fns that the bindings can call but don't
TheBlueMatt Jan 4, 2021
30a42f4
Update auto-generated bindings, including bumping cbindgen version
TheBlueMatt Feb 2, 2021
93e562f
[bindings] Update C++ demo for new NetGraphMsgHandler::new() params
TheBlueMatt Jan 1, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 12 additions & 37 deletions c-bindings-gen/src/blocks.rs
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
//! Printing logic for basic blocks of Rust-mapped code - parts of functions and declarations but
//! not the full mapping logic.

use std::collections::HashMap;
use std::fs::File;
use std::io::Write;
use proc_macro2::{TokenTree, Span};
Expand DownExpand Up@@ -77,7 +76,7 @@ pub fn writeln_docs<W: std::io::Write>(w: &mut W, attrs: &[syn::Attribute], pref
///
/// this_param is used when returning Self or accepting a self parameter, and should be the
/// concrete, mapped type.
pub fn write_method_params<W: std::io::Write>(w: &mut W, sig: &syn::Signature, associated_types: &HashMap<&syn::Ident, &syn::Ident>, this_param: &str, types: &mut TypeResolver, generics: Option<&GenericTypes>, self_ptr: bool, fn_decl: bool) {
pub fn write_method_params<W: std::io::Write>(w: &mut W, sig: &syn::Signature, this_param: &str, types: &mut TypeResolver, generics: Option<&GenericTypes>, self_ptr: bool, fn_decl: bool) {
if sig.constness.is_some() || sig.asyncness.is_some() || sig.unsafety.is_some() ||
sig.abi.is_some() || sig.variadic.is_some() {
unimplemented!();
Expand DownExpand Up@@ -140,26 +139,16 @@ pub fn write_method_params<W: std::io::Write>(w: &mut W, sig: &syn::Signature, a
syn::ReturnType::Type(_, rtype) => {
write!(w, " -> ").unwrap();
if let Some(mut remaining_path) = first_seg_self(&*rtype) {
if let Some(associated_seg) = get_single_remaining_path_seg(&mut remaining_path) {
// We're returning an associated type in a trait impl. Its probably a safe bet
// that its also a trait, so just return the trait type.
let real_type = associated_types.get(associated_seg).unwrap();
types.write_c_type(w, &syn::Type::Path(syn::TypePath { qself: None,
path: syn::PathSegment {
ident: (*real_type).clone(),
arguments: syn::PathArguments::None
}.into()
}), generics, true);
} else {
if remaining_path.next().is_none() {
write!(w, "{}", this_param).unwrap();
return;
}
}
if let syn::Type::Reference(r) = &**rtype {
// We can't return a reference, cause we allocate things on the stack.
types.write_c_type(w, &*r.elem, generics, true);
} else {
if let syn::Type::Reference(r) = &**rtype {
// We can't return a reference, cause we allocate things on the stack.
types.write_c_type(w, &*r.elem, generics, true);
} else {
types.write_c_type(w, &*rtype, generics, true);
}
types.write_c_type(w, &*rtype, generics, true);
}
},
_ => {},
Expand DownExpand Up@@ -222,7 +211,7 @@ pub fn write_method_var_decl_body<W: std::io::Write>(w: &mut W, sig: &syn::Signa
///
/// The return value is expected to be bound to a variable named `ret` which is available after a
/// method-call-ending semicolon.
pub fn write_method_call_params<W: std::io::Write>(w: &mut W, sig: &syn::Signature, associated_types: &HashMap<&syn::Ident, &syn::Ident>, extra_indent: &str, types: &TypeResolver, generics: Option<&GenericTypes>, this_type: &str, to_c: bool) {
pub fn write_method_call_params<W: std::io::Write>(w: &mut W, sig: &syn::Signature, extra_indent: &str, types: &TypeResolver, generics: Option<&GenericTypes>, this_type: &str, to_c: bool) {
let mut first_arg = true;
let mut num_unused = 0;
for inp in sig.inputs.iter() {
Expand DownExpand Up@@ -285,26 +274,12 @@ pub fn write_method_call_params<W: std::io::Write>(w: &mut W, sig: &syn::Signatu
syn::ReturnType::Type(_, rtype) => {
write!(w, ";\n\t{}", extra_indent).unwrap();

let self_segs_iter = first_seg_self(&*rtype);
if to_c && first_seg_self(&*rtype).is_some() {
// Assume rather blindly that we're returning an associated trait from a C fn call to a Rust trait object.
write!(w, "ret").unwrap();
} else if !to_c && first_seg_self(&*rtype).is_some() {
if let Some(mut remaining_path) = first_seg_self(&*rtype) {
if let Some(associated_seg) = get_single_remaining_path_seg(&mut remaining_path) {
let real_type = associated_types.get(associated_seg).unwrap();
if let Some(t) = types.crate_types.traits.get(&types.maybe_resolve_ident(&real_type).unwrap()) {
// We're returning an associated trait from a Rust fn call to a C trait
// object.
writeln!(w, "let mut rust_obj = {} {{ inner: Box::into_raw(Box::new(ret)), is_owned: true }};", this_type).unwrap();
writeln!(w, "\t{}let mut ret = {}_as_{}(&rust_obj);", extra_indent, this_type, t.ident).unwrap();
writeln!(w, "\t{}// We want to free rust_obj when ret gets drop()'d, not rust_obj, so wipe rust_obj's pointer and set ret's free() fn", extra_indent).unwrap();
writeln!(w, "\t{}rust_obj.inner = std::ptr::null_mut();", extra_indent).unwrap();
writeln!(w, "\t{}ret.free = Some({}_free_void);", extra_indent, this_type).unwrap();
writeln!(w, "\t{}ret", extra_indent).unwrap();
return;
}
}
}
} else if !to_c && self_segs_iter.is_some() && self_segs_iter.unwrap().next().is_none() {
// If we're returning "Self" (and not "Self::X"), just do it manually
write!(w, "{} {{ inner: Box::into_raw(Box::new(ret)), is_owned: true }}", this_type).unwrap();
} else if to_c {
let new_var = types.write_from_c_conversion_new_var(w, &syn::Ident::new("ret", Span::call_site()), rtype, generics);
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Handle `read_chan_signer` in bindings (761 bindings updates) by TheBlueMatt · Pull Request #767 · lightningdevkit/rust-lightning · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
ecf736a
strip binaries in genbindings.sh for better size comparison
TheBlueMatt Nov 26, 2020
70440a5
[bindings] Use consistent imports for MessageSendEvents traits
TheBlueMatt Jan 1, 2021
086434f
[bindings] Replace associated_types HashMaps with common Generics
TheBlueMatt Nov 25, 2020
3f5a287
[bindings] Un-special-case returning an associated type
TheBlueMatt Nov 25, 2020
af3ad4b
[bindings] Pass GenericTypes through to write_template_generic
TheBlueMatt Nov 25, 2020
4edf514
[bindings] Always resolve supertrait types during supertrait walks
TheBlueMatt Nov 25, 2020
dcfd95a
[bindings] Handle MessageSendEventsProvider impl blocks in a util fn
TheBlueMatt Nov 25, 2020
c6d2697
[bindings] Add support for mapping Write as a supertrait
TheBlueMatt Nov 25, 2020
bec92d3
[bindings] Expose secp256k1::Message as ThirtyTwoBytes
TheBlueMatt Jan 4, 2021
b2bf57e
[bindings] Don't export new functions with unexportable types
TheBlueMatt Jan 4, 2021
ce56152
[bindings] Figure out in-file structs and enums before processing
TheBlueMatt Jan 4, 2021
78c2c48
[bindings] Support exposing `bitcoin::OutPoint`s as our common type
TheBlueMatt Jan 4, 2021
734c0a6
[bindings] Separate take_ptr and take_inner
TheBlueMatt Nov 25, 2020
554af1e
[bindings] Be explicit with take_ptr calls
TheBlueMatt Nov 25, 2020
1479016
[bindings] Drop useless `#[no_mangle]` from `pub type` definitions
TheBlueMatt Dec 30, 2020
b243c65
[bindings] Allow unused fns that the bindings can call but don't
TheBlueMatt Jan 4, 2021
30a42f4
Update auto-generated bindings, including bumping cbindgen version
TheBlueMatt Feb 2, 2021
93e562f
[bindings] Update C++ demo for new NetGraphMsgHandler::new() params
TheBlueMatt Jan 1, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 12 additions & 37 deletions c-bindings-gen/src/blocks.rs
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
//! Printing logic for basic blocks of Rust-mapped code - parts of functions and declarations but
//! not the full mapping logic.

use std::collections::HashMap;
use std::fs::File;
use std::io::Write;
use proc_macro2::{TokenTree, Span};
Expand DownExpand Up@@ -77,7 +76,7 @@ pub fn writeln_docs<W: std::io::Write>(w: &mut W, attrs: &[syn::Attribute], pref
///
/// this_param is used when returning Self or accepting a self parameter, and should be the
/// concrete, mapped type.
pub fn write_method_params<W: std::io::Write>(w: &mut W, sig: &syn::Signature, associated_types: &HashMap<&syn::Ident, &syn::Ident>, this_param: &str, types: &mut TypeResolver, generics: Option<&GenericTypes>, self_ptr: bool, fn_decl: bool) {
pub fn write_method_params<W: std::io::Write>(w: &mut W, sig: &syn::Signature, this_param: &str, types: &mut TypeResolver, generics: Option<&GenericTypes>, self_ptr: bool, fn_decl: bool) {
if sig.constness.is_some() || sig.asyncness.is_some() || sig.unsafety.is_some() ||
sig.abi.is_some() || sig.variadic.is_some() {
unimplemented!();
Expand DownExpand Up@@ -140,26 +139,16 @@ pub fn write_method_params<W: std::io::Write>(w: &mut W, sig: &syn::Signature, a
syn::ReturnType::Type(_, rtype) => {
write!(w, " -> ").unwrap();
if let Some(mut remaining_path) = first_seg_self(&*rtype) {
if let Some(associated_seg) = get_single_remaining_path_seg(&mut remaining_path) {
// We're returning an associated type in a trait impl. Its probably a safe bet
// that its also a trait, so just return the trait type.
let real_type = associated_types.get(associated_seg).unwrap();
types.write_c_type(w, &syn::Type::Path(syn::TypePath { qself: None,
path: syn::PathSegment {
ident: (*real_type).clone(),
arguments: syn::PathArguments::None
}.into()
}), generics, true);
} else {
if remaining_path.next().is_none() {
write!(w, "{}", this_param).unwrap();
return;
}
}
if let syn::Type::Reference(r) = &**rtype {
// We can't return a reference, cause we allocate things on the stack.
types.write_c_type(w, &*r.elem, generics, true);
} else {
if let syn::Type::Reference(r) = &**rtype {
// We can't return a reference, cause we allocate things on the stack.
types.write_c_type(w, &*r.elem, generics, true);
} else {
types.write_c_type(w, &*rtype, generics, true);
}
types.write_c_type(w, &*rtype, generics, true);
}
},
_ => {},
Expand DownExpand Up@@ -222,7 +211,7 @@ pub fn write_method_var_decl_body<W: std::io::Write>(w: &mut W, sig: &syn::Signa
///
/// The return value is expected to be bound to a variable named `ret` which is available after a
/// method-call-ending semicolon.
pub fn write_method_call_params<W: std::io::Write>(w: &mut W, sig: &syn::Signature, associated_types: &HashMap<&syn::Ident, &syn::Ident>, extra_indent: &str, types: &TypeResolver, generics: Option<&GenericTypes>, this_type: &str, to_c: bool) {
pub fn write_method_call_params<W: std::io::Write>(w: &mut W, sig: &syn::Signature, extra_indent: &str, types: &TypeResolver, generics: Option<&GenericTypes>, this_type: &str, to_c: bool) {
let mut first_arg = true;
let mut num_unused = 0;
for inp in sig.inputs.iter() {
Expand DownExpand Up@@ -285,26 +274,12 @@ pub fn write_method_call_params<W: std::io::Write>(w: &mut W, sig: &syn::Signatu
syn::ReturnType::Type(_, rtype) => {
write!(w, ";\n\t{}", extra_indent).unwrap();

let self_segs_iter = first_seg_self(&*rtype);
if to_c && first_seg_self(&*rtype).is_some() {
// Assume rather blindly that we're returning an associated trait from a C fn call to a Rust trait object.
write!(w, "ret").unwrap();
} else if !to_c && first_seg_self(&*rtype).is_some() {
if let Some(mut remaining_path) = first_seg_self(&*rtype) {
if let Some(associated_seg) = get_single_remaining_path_seg(&mut remaining_path) {
let real_type = associated_types.get(associated_seg).unwrap();
if let Some(t) = types.crate_types.traits.get(&types.maybe_resolve_ident(&real_type).unwrap()) {
// We're returning an associated trait from a Rust fn call to a C trait
// object.
writeln!(w, "let mut rust_obj = {} {{ inner: Box::into_raw(Box::new(ret)), is_owned: true }};", this_type).unwrap();
writeln!(w, "\t{}let mut ret = {}_as_{}(&rust_obj);", extra_indent, this_type, t.ident).unwrap();
writeln!(w, "\t{}// We want to free rust_obj when ret gets drop()'d, not rust_obj, so wipe rust_obj's pointer and set ret's free() fn", extra_indent).unwrap();
writeln!(w, "\t{}rust_obj.inner = std::ptr::null_mut();", extra_indent).unwrap();
writeln!(w, "\t{}ret.free = Some({}_free_void);", extra_indent, this_type).unwrap();
writeln!(w, "\t{}ret", extra_indent).unwrap();
return;
}
}
}
} else if !to_c && self_segs_iter.is_some() && self_segs_iter.unwrap().next().is_none() {
// If we're returning "Self" (and not "Self::X"), just do it manually
write!(w, "{} {{ inner: Box::into_raw(Box::new(ret)), is_owned: true }}", this_type).unwrap();
} else if to_c {
let new_var = types.write_from_c_conversion_new_var(w, &syn::Ident::new("ret", Span::call_site()), rtype, generics);
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Handle `read_chan_signer` in bindings (761 bindings updates) by TheBlueMatt · Pull Request #767 · lightningdevkit/rust-lightning · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
ecf736a
strip binaries in genbindings.sh for better size comparison
TheBlueMatt Nov 26, 2020
70440a5
[bindings] Use consistent imports for MessageSendEvents traits
TheBlueMatt Jan 1, 2021
086434f
[bindings] Replace associated_types HashMaps with common Generics
TheBlueMatt Nov 25, 2020
3f5a287
[bindings] Un-special-case returning an associated type
TheBlueMatt Nov 25, 2020
af3ad4b
[bindings] Pass GenericTypes through to write_template_generic
TheBlueMatt Nov 25, 2020
4edf514
[bindings] Always resolve supertrait types during supertrait walks
TheBlueMatt Nov 25, 2020
dcfd95a
[bindings] Handle MessageSendEventsProvider impl blocks in a util fn
TheBlueMatt Nov 25, 2020
c6d2697
[bindings] Add support for mapping Write as a supertrait
TheBlueMatt Nov 25, 2020
bec92d3
[bindings] Expose secp256k1::Message as ThirtyTwoBytes
TheBlueMatt Jan 4, 2021
b2bf57e
[bindings] Don't export new functions with unexportable types
TheBlueMatt Jan 4, 2021
ce56152
[bindings] Figure out in-file structs and enums before processing
TheBlueMatt Jan 4, 2021
78c2c48
[bindings] Support exposing `bitcoin::OutPoint`s as our common type
TheBlueMatt Jan 4, 2021
734c0a6
[bindings] Separate take_ptr and take_inner
TheBlueMatt Nov 25, 2020
554af1e
[bindings] Be explicit with take_ptr calls
TheBlueMatt Nov 25, 2020
1479016
[bindings] Drop useless `#[no_mangle]` from `pub type` definitions
TheBlueMatt Dec 30, 2020
b243c65
[bindings] Allow unused fns that the bindings can call but don't
TheBlueMatt Jan 4, 2021
30a42f4
Update auto-generated bindings, including bumping cbindgen version
TheBlueMatt Feb 2, 2021
93e562f
[bindings] Update C++ demo for new NetGraphMsgHandler::new() params
TheBlueMatt Jan 1, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 12 additions & 37 deletions c-bindings-gen/src/blocks.rs
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
//! Printing logic for basic blocks of Rust-mapped code - parts of functions and declarations but
//! not the full mapping logic.

use std::collections::HashMap;
use std::fs::File;
use std::io::Write;
use proc_macro2::{TokenTree, Span};
Expand DownExpand Up@@ -77,7 +76,7 @@ pub fn writeln_docs<W: std::io::Write>(w: &mut W, attrs: &[syn::Attribute], pref
///
/// this_param is used when returning Self or accepting a self parameter, and should be the
/// concrete, mapped type.
pub fn write_method_params<W: std::io::Write>(w: &mut W, sig: &syn::Signature, associated_types: &HashMap<&syn::Ident, &syn::Ident>, this_param: &str, types: &mut TypeResolver, generics: Option<&GenericTypes>, self_ptr: bool, fn_decl: bool) {
pub fn write_method_params<W: std::io::Write>(w: &mut W, sig: &syn::Signature, this_param: &str, types: &mut TypeResolver, generics: Option<&GenericTypes>, self_ptr: bool, fn_decl: bool) {
if sig.constness.is_some() || sig.asyncness.is_some() || sig.unsafety.is_some() ||
sig.abi.is_some() || sig.variadic.is_some() {
unimplemented!();
Expand DownExpand Up@@ -140,26 +139,16 @@ pub fn write_method_params<W: std::io::Write>(w: &mut W, sig: &syn::Signature, a
syn::ReturnType::Type(_, rtype) => {
write!(w, " -> ").unwrap();
if let Some(mut remaining_path) = first_seg_self(&*rtype) {
if let Some(associated_seg) = get_single_remaining_path_seg(&mut remaining_path) {
// We're returning an associated type in a trait impl. Its probably a safe bet
// that its also a trait, so just return the trait type.
let real_type = associated_types.get(associated_seg).unwrap();
types.write_c_type(w, &syn::Type::Path(syn::TypePath { qself: None,
path: syn::PathSegment {
ident: (*real_type).clone(),
arguments: syn::PathArguments::None
}.into()
}), generics, true);
} else {
if remaining_path.next().is_none() {
write!(w, "{}", this_param).unwrap();
return;
}
}
if let syn::Type::Reference(r) = &**rtype {
// We can't return a reference, cause we allocate things on the stack.
types.write_c_type(w, &*r.elem, generics, true);
} else {
if let syn::Type::Reference(r) = &**rtype {
// We can't return a reference, cause we allocate things on the stack.
types.write_c_type(w, &*r.elem, generics, true);
} else {
types.write_c_type(w, &*rtype, generics, true);
}
types.write_c_type(w, &*rtype, generics, true);
}
},
_ => {},
Expand DownExpand Up@@ -222,7 +211,7 @@ pub fn write_method_var_decl_body<W: std::io::Write>(w: &mut W, sig: &syn::Signa
///
/// The return value is expected to be bound to a variable named `ret` which is available after a
/// method-call-ending semicolon.
pub fn write_method_call_params<W: std::io::Write>(w: &mut W, sig: &syn::Signature, associated_types: &HashMap<&syn::Ident, &syn::Ident>, extra_indent: &str, types: &TypeResolver, generics: Option<&GenericTypes>, this_type: &str, to_c: bool) {
pub fn write_method_call_params<W: std::io::Write>(w: &mut W, sig: &syn::Signature, extra_indent: &str, types: &TypeResolver, generics: Option<&GenericTypes>, this_type: &str, to_c: bool) {
let mut first_arg = true;
let mut num_unused = 0;
for inp in sig.inputs.iter() {
Expand DownExpand Up@@ -285,26 +274,12 @@ pub fn write_method_call_params<W: std::io::Write>(w: &mut W, sig: &syn::Signatu
syn::ReturnType::Type(_, rtype) => {
write!(w, ";\n\t{}", extra_indent).unwrap();

let self_segs_iter = first_seg_self(&*rtype);
if to_c && first_seg_self(&*rtype).is_some() {
// Assume rather blindly that we're returning an associated trait from a C fn call to a Rust trait object.
write!(w, "ret").unwrap();
} else if !to_c && first_seg_self(&*rtype).is_some() {
if let Some(mut remaining_path) = first_seg_self(&*rtype) {
if let Some(associated_seg) = get_single_remaining_path_seg(&mut remaining_path) {
let real_type = associated_types.get(associated_seg).unwrap();
if let Some(t) = types.crate_types.traits.get(&types.maybe_resolve_ident(&real_type).unwrap()) {
// We're returning an associated trait from a Rust fn call to a C trait
// object.
writeln!(w, "let mut rust_obj = {} {{ inner: Box::into_raw(Box::new(ret)), is_owned: true }};", this_type).unwrap();
writeln!(w, "\t{}let mut ret = {}_as_{}(&rust_obj);", extra_indent, this_type, t.ident).unwrap();
writeln!(w, "\t{}// We want to free rust_obj when ret gets drop()'d, not rust_obj, so wipe rust_obj's pointer and set ret's free() fn", extra_indent).unwrap();
writeln!(w, "\t{}rust_obj.inner = std::ptr::null_mut();", extra_indent).unwrap();
writeln!(w, "\t{}ret.free = Some({}_free_void);", extra_indent, this_type).unwrap();
writeln!(w, "\t{}ret", extra_indent).unwrap();
return;
}
}
}
} else if !to_c && self_segs_iter.is_some() && self_segs_iter.unwrap().next().is_none() {
// If we're returning "Self" (and not "Self::X"), just do it manually
write!(w, "{} {{ inner: Box::into_raw(Box::new(ret)), is_owned: true }}", this_type).unwrap();
} else if to_c {
let new_var = types.write_from_c_conversion_new_var(w, &syn::Ident::new("ret", Span::call_site()), rtype, generics);
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); Handle `read_chan_signer` in bindings (761 bindings updates) by TheBlueMatt · Pull Request #767 · lightningdevkit/rust-lightning · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
ecf736a
strip binaries in genbindings.sh for better size comparison
TheBlueMatt Nov 26, 2020
70440a5
[bindings] Use consistent imports for MessageSendEvents traits
TheBlueMatt Jan 1, 2021
086434f
[bindings] Replace associated_types HashMaps with common Generics
TheBlueMatt Nov 25, 2020
3f5a287
[bindings] Un-special-case returning an associated type
TheBlueMatt Nov 25, 2020
af3ad4b
[bindings] Pass GenericTypes through to write_template_generic
TheBlueMatt Nov 25, 2020
4edf514
[bindings] Always resolve supertrait types during supertrait walks
TheBlueMatt Nov 25, 2020
dcfd95a
[bindings] Handle MessageSendEventsProvider impl blocks in a util fn
TheBlueMatt Nov 25, 2020
c6d2697
[bindings] Add support for mapping Write as a supertrait
TheBlueMatt Nov 25, 2020
bec92d3
[bindings] Expose secp256k1::Message as ThirtyTwoBytes
TheBlueMatt Jan 4, 2021
b2bf57e
[bindings] Don't export new functions with unexportable types
TheBlueMatt Jan 4, 2021
ce56152
[bindings] Figure out in-file structs and enums before processing
TheBlueMatt Jan 4, 2021
78c2c48
[bindings] Support exposing `bitcoin::OutPoint`s as our common type
TheBlueMatt Jan 4, 2021
734c0a6
[bindings] Separate take_ptr and take_inner
TheBlueMatt Nov 25, 2020
554af1e
[bindings] Be explicit with take_ptr calls
TheBlueMatt Nov 25, 2020
1479016
[bindings] Drop useless `#[no_mangle]` from `pub type` definitions
TheBlueMatt Dec 30, 2020
b243c65
[bindings] Allow unused fns that the bindings can call but don't
TheBlueMatt Jan 4, 2021
30a42f4
Update auto-generated bindings, including bumping cbindgen version
TheBlueMatt Feb 2, 2021
93e562f
[bindings] Update C++ demo for new NetGraphMsgHandler::new() params
TheBlueMatt Jan 1, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 12 additions & 37 deletions c-bindings-gen/src/blocks.rs
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
//! Printing logic for basic blocks of Rust-mapped code - parts of functions and declarations but
//! not the full mapping logic.

use std::collections::HashMap;
use std::fs::File;
use std::io::Write;
use proc_macro2::{TokenTree, Span};
Expand DownExpand Up@@ -77,7 +76,7 @@ pub fn writeln_docs<W: std::io::Write>(w: &mut W, attrs: &[syn::Attribute], pref
///
/// this_param is used when returning Self or accepting a self parameter, and should be the
/// concrete, mapped type.
pub fn write_method_params<W: std::io::Write>(w: &mut W, sig: &syn::Signature, associated_types: &HashMap<&syn::Ident, &syn::Ident>, this_param: &str, types: &mut TypeResolver, generics: Option<&GenericTypes>, self_ptr: bool, fn_decl: bool) {
pub fn write_method_params<W: std::io::Write>(w: &mut W, sig: &syn::Signature, this_param: &str, types: &mut TypeResolver, generics: Option<&GenericTypes>, self_ptr: bool, fn_decl: bool) {
if sig.constness.is_some() || sig.asyncness.is_some() || sig.unsafety.is_some() ||
sig.abi.is_some() || sig.variadic.is_some() {
unimplemented!();
Expand DownExpand Up@@ -140,26 +139,16 @@ pub fn write_method_params<W: std::io::Write>(w: &mut W, sig: &syn::Signature, a
syn::ReturnType::Type(_, rtype) => {
write!(w, " -> ").unwrap();
if let Some(mut remaining_path) = first_seg_self(&*rtype) {
if let Some(associated_seg) = get_single_remaining_path_seg(&mut remaining_path) {
// We're returning an associated type in a trait impl. Its probably a safe bet
// that its also a trait, so just return the trait type.
let real_type = associated_types.get(associated_seg).unwrap();
types.write_c_type(w, &syn::Type::Path(syn::TypePath { qself: None,
path: syn::PathSegment {
ident: (*real_type).clone(),
arguments: syn::PathArguments::None
}.into()
}), generics, true);
} else {
if remaining_path.next().is_none() {
write!(w, "{}", this_param).unwrap();
return;
}
}
if let syn::Type::Reference(r) = &**rtype {
// We can't return a reference, cause we allocate things on the stack.
types.write_c_type(w, &*r.elem, generics, true);
} else {
if let syn::Type::Reference(r) = &**rtype {
// We can't return a reference, cause we allocate things on the stack.
types.write_c_type(w, &*r.elem, generics, true);
} else {
types.write_c_type(w, &*rtype, generics, true);
}
types.write_c_type(w, &*rtype, generics, true);
}
},
_ => {},
Expand DownExpand Up@@ -222,7 +211,7 @@ pub fn write_method_var_decl_body<W: std::io::Write>(w: &mut W, sig: &syn::Signa
///
/// The return value is expected to be bound to a variable named `ret` which is available after a
/// method-call-ending semicolon.
pub fn write_method_call_params<W: std::io::Write>(w: &mut W, sig: &syn::Signature, associated_types: &HashMap<&syn::Ident, &syn::Ident>, extra_indent: &str, types: &TypeResolver, generics: Option<&GenericTypes>, this_type: &str, to_c: bool) {
pub fn write_method_call_params<W: std::io::Write>(w: &mut W, sig: &syn::Signature, extra_indent: &str, types: &TypeResolver, generics: Option<&GenericTypes>, this_type: &str, to_c: bool) {
let mut first_arg = true;
let mut num_unused = 0;
for inp in sig.inputs.iter() {
Expand DownExpand Up@@ -285,26 +274,12 @@ pub fn write_method_call_params<W: std::io::Write>(w: &mut W, sig: &syn::Signatu
syn::ReturnType::Type(_, rtype) => {
write!(w, ";\n\t{}", extra_indent).unwrap();

let self_segs_iter = first_seg_self(&*rtype);
if to_c && first_seg_self(&*rtype).is_some() {
// Assume rather blindly that we're returning an associated trait from a C fn call to a Rust trait object.
write!(w, "ret").unwrap();
} else if !to_c && first_seg_self(&*rtype).is_some() {
if let Some(mut remaining_path) = first_seg_self(&*rtype) {
if let Some(associated_seg) = get_single_remaining_path_seg(&mut remaining_path) {
let real_type = associated_types.get(associated_seg).unwrap();
if let Some(t) = types.crate_types.traits.get(&types.maybe_resolve_ident(&real_type).unwrap()) {
// We're returning an associated trait from a Rust fn call to a C trait
// object.
writeln!(w, "let mut rust_obj = {} {{ inner: Box::into_raw(Box::new(ret)), is_owned: true }};", this_type).unwrap();
writeln!(w, "\t{}let mut ret = {}_as_{}(&rust_obj);", extra_indent, this_type, t.ident).unwrap();
writeln!(w, "\t{}// We want to free rust_obj when ret gets drop()'d, not rust_obj, so wipe rust_obj's pointer and set ret's free() fn", extra_indent).unwrap();
writeln!(w, "\t{}rust_obj.inner = std::ptr::null_mut();", extra_indent).unwrap();
writeln!(w, "\t{}ret.free = Some({}_free_void);", extra_indent, this_type).unwrap();
writeln!(w, "\t{}ret", extra_indent).unwrap();
return;
}
}
}
} else if !to_c && self_segs_iter.is_some() && self_segs_iter.unwrap().next().is_none() {
// If we're returning "Self" (and not "Self::X"), just do it manually
write!(w, "{} {{ inner: Box::into_raw(Box::new(ret)), is_owned: true }}", this_type).unwrap();
} else if to_c {
let new_var = types.write_from_c_conversion_new_var(w, &syn::Ident::new("ret", Span::call_site()), rtype, generics);
Expand Down
Loading