1use proc_macro2::TokenStream;
13use quote::{format_ident, quote};
14
15#[derive(#[automatically_derived]
impl ::core::fmt::Debug for ThreadStrategy {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
ThreadStrategy::MainThread => "MainThread",
ThreadStrategy::WorkerThread => "WorkerThread",
})
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for ThreadStrategy { }
#[automatically_derived]
impl ::core::clone::Clone for ThreadStrategy {
#[inline]
fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for ThreadStrategy { }Copy, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for ThreadStrategy { }
#[automatically_derived]
impl ::core::cmp::PartialEq for ThreadStrategy {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for ThreadStrategy { }Eq)]
17pub enum ThreadStrategy {
18 MainThread,
31
32 WorkerThread,
39}
40
41#[derive(#[automatically_derived]
impl ::core::fmt::Debug for ReturnHandling {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
ReturnHandling::Unit => "Unit",
ReturnHandling::RawSexp => "RawSexp",
ReturnHandling::ExternalPtr => "ExternalPtr",
ReturnHandling::SelfHandle => "SelfHandle",
ReturnHandling::SelfHandleResult => "SelfHandleResult",
ReturnHandling::SelfHandleOption => "SelfHandleOption",
ReturnHandling::IntoR => "IntoR",
ReturnHandling::OptionUnit => "OptionUnit",
ReturnHandling::OptionSexp => "OptionSexp",
ReturnHandling::OptionIntoR => "OptionIntoR",
ReturnHandling::OptionClassPayload => "OptionClassPayload",
ReturnHandling::OptionExternalPtr => "OptionExternalPtr",
ReturnHandling::ResultUnit => "ResultUnit",
ReturnHandling::ResultSexp => "ResultSexp",
ReturnHandling::ResultIntoR => "ResultIntoR",
ReturnHandling::ResultNullOnErr => "ResultNullOnErr",
ReturnHandling::ResultExternalPtr => "ResultExternalPtr",
ReturnHandling::AsListOf => "AsListOf",
ReturnHandling::AsExternalPtrOf => "AsExternalPtrOf",
ReturnHandling::AsNativeOf => "AsNativeOf",
})
}
}Debug, #[automatically_derived]
impl ::core::clone::Clone for ReturnHandling {
#[inline]
fn clone(&self) -> Self {
match self {
Self::Unit => ReturnHandling::Unit,
Self::RawSexp => ReturnHandling::RawSexp,
Self::ExternalPtr => ReturnHandling::ExternalPtr,
Self::SelfHandle => ReturnHandling::SelfHandle,
Self::SelfHandleResult => ReturnHandling::SelfHandleResult,
Self::SelfHandleOption => ReturnHandling::SelfHandleOption,
Self::IntoR => ReturnHandling::IntoR,
Self::OptionUnit => ReturnHandling::OptionUnit,
Self::OptionSexp => ReturnHandling::OptionSexp,
Self::OptionIntoR => ReturnHandling::OptionIntoR,
Self::OptionClassPayload => ReturnHandling::OptionClassPayload,
Self::OptionExternalPtr => ReturnHandling::OptionExternalPtr,
Self::ResultUnit => ReturnHandling::ResultUnit,
Self::ResultSexp => ReturnHandling::ResultSexp,
Self::ResultIntoR => ReturnHandling::ResultIntoR,
Self::ResultNullOnErr => ReturnHandling::ResultNullOnErr,
Self::ResultExternalPtr => ReturnHandling::ResultExternalPtr,
Self::AsListOf => ReturnHandling::AsListOf,
Self::AsExternalPtrOf => ReturnHandling::AsExternalPtrOf,
Self::AsNativeOf => ReturnHandling::AsNativeOf,
}
}
}Clone)]
48pub enum ReturnHandling {
49 Unit,
51 RawSexp,
53 ExternalPtr,
55 SelfHandle,
62 SelfHandleResult,
67 SelfHandleOption,
71 IntoR,
73 OptionUnit,
75 OptionSexp,
77 OptionIntoR,
84 OptionClassPayload,
90 OptionExternalPtr,
98 ResultUnit,
100 ResultSexp,
102 ResultIntoR,
104 ResultNullOnErr,
107 ResultExternalPtr,
115 AsListOf,
121 AsExternalPtrOf,
127 AsNativeOf,
131}
132
133#[derive(#[automatically_derived]
impl ::core::fmt::Debug for ErrPartsMode {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Probe { prefix: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Probe",
"prefix", &__self_0),
Self::Serde { prefix: __self_0, spec: __self_1 } =>
::core::fmt::Formatter::debug_struct_field2_finish(f, "Serde",
"prefix", __self_0, "spec", &__self_1),
}
}
}Debug, #[automatically_derived]
impl ::core::clone::Clone for ErrPartsMode {
#[inline]
fn clone(&self) -> Self {
match self {
Self::Probe { prefix: __self_0 } =>
ErrPartsMode::Probe {
prefix: ::core::clone::Clone::clone(__self_0),
},
Self::Serde { prefix: __self_0, spec: __self_1 } =>
ErrPartsMode::Serde {
prefix: ::core::clone::Clone::clone(__self_0),
spec: ::core::clone::Clone::clone(__self_1),
},
}
}
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for ErrPartsMode { }
#[automatically_derived]
impl ::core::cmp::PartialEq for ErrPartsMode {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other) &&
match (self, other) {
(Self::Probe { prefix: __self_0 }, Self::Probe {
prefix: __arg1_0 }) => __self_0 == __arg1_0,
(Self::Serde { prefix: __self_0, spec: __self_1 },
Self::Serde { prefix: __arg1_0, spec: __arg1_1 }) =>
__self_0 == __arg1_0 && __self_1 == __arg1_1,
_ => unsafe { ::core::intrinsics::unreachable() }
}
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for ErrPartsMode {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<String>;
let _:
::core::cmp::AssertParamIsEq<crate::miniextendr_fn::SerdeErrorSpec>;
}
}Eq)]
136pub enum ErrPartsMode {
137 Probe { prefix: String },
144 Serde {
151 prefix: String,
152 spec: crate::miniextendr_fn::SerdeErrorSpec,
153 },
154}
155
156impl ErrPartsMode {
157 pub fn from_spec(spec: Option<&crate::miniextendr_fn::SerdeErrorSpec>) -> Self {
159 let prefix = crate::miniextendr_fn::default_serde_error_prefix();
160 match spec {
161 None => ErrPartsMode::Probe { prefix },
162 Some(spec) => ErrPartsMode::Serde {
163 prefix,
164 spec: spec.clone(),
165 },
166 }
167 }
168
169 pub fn expr(&self) -> TokenStream {
171 match self {
172 ErrPartsMode::Probe { prefix } => {
173 let marker = crate::miniextendr_fn::init_marker_path();
174 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "__mx_result_err_parts");
::quote::__private::push_bang(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "e");
::quote::__private::push_comma(&mut _s);
::quote::ToTokens::to_tokens(&prefix, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::ToTokens::to_tokens(&marker, &mut _s);
_s
});
_s
}quote! { ::miniextendr_api::__mx_result_err_parts!(e, #prefix, #marker) }
175 }
176 ErrPartsMode::Serde { prefix, spec } => {
177 let marker = crate::miniextendr_fn::init_marker_path();
181 let declared = {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "__mx_declared_serde_shape");
::quote::__private::push_bang(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "e");
::quote::__private::push_comma(&mut _s);
::quote::ToTokens::to_tokens(&marker, &mut _s);
_s
});
_s
}quote! { ::miniextendr_api::__mx_declared_serde_shape!(e, #marker) };
182 let mut shapes: Vec<TokenStream> = std::iter::once(declared)
183 .chain(spec.shape.iter().map(
184 |path| {
let mut _s = ::quote::__private::TokenStream::new();
let _span: ::quote::__private::Span =
::quote::__private::get_span(syn::spanned::Spanned::span(path)).__into_span();
::quote::__private::push_and_spanned(&mut _s, _span);
::quote::ToTokens::to_tokens(&path, &mut _s);
_s
}quote::quote_spanned!(syn::spanned::Spanned::span(path)=> &#path),
185 ))
186 .collect();
187 let call = |shapes: &[TokenStream]| {
188 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "condition");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "serde_err_parts");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_and(&mut _s);
::quote::__private::push_ident(&mut _s, "e");
::quote::__private::push_comma(&mut _s);
::quote::ToTokens::to_tokens(&prefix, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_and(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Bracket,
{
let mut _s = ::quote::__private::TokenStream::new();
{
use ::quote::__private::ext::*;
let mut _first = true;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut shapes, i) = shapes.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let shapes =
match shapes.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
if !_first { ::quote::__private::push_comma(&mut _s); }
_first = false;
::quote::ToTokens::to_tokens(&shapes, &mut _s);
}
}
_s
});
_s
});
_s
}quote! {
189 ::miniextendr_api::condition::serde_err_parts(&e, #prefix, &[#(#shapes),*])
190 }
191 };
192 match spec.own_shape() {
193 None => call(&shapes),
194 Some(own) => {
195 let ident = syn::Ident::new(
196 "__MX_SERDE_ERROR_SHAPE",
197 proc_macro2::Span::mixed_site(),
198 );
199 shapes.push({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_and(&mut _s);
::quote::ToTokens::to_tokens(&ident, &mut _s);
_s
}quote!(&#ident));
200 let call = call(&shapes);
201 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "const");
::quote::ToTokens::to_tokens(&ident, &mut _s);
::quote::__private::push_colon(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "condition");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "SerdeErrorShape");
::quote::__private::push_eq(&mut _s);
::quote::ToTokens::to_tokens(&own, &mut _s);
::quote::__private::push_semi(&mut _s);
::quote::ToTokens::to_tokens(&call, &mut _s);
_s
});
_s
}quote! {{
202 const #ident: ::miniextendr_api::condition::SerdeErrorShape = #own;
203 #call
204 }}
205 }
206 }
207 }
208 }
209 }
210}
211
212pub struct CWrapperContext {
219 pub fn_ident: syn::Ident,
221 pub r_name: Option<String>,
224 pub c_ident: syn::Ident,
226 pub r_wrapper_const: Option<syn::Ident>,
231 pub inputs: syn::punctuated::Punctuated<syn::FnArg, ::syn::token::Commasyn::Token![,]>,
234 pub inferred_signature: Option<TokenStream>,
236 pub output: syn::ReturnType,
239 pub pre_call: Vec<TokenStream>,
242 pub post_conversion: Vec<TokenStream>,
245 pub call_expr: TokenStream,
248 pub thread_strategy: ThreadStrategy,
250 pub return_handling: ReturnHandling,
252 pub coerce_all: bool,
255 pub coerce_params: Vec<String>,
258 pub check_interrupt: bool,
261 pub rng: bool,
264 pub cfg_attrs: Vec<syn::Attribute>,
267 pub type_context: Option<syn::Ident>,
270 pub has_self: bool,
273 pub call_method_def_ident: Option<syn::Ident>,
276 pub strict: bool,
280 pub err_parts: ErrPartsMode,
282 pub match_arg_several_ok_params: Vec<String>,
290 pub layered_choice_params: Vec<(String, crate::rust_conversion_builder::ChoiceLeaf)>,
297 pub no_na_params: Vec<(String, Option<String>)>,
302 pub param_markers: Vec<(String, Vec<crate::type_inspect::ParamMarker>)>,
308 pub formals: crate::r_wrapper_builder::Formals,
312 pub preserve_param_names: bool,
316 pub vis: syn::Visibility,
320 pub generics: syn::Generics,
323 pub skip_wrapper: bool,
328}
329
330impl CWrapperContext {
331 pub fn builder(fn_ident: syn::Ident, c_ident: syn::Ident) -> CWrapperContextBuilder {
336 CWrapperContextBuilder {
337 fn_ident,
338 r_name: None,
339 c_ident,
340 r_wrapper_const: None,
341 inputs: syn::punctuated::Punctuated::new(),
342 inferred_signature: None,
343 output: syn::ReturnType::Default,
344 pre_call: Vec::new(),
345 post_conversion: Vec::new(),
346 call_expr: None,
347 thread_strategy: None,
348 return_handling: None,
349 coerce_all: false,
350 coerce_params: Vec::new(),
351 check_interrupt: false,
352 rng: false,
353 cfg_attrs: Vec::new(),
354 type_context: None,
355 has_self: false,
356 call_method_def_ident: None,
357 strict: false,
358 err_parts: ErrPartsMode::from_spec(None),
359 match_arg_several_ok_params: Vec::new(),
360 layered_choice_params: Vec::new(),
361 no_na_params: Vec::new(),
362 param_markers: Vec::new(),
363 formals: crate::r_wrapper_builder::Formals::default(),
364 preserve_param_names: false,
365 vis: syn::Visibility::Inherited,
366 generics: syn::Generics::default(),
367 skip_wrapper: false,
368 }
369 }
370
371 pub fn generate(&self) -> TokenStream {
382 let call_method_def = self.generate_call_method_def();
383
384 let cfg_attrs = &self.cfg_attrs;
385
386 if self.skip_wrapper {
387 {
let mut _s = ::quote::__private::TokenStream::new();
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut cfg_attrs, i) = cfg_attrs.quote_into_iter();
let has_iter = has_iter | i;
<_ as ::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let cfg_attrs =
match cfg_attrs.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&cfg_attrs, &mut _s);
}
}
::quote::ToTokens::to_tokens(&call_method_def, &mut _s);
_s
}quote! {
389 #(#cfg_attrs)*
390 #call_method_def
391 }
392 } else {
393 let c_wrapper = match self.thread_strategy {
394 ThreadStrategy::MainThread => self.generate_main_thread_wrapper(),
395 ThreadStrategy::WorkerThread => self.generate_worker_thread_wrapper(),
396 };
397
398 {
let mut _s = ::quote::__private::TokenStream::new();
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut cfg_attrs, i) = cfg_attrs.quote_into_iter();
let has_iter = has_iter | i;
<_ as ::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let cfg_attrs =
match cfg_attrs.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&cfg_attrs, &mut _s);
}
}
::quote::ToTokens::to_tokens(&c_wrapper, &mut _s);
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut cfg_attrs, i) = cfg_attrs.quote_into_iter();
let has_iter = has_iter | i;
<_ as ::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let cfg_attrs =
match cfg_attrs.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&cfg_attrs, &mut _s);
}
}
::quote::ToTokens::to_tokens(&call_method_def, &mut _s);
_s
}quote! {
399 #(#cfg_attrs)*
400 #c_wrapper
401
402 #(#cfg_attrs)*
403 #call_method_def
404 }
405 }
406 }
407
408 fn message_name(&self) -> String {
411 self.r_name
412 .clone()
413 .unwrap_or_else(|| self.fn_ident.to_string())
414 }
415
416 fn build_c_params(&self) -> (Vec<TokenStream>, Vec<syn::Ident>, Vec<syn::Ident>) {
425 let mut c_params: Vec<TokenStream> = Vec::new();
426 let mut rust_args: Vec<syn::Ident> = Vec::new();
427 let mut sexp_idents: Vec<syn::Ident> = Vec::new();
428
429 c_params.push({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "__miniextendr_call");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "SEXP");
_s
}quote!(__miniextendr_call: ::miniextendr_api::SEXP));
431
432 if self.has_self {
434 let self_sexp = crate::naming::self_sexp_ident();
435 c_params.push({
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&self_sexp, &mut _s);
::quote::__private::push_colon(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "SEXP");
_s
}quote!(#self_sexp: ::miniextendr_api::SEXP));
436 }
437
438 for (idx, arg) in self.inputs.iter().enumerate() {
440 if let syn::FnArg::Typed(pt) = arg
441 && let syn::Pat::Ident(pat_ident) = pt.pat.as_ref()
442 {
443 let ident = &pat_ident.ident;
444 let param_ident = if self.preserve_param_names {
447 ident.clone()
452 } else {
453 match ::quote::__private::IdentFragmentAdapter(&idx) {
arg =>
::quote::__private::mk_ident(&::alloc::__export::must_use({
::alloc::fmt::format(format_args!("arg_{0}", arg))
}),
::quote::__private::Option::Some::<::quote::__private::Span>(proc_macro2::Span::mixed_site())),
}format_ident!("arg_{}", idx, span = proc_macro2::Span::mixed_site())
457 };
458
459 c_params.push({
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(¶m_ident, &mut _s);
::quote::__private::push_colon(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "SEXP");
_s
}quote!(#param_ident: ::miniextendr_api::SEXP));
460 rust_args.push(ident.clone());
461 sexp_idents.push(param_ident);
462 }
463 }
464
465 (c_params, rust_args, sexp_idents)
466 }
467
468 fn build_conversion_stmts(&self, sexp_idents: &[syn::Ident]) -> Vec<TokenStream> {
475 let builder = self.conversion_builder();
476 builder.build_conversions(&self.inputs, sexp_idents)
477 }
478
479 fn build_conversion_stmts_split(
485 &self,
486 sexp_idents: &[syn::Ident],
487 ) -> (Vec<TokenStream>, Vec<TokenStream>) {
488 let builder = self.conversion_builder();
489
490 let mut all_pre = Vec::new();
491 let mut all_in = Vec::new();
492
493 for (arg, sexp_ident) in self.inputs.iter().zip(sexp_idents.iter()) {
494 if let syn::FnArg::Typed(pat_type) = arg {
495 let (owned, borrowed) = builder.build_conversion_split(pat_type, sexp_ident);
496 all_pre.extend(owned);
497 all_in.extend(borrowed);
498 }
499 }
500
501 (all_pre, all_in)
502 }
503
504 fn conversion_builder(&self) -> crate::RustConversionBuilder {
506 let mut builder = crate::RustConversionBuilder::new();
507 if self.inferred_signature.is_some() {
508 builder = builder.with_inferred_types();
509 }
510 if self.strict {
511 builder = builder.with_strict();
512 }
513 if self.coerce_all {
514 builder = builder.with_coerce_all();
515 }
516 for param in &self.coerce_params {
517 builder = builder.with_coerce_param(param.clone());
518 }
519 for param in &self.match_arg_several_ok_params {
520 builder = builder.with_match_arg_several_ok(param.clone());
521 }
522 for (param, leaf) in &self.layered_choice_params {
523 builder = builder.with_layered_choice(param.clone(), leaf.clone());
524 }
525 for (param, message) in &self.no_na_params {
526 builder = builder.with_no_na(param.clone(), message.clone());
527 }
528 for (param, markers) in &self.param_markers {
529 builder = builder.with_param_markers(param.clone(), markers.clone());
530 }
531 builder = builder.with_formals(self.formals.clone());
532 match &self.type_context {
536 None => builder = builder.with_unevaluated_args(),
537 Some(type_ident) => builder = builder.with_self_type(::syn::__private::parse_quote({
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&type_ident, &mut _s);
_s
})syn::parse_quote!(#type_ident)),
538 }
539 builder
540 }
541
542 fn build_alias_guard(&self, sexp_idents: &[syn::Ident]) -> TokenStream {
545 let builder = self.conversion_builder();
546 let mut metadata = Vec::new();
547 let mut args = Vec::new();
548 for (arg, sexp_ident) in self.inputs.iter().zip(sexp_idents) {
549 if let syn::FnArg::Typed(pt) = arg
550 && let syn::Pat::Ident(pat_ident) = pt.pat.as_ref()
551 && let Some(borrow) = builder.native_borrow_metadata(pt, sexp_ident)
552 {
553 let name = crate::naming::ident_name(&pat_ident.ident);
554 metadata.push(borrow);
555 args.push({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&sexp_ident, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::ToTokens::to_tokens(&name, &mut _s);
_s
});
_s
}quote! { (#sexp_ident, #name) });
556 }
557 }
558 if args.is_empty() {
559 return TokenStream::new();
560 }
561 let check = {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "unsafe");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "from_r");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "borrow");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "assert_no_aliases");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Bracket,
{
let mut _s = ::quote::__private::TokenStream::new();
{
use ::quote::__private::ext::*;
let mut _first = true;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut args, i) = args.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let args =
match args.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
if !_first { ::quote::__private::push_comma(&mut _s); }
_first = false;
::quote::ToTokens::to_tokens(&args, &mut _s);
}
}
_s
});
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s,
"__miniextendr_native_borrows");
::quote::__private::push_comma(&mut _s);
_s
});
::quote::__private::push_semi(&mut _s);
_s
});
_s
}quote! {
562 unsafe {
565 ::miniextendr_api::from_r::borrow::assert_no_aliases(
566 [#(#args),*], __miniextendr_native_borrows,
567 );
568 }
569 };
570 let check = if self.thread_strategy == ThreadStrategy::WorkerThread {
571 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "let");
::quote::__private::push_ident(&mut _s, "__miniextendr_alias_result");
::quote::__private::push_eq(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "unwind_protect");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "with_r_unwind_protect");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_or_or(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&check, &mut _s);
::quote::__private::push_semi(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "SEXP");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "nil");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
_s
});
::quote::__private::push_comma(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Some");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s,
"__miniextendr_call");
_s
});
::quote::__private::push_comma(&mut _s);
_s
});
::quote::__private::push_semi(&mut _s);
::quote::__private::push_ident(&mut _s, "if");
::quote::__private::push_ident(&mut _s, "__miniextendr_alias_result");
::quote::__private::push_ne(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "SEXP");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "nil");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "return");
::quote::__private::push_ident(&mut _s,
"__miniextendr_alias_result");
::quote::__private::push_semi(&mut _s);
_s
});
_s
}quote! {
572 let __miniextendr_alias_result =
573 ::miniextendr_api::unwind_protect::with_r_unwind_protect(
574 || { #check; ::miniextendr_api::SEXP::nil() },
575 ::core::option::Option::Some(__miniextendr_call),
576 );
577 if __miniextendr_alias_result != ::miniextendr_api::SEXP::nil() {
578 return __miniextendr_alias_result;
579 }
580 }
581 } else {
582 check
583 };
584 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "let");
::quote::__private::push_ident(&mut _s,
"__miniextendr_native_borrows");
::quote::__private::push_eq(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Bracket,
{
let mut _s = ::quote::__private::TokenStream::new();
{
use ::quote::__private::ext::*;
let mut _first = true;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut metadata, i) = metadata.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let metadata =
match metadata.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
if !_first { ::quote::__private::push_comma(&mut _s); }
_first = false;
::quote::ToTokens::to_tokens(&metadata, &mut _s);
}
}
_s
});
::quote::__private::push_semi(&mut _s);
::quote::__private::push_ident(&mut _s, "if");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "from_r");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "borrow");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "needs_check");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_and(&mut _s);
::quote::__private::push_ident(&mut _s,
"__miniextendr_native_borrows");
_s
});
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&check, &mut _s);
_s
});
_s
});
_s
}quote! {{
585 let __miniextendr_native_borrows = [#(#metadata),*];
586 if ::miniextendr_api::from_r::borrow::needs_check(&__miniextendr_native_borrows) {
587 #check
588 }
589 }}
590 }
591
592 fn arg_borrows(&self) -> TokenStream {
595 let unborrowed: Vec<String> = self
596 .param_markers
597 .iter()
598 .map(|(name, _)| name.clone())
599 .collect();
600 let self_ty: Option<syn::Type> = self.type_context.as_ref().map(|t| ::syn::__private::parse_quote({
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&t, &mut _s);
_s
})syn::parse_quote!(#t));
601 crate::externalptr_args::arg_borrows(&self.inputs, &unborrowed, self_ty.as_ref())
602 }
603
604 fn generate_main_thread_wrapper(&self) -> TokenStream {
612 let c_ident = &self.c_ident;
613 let vis = &self.vis;
614 let generics = &self.generics;
615 let (c_params, _, sexp_idents) = self.build_c_params();
616 let conversion_stmts = self.build_conversion_stmts(&sexp_idents);
617 let alias_guard = self.build_alias_guard(&sexp_idents);
618 let type_setup = self
619 .inferred_signature
620 .as_ref()
621 .map(|callable| crate::trait_signature::setup(&self.inputs, self.has_self, callable));
622 let borrow = self.arg_borrows();
623 let pre_call = &self.pre_call;
624 let post_conversion = &self.post_conversion;
625 let call_expr = &self.call_expr;
626
627 let pre_call_checks = if self.check_interrupt {
628 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "unsafe");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "sys");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "R_CheckUserInterrupt");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
::quote::__private::push_semi(&mut _s);
_s
});
_s
}quote! {
629 unsafe { ::miniextendr_api::sys::R_CheckUserInterrupt(); }
630 }
631 } else {
632 TokenStream::new()
633 };
634
635 let return_handling = self.generate_return_handling(call_expr);
636
637 let doc = self.generate_doc_comment("main thread");
638 let source_loc_doc = crate::source_location_doc(self.fn_ident.span());
639
640 let guarded_body = self.protect_wrapper_body({
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&type_setup, &mut _s);
::quote::ToTokens::to_tokens(&alias_guard, &mut _s);
::quote::ToTokens::to_tokens(&pre_call_checks, &mut _s);
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut pre_call, i) = pre_call.quote_into_iter();
let has_iter = has_iter | i;
<_ as ::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let pre_call =
match pre_call.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&pre_call, &mut _s);
}
}
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut conversion_stmts, i) = conversion_stmts.quote_into_iter();
let has_iter = has_iter | i;
<_ as ::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let conversion_stmts =
match conversion_stmts.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&conversion_stmts, &mut _s);
}
}
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut post_conversion, i) = post_conversion.quote_into_iter();
let has_iter = has_iter | i;
<_ as ::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let post_conversion =
match post_conversion.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&post_conversion, &mut _s);
}
}
::quote::ToTokens::to_tokens(&borrow, &mut _s);
::quote::ToTokens::to_tokens(&return_handling, &mut _s);
_s
}quote! {
641 #type_setup
642 #alias_guard
643 #pre_call_checks
644 #(#pre_call)*
645 #(#conversion_stmts)*
646 #(#post_conversion)*
647 #borrow
648 #return_handling
649 });
650
651 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_pound(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Bracket,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "doc");
::quote::__private::push_eq(&mut _s);
::quote::ToTokens::to_tokens(&doc, &mut _s);
_s
});
::quote::__private::push_pound(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Bracket,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "doc");
::quote::__private::push_eq(&mut _s);
::quote::ToTokens::to_tokens(&source_loc_doc, &mut _s);
_s
});
::quote::__private::push_pound(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Bracket,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "concat");
::quote::__private::push_bang(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::parse(&mut _s,
"\"Generated from source file `\"");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "file");
::quote::__private::push_bang(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
::quote::__private::push_comma(&mut _s);
::quote::__private::parse(&mut _s, "\"`.\"");
_s
});
_s
});
::quote::__private::push_pound(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Bracket,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "unsafe");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "no_mangle");
_s
});
_s
});
::quote::ToTokens::to_tokens(&vis, &mut _s);
::quote::__private::push_ident(&mut _s, "extern");
::quote::__private::parse(&mut _s, "\"C-unwind\"");
::quote::__private::push_ident(&mut _s, "fn");
::quote::ToTokens::to_tokens(&c_ident, &mut _s);
::quote::ToTokens::to_tokens(&generics, &mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
{
use ::quote::__private::ext::*;
let mut _first = true;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut c_params, i) = c_params.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let c_params =
match c_params.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
if !_first { ::quote::__private::push_comma(&mut _s); }
_first = false;
::quote::ToTokens::to_tokens(&c_params, &mut _s);
}
}
_s
});
::quote::__private::push_rarrow(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "SEXP");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "let");
::quote::__private::push_ident(&mut _s,
"__miniextendr_deferred_mark");
::quote::__private::push_eq(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "deferred_condition");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "mark");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
::quote::__private::push_semi(&mut _s);
::quote::__private::push_ident(&mut _s, "let");
::quote::__private::push_ident(&mut _s, "__miniextendr_value");
::quote::__private::push_eq(&mut _s);
::quote::ToTokens::to_tokens(&guarded_body, &mut _s);
::quote::__private::push_semi(&mut _s);
::quote::__private::push_ident(&mut _s, "unsafe");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s,
"deferred_condition");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "finish");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s,
"__miniextendr_deferred_mark");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s,
"__miniextendr_value");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Some");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s,
"__miniextendr_call");
_s
});
::quote::__private::push_comma(&mut _s);
_s
});
_s
});
_s
});
_s
}quote! {
652 #[doc = #doc]
653 #[doc = #source_loc_doc]
654 #[doc = ::core::concat!("Generated from source file `", ::core::file!(), "`.")]
655 #[unsafe(no_mangle)]
656 #vis extern "C-unwind" fn #c_ident #generics(#(#c_params),*) -> ::miniextendr_api::SEXP {
657 let __miniextendr_deferred_mark = ::miniextendr_api::deferred_condition::mark();
658 let __miniextendr_value = #guarded_body;
659 unsafe {
660 ::miniextendr_api::deferred_condition::finish(
661 __miniextendr_deferred_mark,
662 __miniextendr_value,
663 ::core::option::Option::Some(__miniextendr_call),
664 )
665 }
666 }
667 }
668 }
669
670 fn protect_wrapper_body(&self, body: TokenStream) -> TokenStream {
676 let guarded_body = {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "unwind_protect");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "with_r_unwind_protect");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "move");
::quote::__private::push_or_or(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&body, &mut _s);
_s
});
::quote::__private::push_comma(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Some");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s,
"__miniextendr_call");
_s
});
::quote::__private::push_comma(&mut _s);
_s
});
_s
}quote! {
677 ::miniextendr_api::unwind_protect::with_r_unwind_protect(
678 move || { #body },
679 ::core::option::Option::Some(__miniextendr_call),
680 )
681 };
682 if self.rng {
683 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "unwind_protect");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "with_r_unwind_protect");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "move");
::quote::__private::push_or_or(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "unsafe");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "sys");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s,
"GetRNGstate_unchecked");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
::quote::__private::push_semi(&mut _s);
_s
});
::quote::__private::push_ident(&mut _s, "let");
::quote::__private::push_ident(&mut _s,
"__miniextendr_rng_value");
::quote::__private::push_eq(&mut _s);
::quote::ToTokens::to_tokens(&guarded_body, &mut _s);
::quote::__private::push_semi(&mut _s);
::quote::__private::push_ident(&mut _s, "let");
::quote::__private::push_ident(&mut _s,
"__miniextendr_rng_result");
::quote::__private::push_eq(&mut _s);
::quote::__private::push_ident(&mut _s, "unsafe");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "gc_protect");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "OwnedProtect");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "new");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s,
"__miniextendr_rng_value");
_s
});
_s
});
::quote::__private::push_semi(&mut _s);
::quote::__private::push_ident(&mut _s, "unsafe");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "sys");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s,
"PutRNGstate_unchecked");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
::quote::__private::push_semi(&mut _s);
_s
});
::quote::__private::push_ident(&mut _s,
"__miniextendr_rng_result");
::quote::__private::push_dot(&mut _s);
::quote::__private::push_ident(&mut _s, "get");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
_s
});
::quote::__private::push_comma(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Some");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s,
"__miniextendr_call");
_s
});
::quote::__private::push_comma(&mut _s);
_s
});
_s
}quote! {
684 ::miniextendr_api::unwind_protect::with_r_unwind_protect(
685 move || {
686 unsafe { ::miniextendr_api::sys::GetRNGstate_unchecked(); }
687 let __miniextendr_rng_value = #guarded_body;
688 let __miniextendr_rng_result = unsafe {
689 ::miniextendr_api::gc_protect::OwnedProtect::new(__miniextendr_rng_value)
690 };
691 unsafe { ::miniextendr_api::sys::PutRNGstate_unchecked(); }
692 __miniextendr_rng_result.get()
693 },
694 ::core::option::Option::Some(__miniextendr_call),
695 )
696 }
697 } else {
698 guarded_body
699 }
700 }
701
702 fn generate_worker_thread_wrapper(&self) -> TokenStream {
719 let c_ident = &self.c_ident;
720 let vis = &self.vis;
721 let generics = &self.generics;
722 let (c_params, _, sexp_idents) = self.build_c_params();
723 let (pre_closure_stmts, in_closure_stmts) = self.build_conversion_stmts_split(&sexp_idents);
724 let alias_guard = self.build_alias_guard(&sexp_idents);
725 let type_setup = self
726 .inferred_signature
727 .as_ref()
728 .map(|callable| crate::trait_signature::setup(&self.inputs, self.has_self, callable));
729 let borrow = self.arg_borrows();
730 let pre_call = &self.pre_call;
731 let post_conversion = &self.post_conversion;
732 let call_expr = &self.call_expr;
733
734 let fn_name = self.fn_ident.to_string();
738 let feature_msg = ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("`#[miniextendr(worker)]` on `{0}` requires the `worker-thread` cargo feature. Add `worker-thread = [\"miniextendr-api/worker-thread\"]` to your [features] in Cargo.toml.",
fn_name))
})format!(
739 "`#[miniextendr(worker)]` on `{fn_name}` requires the `worker-thread` cargo feature. \
740 Add `worker-thread = [\"miniextendr-api/worker-thread\"]` to your [features] in Cargo.toml."
741 );
742 let worker_feature_check = {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_pound(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Bracket,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "cfg");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "not");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "any");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "feature");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s, "\"worker-thread\"");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "feature");
::quote::__private::push_eq(&mut _s);
::quote::__private::parse(&mut _s, "\"worker-default\"");
_s
});
_s
});
_s
});
_s
});
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "compile_error");
::quote::__private::push_bang(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&feature_msg, &mut _s);
_s
});
::quote::__private::push_semi(&mut _s);
_s
}quote! {
743 #[cfg(not(any(feature = "worker-thread", feature = "worker-default")))]
744 ::core::compile_error!(#feature_msg);
745 };
746
747 let pre_call_checks = if self.check_interrupt {
748 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "unsafe");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "sys");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "R_CheckUserInterrupt");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
::quote::__private::push_semi(&mut _s);
_s
});
_s
}quote! {
749 unsafe { ::miniextendr_api::sys::R_CheckUserInterrupt(); }
750 }
751 } else {
752 TokenStream::new()
753 };
754
755 let (worker_body, return_conversion) = self.generate_worker_return_handling(call_expr);
756
757 let doc = self.generate_doc_comment("worker thread");
758 let source_loc_doc = crate::source_location_doc(self.fn_ident.span());
759
760 let guarded_body = self.protect_wrapper_body({
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&type_setup, &mut _s);
::quote::ToTokens::to_tokens(&alias_guard, &mut _s);
::quote::ToTokens::to_tokens(&pre_call_checks, &mut _s);
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut pre_call, i) = pre_call.quote_into_iter();
let has_iter = has_iter | i;
<_ as ::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let pre_call =
match pre_call.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&pre_call, &mut _s);
}
}
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut pre_closure_stmts, i) = pre_closure_stmts.quote_into_iter();
let has_iter = has_iter | i;
<_ as ::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let pre_closure_stmts =
match pre_closure_stmts.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&pre_closure_stmts, &mut _s);
}
}
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut post_conversion, i) = post_conversion.quote_into_iter();
let has_iter = has_iter | i;
<_ as ::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let post_conversion =
match post_conversion.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&post_conversion, &mut _s);
}
}
::quote::ToTokens::to_tokens(&borrow, &mut _s);
::quote::__private::push_ident(&mut _s, "match");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "worker");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "run_on_worker");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "move");
::quote::__private::push_or_or(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "condition");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "catch_condition");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "move");
::quote::__private::push_or_or(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut in_closure_stmts, i) =
in_closure_stmts.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let in_closure_stmts =
match in_closure_stmts.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&in_closure_stmts, &mut _s);
}
}
::quote::ToTokens::to_tokens(&worker_body, &mut _s);
_s
});
_s
});
_s
});
_s
});
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Ok");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Ok");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s,
"__miniextendr_result");
_s
});
_s
});
::quote::__private::push_fat_arrow(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&return_conversion, &mut _s);
_s
});
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Ok");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Err");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s,
"__miniextendr_condition");
_s
});
_s
});
::quote::__private::push_fat_arrow(&mut _s);
::quote::__private::push_ident(&mut _s, "unsafe");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "error_value");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s,
"rust_condition_value");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s,
"__miniextendr_condition");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Some");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s,
"__miniextendr_call");
_s
});
::quote::__private::push_comma(&mut _s);
_s
});
_s
});
::quote::__private::push_comma(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Err");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "__panic_msg");
_s
});
::quote::__private::push_fat_arrow(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "unsafe");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "error_value");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s,
"make_rust_condition_value");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_and(&mut _s);
::quote::__private::push_ident(&mut _s, "__panic_msg");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "error_value");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "kind");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "PANIC");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "None");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Some");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s,
"__miniextendr_call");
_s
});
::quote::__private::push_comma(&mut _s);
_s
});
_s
});
_s
});
_s
});
_s
}quote! {
761 #type_setup
762 #alias_guard
763 #pre_call_checks
764 #(#pre_call)*
765 #(#pre_closure_stmts)*
766 #(#post_conversion)*
770 #borrow
771
772 match ::miniextendr_api::worker::run_on_worker(move || {
777 ::miniextendr_api::condition::catch_condition(move || {
778 #(#in_closure_stmts)*
779 #worker_body
780 })
781 }) {
782 ::core::result::Result::Ok(::core::result::Result::Ok(__miniextendr_result)) => {
783 #return_conversion
784 }
785 ::core::result::Result::Ok(::core::result::Result::Err(__miniextendr_condition)) => unsafe {
786 ::miniextendr_api::error_value::rust_condition_value(
787 __miniextendr_condition,
788 ::core::option::Option::Some(__miniextendr_call),
789 )
790 },
791 ::core::result::Result::Err(__panic_msg) => {
792 unsafe { ::miniextendr_api::error_value::make_rust_condition_value(
793 &__panic_msg, ::miniextendr_api::error_value::kind::PANIC, ::core::option::Option::None, ::core::option::Option::Some(__miniextendr_call),
794 ) }
795 }
796 }
797 });
798
799 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&worker_feature_check, &mut _s);
::quote::__private::push_pound(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Bracket,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "doc");
::quote::__private::push_eq(&mut _s);
::quote::ToTokens::to_tokens(&doc, &mut _s);
_s
});
::quote::__private::push_pound(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Bracket,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "doc");
::quote::__private::push_eq(&mut _s);
::quote::ToTokens::to_tokens(&source_loc_doc, &mut _s);
_s
});
::quote::__private::push_pound(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Bracket,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "concat");
::quote::__private::push_bang(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::parse(&mut _s,
"\"Generated from source file `\"");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "file");
::quote::__private::push_bang(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
::quote::__private::push_comma(&mut _s);
::quote::__private::parse(&mut _s, "\"`.\"");
_s
});
_s
});
::quote::__private::push_pound(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Bracket,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "unsafe");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "no_mangle");
_s
});
_s
});
::quote::ToTokens::to_tokens(&vis, &mut _s);
::quote::__private::push_ident(&mut _s, "extern");
::quote::__private::parse(&mut _s, "\"C-unwind\"");
::quote::__private::push_ident(&mut _s, "fn");
::quote::ToTokens::to_tokens(&c_ident, &mut _s);
::quote::ToTokens::to_tokens(&generics, &mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
{
use ::quote::__private::ext::*;
let mut _first = true;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut c_params, i) = c_params.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let c_params =
match c_params.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
if !_first { ::quote::__private::push_comma(&mut _s); }
_first = false;
::quote::ToTokens::to_tokens(&c_params, &mut _s);
}
}
_s
});
::quote::__private::push_rarrow(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "SEXP");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "let");
::quote::__private::push_ident(&mut _s,
"__miniextendr_deferred_mark");
::quote::__private::push_eq(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "deferred_condition");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "mark");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
::quote::__private::push_semi(&mut _s);
::quote::__private::push_ident(&mut _s, "let");
::quote::__private::push_ident(&mut _s, "__miniextendr_value");
::quote::__private::push_eq(&mut _s);
::quote::ToTokens::to_tokens(&guarded_body, &mut _s);
::quote::__private::push_semi(&mut _s);
::quote::__private::push_ident(&mut _s, "unsafe");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s,
"deferred_condition");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "finish");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s,
"__miniextendr_deferred_mark");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s,
"__miniextendr_value");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Some");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s,
"__miniextendr_call");
_s
});
::quote::__private::push_comma(&mut _s);
_s
});
_s
});
_s
});
_s
}quote! {
800 #worker_feature_check
801
802 #[doc = #doc]
803 #[doc = #source_loc_doc]
804 #[doc = ::core::concat!("Generated from source file `", ::core::file!(), "`.")]
805 #[unsafe(no_mangle)]
806 #vis extern "C-unwind" fn #c_ident #generics(#(#c_params),*) -> ::miniextendr_api::SEXP {
807 let __miniextendr_deferred_mark = ::miniextendr_api::deferred_condition::mark();
808 let __miniextendr_value = #guarded_body;
809 unsafe {
810 ::miniextendr_api::deferred_condition::finish(
811 __miniextendr_deferred_mark,
812 __miniextendr_value,
813 ::core::option::Option::Some(__miniextendr_call),
814 )
815 }
816 }
817 }
818 }
819
820 fn generate_return_handling(&self, call_expr: &TokenStream) -> TokenStream {
826 let fn_name = self.message_name();
827 let err_parts = self.err_parts.expr();
828 let self_sexp = crate::naming::self_sexp_ident();
829
830 match &self.return_handling {
831 ReturnHandling::Unit => {
832 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&call_expr, &mut _s);
::quote::__private::push_semi(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "SEXP");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "nil");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
_s
}quote! {
833 #call_expr;
834 ::miniextendr_api::SEXP::nil()
835 }
836 }
837 ReturnHandling::RawSexp => {
838 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&call_expr, &mut _s);
_s
}quote! {
839 #call_expr
840 }
841 }
842 ReturnHandling::ExternalPtr => {
843 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "let");
::quote::__private::push_ident(&mut _s, "__result");
::quote::__private::push_eq(&mut _s);
::quote::ToTokens::to_tokens(&call_expr, &mut _s);
::quote::__private::push_semi(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "into_r");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "IntoR");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "into_sexp");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "externalptr");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "ExternalPtr");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "new");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "__result");
_s
});
_s
});
_s
}quote! {
844 let __result = #call_expr;
845 ::miniextendr_api::into_r::IntoR::into_sexp(
846 ::miniextendr_api::externalptr::ExternalPtr::new(__result)
847 )
848 }
849 }
850 ReturnHandling::SelfHandle => {
851 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "let");
::quote::__private::push_underscore(&mut _s);
::quote::__private::push_eq(&mut _s);
::quote::ToTokens::to_tokens(&call_expr, &mut _s);
::quote::__private::push_semi(&mut _s);
::quote::ToTokens::to_tokens(&self_sexp, &mut _s);
_s
}quote! {
857 let _ = #call_expr;
858 #self_sexp
859 }
860 }
861 ReturnHandling::SelfHandleResult => {
862 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "let");
::quote::__private::push_ident(&mut _s, "__result");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Result");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
::quote::__private::push_comma(&mut _s);
::quote::__private::push_underscore(&mut _s);
::quote::__private::push_gt(&mut _s);
::quote::__private::push_eq(&mut _s);
::quote::ToTokens::to_tokens(&call_expr, &mut _s);
::quote::__private::push_semi(&mut _s);
::quote::__private::push_ident(&mut _s, "if");
::quote::__private::push_ident(&mut _s, "let");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Err");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "e");
_s
});
::quote::__private::push_eq(&mut _s);
::quote::__private::push_ident(&mut _s, "__result");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "return");
::quote::__private::push_ident(&mut _s, "unsafe");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "error_value");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s,
"result_err_condition_value");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&err_parts, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Some");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s,
"__miniextendr_call");
_s
});
::quote::__private::push_comma(&mut _s);
_s
});
_s
});
::quote::__private::push_semi(&mut _s);
_s
});
::quote::ToTokens::to_tokens(&self_sexp, &mut _s);
_s
}quote! {
863 let __result: ::core::result::Result<(), _> = #call_expr;
864 if let ::core::result::Result::Err(e) = __result {
865 return unsafe { ::miniextendr_api::error_value::result_err_condition_value(
866 #err_parts, ::core::option::Option::Some(__miniextendr_call),
867 ) };
868 }
869 #self_sexp
870 }
871 }
872 ReturnHandling::SelfHandleOption => {
873 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "let");
::quote::__private::push_ident(&mut _s, "__result");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Option");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
::quote::__private::push_gt(&mut _s);
::quote::__private::push_eq(&mut _s);
::quote::ToTokens::to_tokens(&call_expr, &mut _s);
::quote::__private::push_semi(&mut _s);
::quote::__private::push_ident(&mut _s, "if");
::quote::__private::push_ident(&mut _s, "__result");
::quote::__private::push_dot(&mut _s);
::quote::__private::push_ident(&mut _s, "is_none");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "return");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "SEXP");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "nil");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
::quote::__private::push_semi(&mut _s);
_s
});
::quote::ToTokens::to_tokens(&self_sexp, &mut _s);
_s
}quote! {
874 let __result: ::core::option::Option<()> = #call_expr;
875 if __result.is_none() {
876 return ::miniextendr_api::SEXP::nil();
877 }
878 #self_sexp
879 }
880 }
881 ReturnHandling::IntoR => {
882 let result_ident = ::quote::__private::mk_ident(&::alloc::__export::must_use({
::alloc::fmt::format(format_args!("__result"))
}), ::quote::__private::Option::None)format_ident!("__result");
883 let conversion = self.sexp_conversion_expr(&result_ident, true);
884 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "let");
::quote::ToTokens::to_tokens(&result_ident, &mut _s);
::quote::__private::push_eq(&mut _s);
::quote::ToTokens::to_tokens(&call_expr, &mut _s);
::quote::__private::push_semi(&mut _s);
::quote::ToTokens::to_tokens(&conversion, &mut _s);
_s
}quote! {
885 let #result_ident = #call_expr;
886 #conversion
887 }
888 }
889 ReturnHandling::OptionUnit => {
890 let error_msg = ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("`{0}()` returned no value",
fn_name))
})format!("`{fn_name}()` returned no value");
891 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "let");
::quote::__private::push_ident(&mut _s, "__result");
::quote::__private::push_eq(&mut _s);
::quote::ToTokens::to_tokens(&call_expr, &mut _s);
::quote::__private::push_semi(&mut _s);
::quote::__private::push_ident(&mut _s, "if");
::quote::__private::push_ident(&mut _s, "__result");
::quote::__private::push_dot(&mut _s);
::quote::__private::push_ident(&mut _s, "is_none");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "return");
::quote::__private::push_ident(&mut _s, "unsafe");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "error_value");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s,
"make_rust_condition_value");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&error_msg, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "error_value");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "kind");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "NONE_ERR");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "None");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Some");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s,
"__miniextendr_call");
_s
});
::quote::__private::push_comma(&mut _s);
_s
});
_s
});
::quote::__private::push_semi(&mut _s);
_s
});
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "SEXP");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "nil");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
_s
}quote! {
892 let __result = #call_expr;
893 if __result.is_none() {
894 return unsafe { ::miniextendr_api::error_value::make_rust_condition_value(
895 #error_msg, ::miniextendr_api::error_value::kind::NONE_ERR, ::core::option::Option::None, ::core::option::Option::Some(__miniextendr_call),
896 ) };
897 }
898 ::miniextendr_api::SEXP::nil()
899 }
900 }
901 ReturnHandling::OptionSexp => {
902 let error_msg = ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("`{0}()` returned no value",
fn_name))
})format!("`{fn_name}()` returned no value");
903 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "let");
::quote::__private::push_ident(&mut _s, "__result");
::quote::__private::push_eq(&mut _s);
::quote::ToTokens::to_tokens(&call_expr, &mut _s);
::quote::__private::push_semi(&mut _s);
::quote::__private::push_ident(&mut _s, "match");
::quote::__private::push_ident(&mut _s, "__result");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Some");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "v");
_s
});
::quote::__private::push_fat_arrow(&mut _s);
::quote::__private::push_ident(&mut _s, "v");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "None");
::quote::__private::push_fat_arrow(&mut _s);
::quote::__private::push_ident(&mut _s, "return");
::quote::__private::push_ident(&mut _s, "unsafe");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "error_value");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s,
"make_rust_condition_value");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&error_msg, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "error_value");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "kind");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "NONE_ERR");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "None");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Some");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s,
"__miniextendr_call");
_s
});
::quote::__private::push_comma(&mut _s);
_s
});
_s
});
::quote::__private::push_comma(&mut _s);
_s
});
_s
}quote! {
904 let __result = #call_expr;
905 match __result {
906 ::core::option::Option::Some(v) => v,
907 ::core::option::Option::None => return unsafe { ::miniextendr_api::error_value::make_rust_condition_value(
908 #error_msg, ::miniextendr_api::error_value::kind::NONE_ERR, ::core::option::Option::None, ::core::option::Option::Some(__miniextendr_call),
909 ) },
910 }
911 }
912 }
913 ReturnHandling::OptionIntoR => {
914 let result_ident = ::quote::__private::mk_ident(&::alloc::__export::must_use({
::alloc::fmt::format(format_args!("__result"))
}), ::quote::__private::Option::None)format_ident!("__result");
919 let conversion = self.sexp_conversion_expr(&result_ident, false);
920 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "let");
::quote::ToTokens::to_tokens(&result_ident, &mut _s);
::quote::__private::push_eq(&mut _s);
::quote::ToTokens::to_tokens(&call_expr, &mut _s);
::quote::__private::push_semi(&mut _s);
::quote::ToTokens::to_tokens(&conversion, &mut _s);
_s
}quote! {
921 let #result_ident = #call_expr;
922 #conversion
923 }
924 }
925 ReturnHandling::OptionClassPayload => {
926 let result_ident = ::quote::__private::mk_ident(&::alloc::__export::must_use({
::alloc::fmt::format(format_args!("__result"))
}), ::quote::__private::Option::None)format_ident!("__result");
929 let conversion = self.sexp_conversion_expr(&result_ident, true);
930 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "match");
::quote::ToTokens::to_tokens(&call_expr, &mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Some");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&result_ident, &mut _s);
_s
});
::quote::__private::push_fat_arrow(&mut _s);
::quote::ToTokens::to_tokens(&conversion, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "None");
::quote::__private::push_fat_arrow(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "SEXP");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "nil");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
::quote::__private::push_comma(&mut _s);
_s
});
_s
}quote! {
931 match #call_expr {
932 ::core::option::Option::Some(#result_ident) => #conversion,
933 ::core::option::Option::None => ::miniextendr_api::SEXP::nil(),
934 }
935 }
936 }
937 ReturnHandling::OptionExternalPtr => {
940 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "let");
::quote::__private::push_ident(&mut _s, "__result");
::quote::__private::push_eq(&mut _s);
::quote::ToTokens::to_tokens(&call_expr, &mut _s);
::quote::__private::push_semi(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "into_r");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "IntoR");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "into_sexp");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "__result");
::quote::__private::push_dot(&mut _s);
::quote::__private::push_ident(&mut _s, "map");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "externalptr");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "ExternalPtr");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "new");
_s
});
_s
});
_s
}quote! {
941 let __result = #call_expr;
942 ::miniextendr_api::into_r::IntoR::into_sexp(
943 __result.map(::miniextendr_api::externalptr::ExternalPtr::new)
944 )
945 }
946 }
947 ReturnHandling::ResultUnit => {
948 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "let");
::quote::__private::push_ident(&mut _s, "__result");
::quote::__private::push_eq(&mut _s);
::quote::ToTokens::to_tokens(&call_expr, &mut _s);
::quote::__private::push_semi(&mut _s);
::quote::__private::push_ident(&mut _s, "if");
::quote::__private::push_ident(&mut _s, "let");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Err");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "e");
_s
});
::quote::__private::push_eq(&mut _s);
::quote::__private::push_ident(&mut _s, "__result");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "return");
::quote::__private::push_ident(&mut _s, "unsafe");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "error_value");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s,
"result_err_condition_value");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&err_parts, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Some");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s,
"__miniextendr_call");
_s
});
::quote::__private::push_comma(&mut _s);
_s
});
_s
});
::quote::__private::push_semi(&mut _s);
_s
});
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "SEXP");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "nil");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
_s
}quote! {
949 let __result = #call_expr;
950 if let ::core::result::Result::Err(e) = __result {
951 return unsafe { ::miniextendr_api::error_value::result_err_condition_value(
952 #err_parts, ::core::option::Option::Some(__miniextendr_call),
953 ) };
954 }
955 ::miniextendr_api::SEXP::nil()
956 }
957 }
958 ReturnHandling::ResultSexp => {
959 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "let");
::quote::__private::push_ident(&mut _s, "__result");
::quote::__private::push_eq(&mut _s);
::quote::ToTokens::to_tokens(&call_expr, &mut _s);
::quote::__private::push_semi(&mut _s);
::quote::__private::push_ident(&mut _s, "match");
::quote::__private::push_ident(&mut _s, "__result");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Ok");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "v");
_s
});
::quote::__private::push_fat_arrow(&mut _s);
::quote::__private::push_ident(&mut _s, "v");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Err");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "e");
_s
});
::quote::__private::push_fat_arrow(&mut _s);
::quote::__private::push_ident(&mut _s, "return");
::quote::__private::push_ident(&mut _s, "unsafe");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "error_value");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s,
"result_err_condition_value");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&err_parts, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Some");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s,
"__miniextendr_call");
_s
});
::quote::__private::push_comma(&mut _s);
_s
});
_s
});
::quote::__private::push_comma(&mut _s);
_s
});
_s
}quote! {
960 let __result = #call_expr;
961 match __result {
962 ::core::result::Result::Ok(v) => v,
963 ::core::result::Result::Err(e) => return unsafe { ::miniextendr_api::error_value::result_err_condition_value(
964 #err_parts, ::core::option::Option::Some(__miniextendr_call),
965 ) },
966 }
967 }
968 }
969 ReturnHandling::ResultIntoR => {
970 let result_ident = ::quote::__private::mk_ident(&::alloc::__export::must_use({
::alloc::fmt::format(format_args!("__result"))
}), ::quote::__private::Option::None)format_ident!("__result");
971 let conversion = self.sexp_conversion_expr(&result_ident, true);
972 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "let");
::quote::__private::push_ident(&mut _s, "__result");
::quote::__private::push_eq(&mut _s);
::quote::ToTokens::to_tokens(&call_expr, &mut _s);
::quote::__private::push_semi(&mut _s);
::quote::__private::push_ident(&mut _s, "let");
::quote::ToTokens::to_tokens(&result_ident, &mut _s);
::quote::__private::push_eq(&mut _s);
::quote::__private::push_ident(&mut _s, "match");
::quote::__private::push_ident(&mut _s, "__result");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Ok");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "v");
_s
});
::quote::__private::push_fat_arrow(&mut _s);
::quote::__private::push_ident(&mut _s, "v");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Err");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "e");
_s
});
::quote::__private::push_fat_arrow(&mut _s);
::quote::__private::push_ident(&mut _s, "return");
::quote::__private::push_ident(&mut _s, "unsafe");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "error_value");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s,
"result_err_condition_value");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&err_parts, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Some");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s,
"__miniextendr_call");
_s
});
::quote::__private::push_comma(&mut _s);
_s
});
_s
});
::quote::__private::push_comma(&mut _s);
_s
});
::quote::__private::push_semi(&mut _s);
::quote::ToTokens::to_tokens(&conversion, &mut _s);
_s
}quote! {
973 let __result = #call_expr;
974 let #result_ident = match __result {
975 ::core::result::Result::Ok(v) => v,
976 ::core::result::Result::Err(e) => return unsafe { ::miniextendr_api::error_value::result_err_condition_value(
977 #err_parts, ::core::option::Option::Some(__miniextendr_call),
978 ) },
979 };
980 #conversion
981 }
982 }
983 ReturnHandling::ResultNullOnErr => {
985 let result_ident = ::quote::__private::mk_ident(&::alloc::__export::must_use({
::alloc::fmt::format(format_args!("__result"))
}), ::quote::__private::Option::None)format_ident!("__result");
986 let conversion = self.sexp_conversion_expr(&result_ident, true);
987 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "let");
::quote::__private::push_ident(&mut _s, "__result");
::quote::__private::push_eq(&mut _s);
::quote::ToTokens::to_tokens(&call_expr, &mut _s);
::quote::__private::push_semi(&mut _s);
::quote::__private::push_ident(&mut _s, "match");
::quote::__private::push_ident(&mut _s, "__result");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Ok");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&result_ident, &mut _s);
_s
});
::quote::__private::push_fat_arrow(&mut _s);
::quote::ToTokens::to_tokens(&conversion, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Err");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
_s
});
::quote::__private::push_fat_arrow(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "SEXP");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "nil");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
::quote::__private::push_comma(&mut _s);
_s
});
_s
}quote! {
988 let __result = #call_expr;
989 match __result {
990 ::core::result::Result::Ok(#result_ident) => #conversion,
991 ::core::result::Result::Err(()) => ::miniextendr_api::SEXP::nil(),
992 }
993 }
994 }
995 ReturnHandling::ResultExternalPtr => {
998 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "let");
::quote::__private::push_ident(&mut _s, "__result");
::quote::__private::push_eq(&mut _s);
::quote::ToTokens::to_tokens(&call_expr, &mut _s);
::quote::__private::push_semi(&mut _s);
::quote::__private::push_ident(&mut _s, "let");
::quote::__private::push_ident(&mut _s, "__result");
::quote::__private::push_eq(&mut _s);
::quote::__private::push_ident(&mut _s, "match");
::quote::__private::push_ident(&mut _s, "__result");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Ok");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "v");
_s
});
::quote::__private::push_fat_arrow(&mut _s);
::quote::__private::push_ident(&mut _s, "v");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Err");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "e");
_s
});
::quote::__private::push_fat_arrow(&mut _s);
::quote::__private::push_ident(&mut _s, "return");
::quote::__private::push_ident(&mut _s, "unsafe");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "error_value");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s,
"result_err_condition_value");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&err_parts, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Some");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s,
"__miniextendr_call");
_s
});
::quote::__private::push_comma(&mut _s);
_s
});
_s
});
::quote::__private::push_comma(&mut _s);
_s
});
::quote::__private::push_semi(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "into_r");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "IntoR");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "into_sexp");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "externalptr");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "ExternalPtr");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "new");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "__result");
_s
});
_s
});
_s
}quote! {
999 let __result = #call_expr;
1000 let __result = match __result {
1001 ::core::result::Result::Ok(v) => v,
1002 ::core::result::Result::Err(e) => return unsafe { ::miniextendr_api::error_value::result_err_condition_value(
1003 #err_parts, ::core::option::Option::Some(__miniextendr_call),
1004 ) },
1005 };
1006 ::miniextendr_api::into_r::IntoR::into_sexp(
1007 ::miniextendr_api::externalptr::ExternalPtr::new(__result)
1008 )
1009 }
1010 }
1011 ReturnHandling::AsListOf => {
1012 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "let");
::quote::__private::push_ident(&mut _s, "__result");
::quote::__private::push_eq(&mut _s);
::quote::ToTokens::to_tokens(&call_expr, &mut _s);
::quote::__private::push_semi(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "into_r");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "IntoR");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "into_sexp");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "convert");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "AsList");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "__result");
_s
});
_s
});
_s
}quote! {
1013 let __result = #call_expr;
1014 ::miniextendr_api::into_r::IntoR::into_sexp(
1015 ::miniextendr_api::convert::AsList(__result)
1016 )
1017 }
1018 }
1019 ReturnHandling::AsExternalPtrOf => {
1020 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "let");
::quote::__private::push_ident(&mut _s, "__result");
::quote::__private::push_eq(&mut _s);
::quote::ToTokens::to_tokens(&call_expr, &mut _s);
::quote::__private::push_semi(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "into_r");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "IntoR");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "into_sexp");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "convert");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "AsExternalPtr");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "__result");
_s
});
_s
});
_s
}quote! {
1021 let __result = #call_expr;
1022 ::miniextendr_api::into_r::IntoR::into_sexp(
1023 ::miniextendr_api::convert::AsExternalPtr(__result)
1024 )
1025 }
1026 }
1027 ReturnHandling::AsNativeOf => {
1028 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "let");
::quote::__private::push_ident(&mut _s, "__result");
::quote::__private::push_eq(&mut _s);
::quote::ToTokens::to_tokens(&call_expr, &mut _s);
::quote::__private::push_semi(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "into_r");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "IntoR");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "into_sexp");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "convert");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "AsRNative");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "__result");
_s
});
_s
});
_s
}quote! {
1029 let __result = #call_expr;
1030 ::miniextendr_api::into_r::IntoR::into_sexp(
1031 ::miniextendr_api::convert::AsRNative(__result)
1032 )
1033 }
1034 }
1035 }
1036 }
1037
1038 fn generate_worker_return_handling(
1049 &self,
1050 call_expr: &TokenStream,
1051 ) -> (TokenStream, TokenStream) {
1052 let fn_name = self.message_name();
1053 let err_parts = self.err_parts.expr();
1054
1055 match &self.return_handling {
1056 ReturnHandling::Unit => {
1057 let worker = {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&call_expr, &mut _s);
::quote::__private::push_semi(&mut _s);
_s
}quote! {
1058 #call_expr;
1059 };
1060 let convert = {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "SEXP");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "nil");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
_s
}quote! {
1061 ::miniextendr_api::SEXP::nil()
1062 };
1063 (worker, convert)
1064 }
1065 ReturnHandling::RawSexp => {
1066 let worker = {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&call_expr, &mut _s);
_s
}quote! {
1069 #call_expr
1070 };
1071 let convert = {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "__miniextendr_result");
_s
}quote! {
1072 __miniextendr_result
1073 };
1074 (worker, convert)
1075 }
1076 ReturnHandling::ExternalPtr => {
1077 let worker = {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&call_expr, &mut _s);
_s
}quote! {
1078 #call_expr
1079 };
1080 let unwind_fn = self.worker_conversion_unwind_fn();
1081 let convert = {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&unwind_fn, &mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_or_or(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "into_r");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "IntoR");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "into_sexp");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "externalptr");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "ExternalPtr");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "new");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s,
"__miniextendr_result");
_s
});
_s
});
::quote::__private::push_comma(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Some");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s,
"__miniextendr_call");
_s
});
::quote::__private::push_comma(&mut _s);
_s
});
_s
}quote! {
1082 #unwind_fn(
1083 || ::miniextendr_api::into_r::IntoR::into_sexp(
1084 ::miniextendr_api::externalptr::ExternalPtr::new(__miniextendr_result)
1085 ),
1086 ::core::option::Option::Some(__miniextendr_call),
1087 )
1088 };
1089 (worker, convert)
1090 }
1091 ReturnHandling::IntoR => {
1092 let worker = {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&call_expr, &mut _s);
_s
}quote! {
1093 #call_expr
1094 };
1095 let result_ident = ::quote::__private::mk_ident(&::alloc::__export::must_use({
::alloc::fmt::format(format_args!("__miniextendr_result"))
}), ::quote::__private::Option::None)format_ident!("__miniextendr_result");
1096 let conversion = self.sexp_conversion_expr(&result_ident, true);
1097 let unwind_fn = self.worker_conversion_unwind_fn();
1098 let convert = {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&unwind_fn, &mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_or_or(&mut _s);
::quote::ToTokens::to_tokens(&conversion, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Some");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s,
"__miniextendr_call");
_s
});
::quote::__private::push_comma(&mut _s);
_s
});
_s
}quote! {
1099 #unwind_fn(
1100 || #conversion,
1101 ::core::option::Option::Some(__miniextendr_call),
1102 )
1103 };
1104 (worker, convert)
1105 }
1106 ReturnHandling::OptionUnit => {
1107 let error_msg = ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("`{0}()` returned no value",
fn_name))
})format!("`{fn_name}()` returned no value");
1108 let worker = {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&call_expr, &mut _s);
_s
}quote! { #call_expr };
1110 let convert = {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "if");
::quote::__private::push_ident(&mut _s, "__miniextendr_result");
::quote::__private::push_dot(&mut _s);
::quote::__private::push_ident(&mut _s, "is_none");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "unsafe");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "error_value");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s,
"make_rust_condition_value");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&error_msg, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "error_value");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "kind");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "NONE_ERR");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "None");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Some");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s,
"__miniextendr_call");
_s
});
::quote::__private::push_comma(&mut _s);
_s
});
_s
});
_s
});
::quote::__private::push_ident(&mut _s, "else");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "SEXP");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "nil");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
_s
});
_s
}quote! {
1111 if __miniextendr_result.is_none() {
1112 unsafe { ::miniextendr_api::error_value::make_rust_condition_value(
1113 #error_msg, ::miniextendr_api::error_value::kind::NONE_ERR, ::core::option::Option::None, ::core::option::Option::Some(__miniextendr_call),
1114 ) }
1115 } else {
1116 ::miniextendr_api::SEXP::nil()
1117 }
1118 };
1119 (worker, convert)
1120 }
1121 ReturnHandling::OptionSexp => {
1122 let error_msg = ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("`{0}()` returned no value",
fn_name))
})format!("`{fn_name}()` returned no value");
1123 let worker = {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&call_expr, &mut _s);
_s
}quote! { #call_expr };
1124 let convert = {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "match");
::quote::__private::push_ident(&mut _s, "__miniextendr_result");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Some");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "v");
_s
});
::quote::__private::push_fat_arrow(&mut _s);
::quote::__private::push_ident(&mut _s, "v");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "None");
::quote::__private::push_fat_arrow(&mut _s);
::quote::__private::push_ident(&mut _s, "unsafe");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "error_value");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s,
"make_rust_condition_value");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&error_msg, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "error_value");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "kind");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "NONE_ERR");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "None");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Some");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s,
"__miniextendr_call");
_s
});
::quote::__private::push_comma(&mut _s);
_s
});
_s
});
::quote::__private::push_comma(&mut _s);
_s
});
_s
}quote! {
1125 match __miniextendr_result {
1126 ::core::option::Option::Some(v) => v,
1127 ::core::option::Option::None => unsafe { ::miniextendr_api::error_value::make_rust_condition_value(
1128 #error_msg, ::miniextendr_api::error_value::kind::NONE_ERR, ::core::option::Option::None, ::core::option::Option::Some(__miniextendr_call),
1129 ) },
1130 }
1131 };
1132 (worker, convert)
1133 }
1134 ReturnHandling::OptionIntoR => {
1135 let worker = {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&call_expr, &mut _s);
_s
}quote! { #call_expr };
1141 let result_ident = ::quote::__private::mk_ident(&::alloc::__export::must_use({
::alloc::fmt::format(format_args!("__miniextendr_result"))
}), ::quote::__private::Option::None)format_ident!("__miniextendr_result");
1142 let conversion = self.sexp_conversion_expr(&result_ident, false);
1143 let unwind_fn = self.worker_conversion_unwind_fn();
1144 let convert = {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "let");
::quote::ToTokens::to_tokens(&result_ident, &mut _s);
::quote::__private::push_eq(&mut _s);
::quote::__private::push_ident(&mut _s, "__miniextendr_result");
::quote::__private::push_semi(&mut _s);
::quote::ToTokens::to_tokens(&unwind_fn, &mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_or_or(&mut _s);
::quote::ToTokens::to_tokens(&conversion, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Some");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s,
"__miniextendr_call");
_s
});
_s
});
_s
});
_s
}quote! {
1145 {
1146 let #result_ident = __miniextendr_result;
1147 #unwind_fn(|| #conversion, ::core::option::Option::Some(__miniextendr_call))
1148 }
1149 };
1150 (worker, convert)
1151 }
1152 ReturnHandling::OptionClassPayload => {
1153 let worker = {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&call_expr, &mut _s);
_s
}quote! { #call_expr };
1156 let result_ident = ::quote::__private::mk_ident(&::alloc::__export::must_use({
::alloc::fmt::format(format_args!("__miniextendr_result"))
}), ::quote::__private::Option::None)format_ident!("__miniextendr_result");
1157 let conversion = self.sexp_conversion_expr(&result_ident, true);
1158 let unwind_fn = self.worker_conversion_unwind_fn();
1159 let convert = {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "match");
::quote::__private::push_ident(&mut _s, "__miniextendr_result");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Some");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&result_ident, &mut _s);
_s
});
::quote::__private::push_fat_arrow(&mut _s);
::quote::ToTokens::to_tokens(&unwind_fn, &mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_or_or(&mut _s);
::quote::ToTokens::to_tokens(&conversion, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Some");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s,
"__miniextendr_call");
_s
});
_s
});
::quote::__private::push_comma(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "None");
::quote::__private::push_fat_arrow(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "SEXP");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "nil");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
::quote::__private::push_comma(&mut _s);
_s
});
_s
}quote! {
1160 match __miniextendr_result {
1161 ::core::option::Option::Some(#result_ident) => #unwind_fn(|| #conversion, ::core::option::Option::Some(__miniextendr_call)),
1162 ::core::option::Option::None => ::miniextendr_api::SEXP::nil(),
1163 }
1164 };
1165 (worker, convert)
1166 }
1167 ReturnHandling::OptionExternalPtr => {
1170 let worker = {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&call_expr, &mut _s);
_s
}quote! { #call_expr };
1171 let unwind_fn = self.worker_conversion_unwind_fn();
1172 let convert = {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&unwind_fn, &mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_or_or(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "into_r");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "IntoR");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "into_sexp");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s,
"__miniextendr_result");
::quote::__private::push_dot(&mut _s);
::quote::__private::push_ident(&mut _s, "map");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "externalptr");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "ExternalPtr");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "new");
_s
});
_s
});
::quote::__private::push_comma(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Some");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s,
"__miniextendr_call");
_s
});
::quote::__private::push_comma(&mut _s);
_s
});
_s
}quote! {
1173 #unwind_fn(
1174 || ::miniextendr_api::into_r::IntoR::into_sexp(
1175 __miniextendr_result.map(::miniextendr_api::externalptr::ExternalPtr::new)
1176 ),
1177 ::core::option::Option::Some(__miniextendr_call),
1178 )
1179 };
1180 (worker, convert)
1181 }
1182 ReturnHandling::ResultUnit => {
1183 let worker = {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&call_expr, &mut _s);
_s
}quote! { #call_expr };
1184 let convert = {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "match");
::quote::__private::push_ident(&mut _s, "__miniextendr_result");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Ok");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
_s
});
::quote::__private::push_fat_arrow(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "SEXP");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "nil");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
::quote::__private::push_comma(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Err");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "e");
_s
});
::quote::__private::push_fat_arrow(&mut _s);
::quote::__private::push_ident(&mut _s, "unsafe");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "error_value");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s,
"result_err_condition_value");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&err_parts, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Some");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s,
"__miniextendr_call");
_s
});
::quote::__private::push_comma(&mut _s);
_s
});
_s
});
::quote::__private::push_comma(&mut _s);
_s
});
_s
}quote! {
1185 match __miniextendr_result {
1186 ::core::result::Result::Ok(()) => ::miniextendr_api::SEXP::nil(),
1187 ::core::result::Result::Err(e) => unsafe { ::miniextendr_api::error_value::result_err_condition_value(
1188 #err_parts, ::core::option::Option::Some(__miniextendr_call),
1189 ) },
1190 }
1191 };
1192 (worker, convert)
1193 }
1194 ReturnHandling::ResultSexp => {
1195 let worker = {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&call_expr, &mut _s);
_s
}quote! { #call_expr };
1196 let convert = {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "match");
::quote::__private::push_ident(&mut _s, "__miniextendr_result");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Ok");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "v");
_s
});
::quote::__private::push_fat_arrow(&mut _s);
::quote::__private::push_ident(&mut _s, "v");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Err");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "e");
_s
});
::quote::__private::push_fat_arrow(&mut _s);
::quote::__private::push_ident(&mut _s, "unsafe");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "error_value");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s,
"result_err_condition_value");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&err_parts, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Some");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s,
"__miniextendr_call");
_s
});
::quote::__private::push_comma(&mut _s);
_s
});
_s
});
::quote::__private::push_comma(&mut _s);
_s
});
_s
}quote! {
1197 match __miniextendr_result {
1198 ::core::result::Result::Ok(v) => v,
1199 ::core::result::Result::Err(e) => unsafe { ::miniextendr_api::error_value::result_err_condition_value(
1200 #err_parts, ::core::option::Option::Some(__miniextendr_call),
1201 ) },
1202 }
1203 };
1204 (worker, convert)
1205 }
1206 ReturnHandling::ResultIntoR => {
1207 let worker = {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&call_expr, &mut _s);
_s
}quote! { #call_expr };
1208 let result_ident = ::quote::__private::mk_ident(&::alloc::__export::must_use({
::alloc::fmt::format(format_args!("__miniextendr_result"))
}), ::quote::__private::Option::None)format_ident!("__miniextendr_result");
1209 let conversion = self.sexp_conversion_expr(&result_ident, true);
1210 let unwind_fn = self.worker_conversion_unwind_fn();
1211 let convert = {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "match");
::quote::__private::push_ident(&mut _s, "__miniextendr_result");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Ok");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&result_ident, &mut _s);
_s
});
::quote::__private::push_fat_arrow(&mut _s);
::quote::ToTokens::to_tokens(&unwind_fn, &mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_or_or(&mut _s);
::quote::ToTokens::to_tokens(&conversion, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Some");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s,
"__miniextendr_call");
_s
});
::quote::__private::push_comma(&mut _s);
_s
});
::quote::__private::push_comma(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Err");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "e");
_s
});
::quote::__private::push_fat_arrow(&mut _s);
::quote::__private::push_ident(&mut _s, "unsafe");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "error_value");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s,
"result_err_condition_value");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&err_parts, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Some");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s,
"__miniextendr_call");
_s
});
::quote::__private::push_comma(&mut _s);
_s
});
_s
});
::quote::__private::push_comma(&mut _s);
_s
});
_s
}quote! {
1212 match __miniextendr_result {
1213 ::core::result::Result::Ok(#result_ident) => #unwind_fn(
1214 || #conversion,
1215 ::core::option::Option::Some(__miniextendr_call),
1216 ),
1217 ::core::result::Result::Err(e) => unsafe { ::miniextendr_api::error_value::result_err_condition_value(
1218 #err_parts, ::core::option::Option::Some(__miniextendr_call),
1219 ) },
1220 }
1221 };
1222 (worker, convert)
1223 }
1224 ReturnHandling::ResultNullOnErr => {
1227 let result_ident = ::quote::__private::mk_ident(&::alloc::__export::must_use({
::alloc::fmt::format(format_args!("__miniextendr_result"))
}), ::quote::__private::Option::None)format_ident!("__miniextendr_result");
1228 let unwind_fn = self.worker_conversion_unwind_fn();
1229 let worker = {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&call_expr, &mut _s);
_s
}quote! { #call_expr };
1230 let conversion = self.sexp_conversion_expr(&result_ident, true);
1231 let convert = {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "match");
::quote::__private::push_ident(&mut _s, "__miniextendr_result");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Ok");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&result_ident, &mut _s);
_s
});
::quote::__private::push_fat_arrow(&mut _s);
::quote::ToTokens::to_tokens(&unwind_fn, &mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_or_or(&mut _s);
::quote::ToTokens::to_tokens(&conversion, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Some");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s,
"__miniextendr_call");
_s
});
_s
});
::quote::__private::push_comma(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Err");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
_s
});
::quote::__private::push_fat_arrow(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "SEXP");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "nil");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
::quote::__private::push_comma(&mut _s);
_s
});
_s
}quote! {
1232 match __miniextendr_result {
1233 ::core::result::Result::Ok(#result_ident) => #unwind_fn(|| #conversion, ::core::option::Option::Some(__miniextendr_call)),
1234 ::core::result::Result::Err(()) => ::miniextendr_api::SEXP::nil(),
1235 }
1236 };
1237 (worker, convert)
1238 }
1239 ReturnHandling::ResultExternalPtr => {
1242 let worker = {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&call_expr, &mut _s);
_s
}quote! { #call_expr };
1243 let unwind_fn = self.worker_conversion_unwind_fn();
1244 let convert = {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "match");
::quote::__private::push_ident(&mut _s, "__miniextendr_result");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Ok");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "v");
_s
});
::quote::__private::push_fat_arrow(&mut _s);
::quote::ToTokens::to_tokens(&unwind_fn, &mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_or_or(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "into_r");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "IntoR");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "into_sexp");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "externalptr");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "ExternalPtr");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "new");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "v");
_s
});
_s
});
::quote::__private::push_comma(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Some");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s,
"__miniextendr_call");
_s
});
::quote::__private::push_comma(&mut _s);
_s
});
::quote::__private::push_comma(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Err");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "e");
_s
});
::quote::__private::push_fat_arrow(&mut _s);
::quote::__private::push_ident(&mut _s, "unsafe");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "error_value");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s,
"result_err_condition_value");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&err_parts, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Some");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s,
"__miniextendr_call");
_s
});
::quote::__private::push_comma(&mut _s);
_s
});
_s
});
::quote::__private::push_comma(&mut _s);
_s
});
_s
}quote! {
1245 match __miniextendr_result {
1246 ::core::result::Result::Ok(v) => #unwind_fn(
1247 || ::miniextendr_api::into_r::IntoR::into_sexp(
1248 ::miniextendr_api::externalptr::ExternalPtr::new(v)
1249 ),
1250 ::core::option::Option::Some(__miniextendr_call),
1251 ),
1252 ::core::result::Result::Err(e) => unsafe { ::miniextendr_api::error_value::result_err_condition_value(
1253 #err_parts, ::core::option::Option::Some(__miniextendr_call),
1254 ) },
1255 }
1256 };
1257 (worker, convert)
1258 }
1259 ReturnHandling::AsListOf => {
1260 let worker = {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&call_expr, &mut _s);
_s
}quote! { #call_expr };
1261 let unwind_fn = self.worker_conversion_unwind_fn();
1262 let convert = {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&unwind_fn, &mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_or_or(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "into_r");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "IntoR");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "into_sexp");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "convert");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "AsList");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s,
"__miniextendr_result");
_s
});
_s
});
::quote::__private::push_comma(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Some");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s,
"__miniextendr_call");
_s
});
::quote::__private::push_comma(&mut _s);
_s
});
_s
}quote! {
1263 #unwind_fn(
1264 || ::miniextendr_api::into_r::IntoR::into_sexp(
1265 ::miniextendr_api::convert::AsList(__miniextendr_result)
1266 ),
1267 ::core::option::Option::Some(__miniextendr_call),
1268 )
1269 };
1270 (worker, convert)
1271 }
1272 ReturnHandling::AsExternalPtrOf => {
1273 let worker = {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&call_expr, &mut _s);
_s
}quote! { #call_expr };
1274 let unwind_fn = self.worker_conversion_unwind_fn();
1275 let convert = {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&unwind_fn, &mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_or_or(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "into_r");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "IntoR");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "into_sexp");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "convert");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "AsExternalPtr");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s,
"__miniextendr_result");
_s
});
_s
});
::quote::__private::push_comma(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Some");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s,
"__miniextendr_call");
_s
});
::quote::__private::push_comma(&mut _s);
_s
});
_s
}quote! {
1276 #unwind_fn(
1277 || ::miniextendr_api::into_r::IntoR::into_sexp(
1278 ::miniextendr_api::convert::AsExternalPtr(__miniextendr_result)
1279 ),
1280 ::core::option::Option::Some(__miniextendr_call),
1281 )
1282 };
1283 (worker, convert)
1284 }
1285 ReturnHandling::AsNativeOf => {
1286 let worker = {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&call_expr, &mut _s);
_s
}quote! { #call_expr };
1287 let unwind_fn = self.worker_conversion_unwind_fn();
1288 let convert = {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&unwind_fn, &mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_or_or(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "into_r");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "IntoR");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "into_sexp");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "convert");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "AsRNative");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s,
"__miniextendr_result");
_s
});
_s
});
::quote::__private::push_comma(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Some");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s,
"__miniextendr_call");
_s
});
::quote::__private::push_comma(&mut _s);
_s
});
_s
}quote! {
1289 #unwind_fn(
1290 || ::miniextendr_api::into_r::IntoR::into_sexp(
1291 ::miniextendr_api::convert::AsRNative(__miniextendr_result)
1292 ),
1293 ::core::option::Option::Some(__miniextendr_call),
1294 )
1295 };
1296 (worker, convert)
1297 }
1298 ReturnHandling::SelfHandle
1299 | ReturnHandling::SelfHandleResult
1300 | ReturnHandling::SelfHandleOption => {
1301 {
::core::panicking::panic_fmt(format_args!("internal error: entered unreachable code: {0}",
format_args!("ReturnHandling::SelfHandle* is instance-only and always uses the main thread")));
}unreachable!(
1306 "ReturnHandling::SelfHandle* is instance-only and always uses the main thread"
1307 )
1308 }
1309 }
1310 }
1311
1312 fn worker_conversion_unwind_fn(&self) -> TokenStream {
1315 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "unwind_protect");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "with_r_unwind_protect");
_s
}quote! { ::miniextendr_api::unwind_protect::with_r_unwind_protect }
1316 }
1317
1318 fn sexp_conversion_expr(
1330 &self,
1331 result_ident: &syn::Ident,
1332 result_holds_unwrapped: bool,
1333 ) -> TokenStream {
1334 if self.strict {
1335 let inner_ty = match &self.output {
1337 syn::ReturnType::Type(_, ty) => {
1338 let ty = ty.as_ref();
1339 if result_holds_unwrapped
1342 && let syn::Type::Path(p) = ty
1343 && let Some(seg) = p.path.segments.last()
1344 {
1345 let name = seg.ident.to_string();
1346 if (name == "Option" || name == "Result")
1347 && let Some(inner) = first_type_argument(seg)
1348 {
1349 Some(inner)
1350 } else {
1351 Some(ty)
1352 }
1353 } else {
1354 Some(ty)
1355 }
1356 }
1357 syn::ReturnType::Default => None,
1358 };
1359
1360 if let Some(inner_ty) = inner_ty.and_then(|ty| {
1361 crate::return_type_analysis::strict_conversion_for_type(ty, result_ident)
1362 }) {
1363 return inner_ty;
1364 }
1365 }
1366
1367 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "miniextendr_api");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "into_r");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "IntoR");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "into_sexp");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&result_ident, &mut _s);
_s
});
_s
}quote! { ::miniextendr_api::into_r::IntoR::into_sexp(#result_ident) }
1368 }
1369
1370 fn generate_call_method_def(&self) -> TokenStream {
1376 let fn_ident = &self.fn_ident;
1377 let c_ident = &self.c_ident;
1378 let num_args = if self.skip_wrapper {
1382 self.inputs
1383 .iter()
1384 .filter(|arg| #[allow(non_exhaustive_omitted_patterns)] match arg {
syn::FnArg::Typed(_) => true,
_ => false,
}matches!(arg, syn::FnArg::Typed(_)))
1385 .count()
1386 } else {
1387 let (c_params, _, _) = self.build_c_params();
1388 c_params.len()
1389 };
1390 let call_method_def_ident = self.call_method_def_ident.clone().unwrap_or_else(|| {
1392 if let Some(ref type_ident) = self.type_context {
1393 match ::quote::__private::IdentFragmentAdapter(&type_ident) {
arg =>
match ::quote::__private::IdentFragmentAdapter(&fn_ident) {
arg =>
::quote::__private::mk_ident(&::alloc::__export::must_use({
::alloc::fmt::format(format_args!("call_method_def_{0}_{1}",
arg, arg))
}),
::quote::__private::Option::None.or(arg.span()).or(arg.span())),
},
}format_ident!("call_method_def_{}_{}", type_ident, fn_ident)
1394 } else {
1395 match ::quote::__private::IdentFragmentAdapter(&fn_ident) {
arg =>
::quote::__private::mk_ident(&::alloc::__export::must_use({
::alloc::fmt::format(format_args!("call_method_def_{0}",
arg))
}), ::quote::__private::Option::None.or(arg.span())),
}format_ident!("call_method_def_{}", fn_ident)
1396 }
1397 });
1398
1399 let registration =
1400 crate::call_method_def::call_method_def(&call_method_def_ident, c_ident, num_args);
1401
1402 let item_label = if let Some(ref type_ident) = self.type_context {
1403 ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("`{0}::{1}`", type_ident, fn_ident))
})format!("`{}::{}`", type_ident, fn_ident)
1404 } else {
1405 ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("`{0}`", fn_ident))
})format!("`{}`", fn_ident)
1406 };
1407 let doc = ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("R call method definition for {0} (C wrapper: [`{1}`]).",
item_label, c_ident))
})format!(
1408 "R call method definition for {} (C wrapper: [`{}`]).",
1409 item_label, c_ident
1410 );
1411 let doc_example = ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("Value: `R_CallMethodDef {{ name: \"{0}\", numArgs: {1}, fun: <DL_FUNC> }}`",
c_ident, num_args))
})format!(
1412 "Value: `R_CallMethodDef {{ name: \"{}\", numArgs: {}, fun: <DL_FUNC> }}`",
1413 c_ident, num_args
1414 );
1415 let source_loc_doc = crate::source_location_doc(self.fn_ident.span());
1416
1417 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_pound(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Bracket,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "doc");
::quote::__private::push_eq(&mut _s);
::quote::ToTokens::to_tokens(&doc, &mut _s);
_s
});
::quote::__private::push_pound(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Bracket,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "doc");
::quote::__private::push_eq(&mut _s);
::quote::ToTokens::to_tokens(&doc_example, &mut _s);
_s
});
::quote::__private::push_pound(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Bracket,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "doc");
::quote::__private::push_eq(&mut _s);
::quote::ToTokens::to_tokens(&source_loc_doc, &mut _s);
_s
});
::quote::__private::push_pound(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Bracket,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "doc");
::quote::__private::push_eq(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "concat");
::quote::__private::push_bang(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::parse(&mut _s,
"\"Generated from source file `\"");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "file");
::quote::__private::push_bang(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
::quote::__private::push_comma(&mut _s);
::quote::__private::parse(&mut _s, "\"`.\"");
_s
});
_s
});
::quote::ToTokens::to_tokens(®istration, &mut _s);
_s
}quote! {
1418 #[doc = #doc]
1419 #[doc = #doc_example]
1420 #[doc = #source_loc_doc]
1421 #[doc = ::core::concat!("Generated from source file `", ::core::file!(), "`.")]
1422 #registration
1423 }
1424 }
1425
1426 fn generate_doc_comment(&self, thread_info: &str) -> String {
1431 let item = match self.type_context {
1432 Some(ref type_ident) => ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("{0}::{1}", type_ident,
self.fn_ident))
})format!("{}::{}", type_ident, self.fn_ident),
1433 None => self.fn_ident.to_string(),
1434 };
1435 match self.r_wrapper_const {
1436 Some(ref r_wrapper_const) => ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("C wrapper for [`{0}`] ({1}). See [`{2}`] for R wrapper.",
item, thread_info, r_wrapper_const))
})format!(
1437 "C wrapper for [`{item}`] ({thread_info}). See [`{r_wrapper_const}`] for R wrapper."
1438 ),
1439 None => ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("C wrapper for [`{0}`] ({1}).",
item, thread_info))
})format!("C wrapper for [`{item}`] ({thread_info})."),
1440 }
1441 }
1442}
1443
1444pub struct CWrapperContextBuilder {
1453 fn_ident: syn::Ident,
1455 r_name: Option<String>,
1457 c_ident: syn::Ident,
1459 r_wrapper_const: Option<syn::Ident>,
1461 inputs: syn::punctuated::Punctuated<syn::FnArg, ::syn::token::Commasyn::Token![,]>,
1463 inferred_signature: Option<TokenStream>,
1464 output: syn::ReturnType,
1466 pre_call: Vec<TokenStream>,
1468 post_conversion: Vec<TokenStream>,
1470 call_expr: Option<TokenStream>,
1472 thread_strategy: Option<ThreadStrategy>,
1474 return_handling: Option<ReturnHandling>,
1476 coerce_all: bool,
1478 coerce_params: Vec<String>,
1480 check_interrupt: bool,
1482 rng: bool,
1484 cfg_attrs: Vec<syn::Attribute>,
1486 type_context: Option<syn::Ident>,
1488 has_self: bool,
1490 call_method_def_ident: Option<syn::Ident>,
1492 strict: bool,
1494 err_parts: ErrPartsMode,
1496 match_arg_several_ok_params: Vec<String>,
1500 layered_choice_params: Vec<(String, crate::rust_conversion_builder::ChoiceLeaf)>,
1503 no_na_params: Vec<(String, Option<String>)>,
1505 param_markers: Vec<(String, Vec<crate::type_inspect::ParamMarker>)>,
1508 formals: crate::r_wrapper_builder::Formals,
1511 preserve_param_names: bool,
1513 vis: syn::Visibility,
1515 generics: syn::Generics,
1517 skip_wrapper: bool,
1519}
1520
1521impl CWrapperContextBuilder {
1522 pub fn r_name(mut self, r_name: String) -> Self {
1526 self.r_name = Some(r_name);
1527 self
1528 }
1529
1530 pub fn r_wrapper_const(mut self, ident: syn::Ident) -> Self {
1533 self.r_wrapper_const = Some(ident);
1534 self
1535 }
1536
1537 pub fn inputs(
1540 mut self,
1541 inputs: syn::punctuated::Punctuated<syn::FnArg, ::syn::token::Commasyn::Token![,]>,
1542 ) -> Self {
1543 self.inputs = inputs;
1544 self
1545 }
1546
1547 pub fn inferred_signature(mut self, callable: TokenStream) -> Self {
1549 self.inferred_signature = Some(callable);
1550 self
1551 }
1552
1553 pub fn output(mut self, output: syn::ReturnType) -> Self {
1556 self.output = output;
1557 self
1558 }
1559
1560 pub fn pre_call(mut self, stmts: Vec<TokenStream>) -> Self {
1563 self.pre_call = stmts;
1564 self
1565 }
1566
1567 pub fn post_conversion(mut self, stmts: Vec<TokenStream>) -> Self {
1569 self.post_conversion = stmts;
1570 self
1571 }
1572
1573 pub fn call_expr(mut self, expr: TokenStream) -> Self {
1576 self.call_expr = Some(expr);
1577 self
1578 }
1579
1580 pub fn thread_strategy(mut self, strategy: ThreadStrategy) -> Self {
1582 self.thread_strategy = Some(strategy);
1583 self
1584 }
1585
1586 pub fn return_handling(mut self, handling: ReturnHandling) -> Self {
1589 self.return_handling = Some(handling);
1590 self
1591 }
1592
1593 pub fn coerce_all(mut self) -> Self {
1595 self.coerce_all = true;
1596 self
1597 }
1598
1599 pub fn with_coerce_param(mut self, param_name: String) -> Self {
1601 self.coerce_params.push(param_name);
1602 self
1603 }
1604
1605 pub fn check_interrupt(mut self) -> Self {
1607 self.check_interrupt = true;
1608 self
1609 }
1610
1611 pub fn rng(mut self) -> Self {
1613 self.rng = true;
1614 self
1615 }
1616
1617 pub fn cfg_attrs(mut self, attrs: Vec<syn::Attribute>) -> Self {
1619 self.cfg_attrs = attrs;
1620 self
1621 }
1622
1623 pub fn type_context(mut self, type_ident: syn::Ident) -> Self {
1626 self.type_context = Some(type_ident);
1627 self
1628 }
1629
1630 pub fn has_self(mut self) -> Self {
1633 self.has_self = true;
1634 self
1635 }
1636
1637 pub fn strict(mut self) -> Self {
1640 self.strict = true;
1641 self
1642 }
1643
1644 pub fn err_parts(mut self, mode: ErrPartsMode) -> Self {
1647 self.err_parts = mode;
1648 self
1649 }
1650
1651 pub fn match_arg_several_ok(mut self, param_name: String) -> Self {
1658 self.match_arg_several_ok_params.push(param_name);
1659 self
1660 }
1661
1662 pub fn layered_choice(
1669 mut self,
1670 param_name: String,
1671 leaf: crate::rust_conversion_builder::ChoiceLeaf,
1672 ) -> Self {
1673 self.layered_choice_params.push((param_name, leaf));
1674 self
1675 }
1676
1677 pub fn no_na(mut self, param_name: String, message: Option<String>) -> Self {
1686 self.no_na_params.push((param_name, message));
1687 self
1688 }
1689
1690 pub fn param_markers(
1695 mut self,
1696 param_name: String,
1697 markers: Vec<crate::type_inspect::ParamMarker>,
1698 ) -> Self {
1699 self.param_markers.push((param_name, markers));
1700 self
1701 }
1702
1703 pub fn formals(mut self, formals: crate::r_wrapper_builder::Formals) -> Self {
1707 self.formals = formals;
1708 self
1709 }
1710
1711 pub fn call_method_def_ident(mut self, ident: syn::Ident) -> Self {
1717 self.call_method_def_ident = Some(ident);
1718 self
1719 }
1720
1721 pub fn preserve_param_names(mut self) -> Self {
1727 self.preserve_param_names = true;
1728 self
1729 }
1730
1731 pub fn vis(mut self, vis: syn::Visibility) -> Self {
1736 self.vis = vis;
1737 self
1738 }
1739
1740 pub fn generics(mut self, generics: syn::Generics) -> Self {
1745 self.generics = generics;
1746 self
1747 }
1748
1749 pub fn skip_wrapper(mut self) -> Self {
1758 self.skip_wrapper = true;
1759 self
1760 }
1761
1762 pub fn build(self) -> CWrapperContext {
1772 let call_expr = self
1773 .call_expr
1774 .expect("call_expr is required for CWrapperContext");
1775
1776 let thread_strategy = self.thread_strategy.unwrap_or(ThreadStrategy::MainThread);
1779
1780 let return_handling = self
1782 .return_handling
1783 .unwrap_or_else(|| detect_return_handling(&self.output, None));
1784
1785 CWrapperContext {
1786 fn_ident: self.fn_ident,
1787 r_name: self.r_name,
1788 c_ident: self.c_ident,
1789 r_wrapper_const: self.r_wrapper_const,
1790 inputs: self.inputs,
1791 inferred_signature: self.inferred_signature,
1792 output: self.output,
1793 pre_call: self.pre_call,
1794 post_conversion: self.post_conversion,
1795 call_expr,
1796 thread_strategy,
1797 return_handling,
1798 coerce_all: self.coerce_all,
1799 coerce_params: self.coerce_params,
1800 check_interrupt: self.check_interrupt,
1801 rng: self.rng,
1802 cfg_attrs: self.cfg_attrs,
1803 type_context: self.type_context,
1804 has_self: self.has_self,
1805 call_method_def_ident: self.call_method_def_ident,
1806 strict: self.strict,
1807 err_parts: self.err_parts,
1808 match_arg_several_ok_params: self.match_arg_several_ok_params,
1809 layered_choice_params: self.layered_choice_params,
1810 no_na_params: self.no_na_params,
1811 param_markers: self.param_markers,
1812 formals: self.formals,
1813 preserve_param_names: self.preserve_param_names,
1814 vis: self.vis,
1815 generics: self.generics,
1816 skip_wrapper: self.skip_wrapper,
1817 }
1818 }
1819}
1820
1821pub fn detect_return_handling(
1831 output: &syn::ReturnType,
1832 wrap: Option<&crate::return_wrap::ReturnWrap>,
1833) -> ReturnHandling {
1834 match output {
1835 syn::ReturnType::Default => ReturnHandling::Unit,
1836 syn::ReturnType::Type(_, ty) => match detect_return_handling_from_type(ty) {
1837 ReturnHandling::OptionIntoR if wrap.is_some_and(|wrap| wrap.is_optional_class()) => {
1838 ReturnHandling::OptionClassPayload
1839 }
1840 handling => handling,
1841 },
1842 }
1843}
1844
1845fn detect_return_handling_from_type(ty: &syn::Type) -> ReturnHandling {
1859 match ty {
1860 syn::Type::Tuple(t) if t.elems.is_empty() => ReturnHandling::Unit,
1862
1863 syn::Type::Path(p)
1865 if p.path
1866 .segments
1867 .last()
1868 .map(|s| s.ident == "Self")
1869 .unwrap_or(false) =>
1870 {
1871 ReturnHandling::ExternalPtr
1872 }
1873
1874 syn::Type::Path(p)
1876 if p.path
1877 .segments
1878 .last()
1879 .map(|s| s.ident == "SEXP")
1880 .unwrap_or(false) =>
1881 {
1882 ReturnHandling::RawSexp
1883 }
1884
1885 syn::Type::Path(p)
1887 if p.path
1888 .segments
1889 .last()
1890 .map(|s| s.ident == "Option")
1891 .unwrap_or(false) =>
1892 {
1893 if let Some(inner_ty) = first_type_argument(p.path.segments.last().unwrap()) {
1894 match inner_ty {
1895 syn::Type::Tuple(t) if t.elems.is_empty() => ReturnHandling::OptionUnit,
1896 syn::Type::Path(ip)
1897 if ip
1898 .path
1899 .segments
1900 .last()
1901 .map(|s| s.ident == "SEXP")
1902 .unwrap_or(false) =>
1903 {
1904 ReturnHandling::OptionSexp
1905 }
1906 syn::Type::Path(ip)
1911 if ip
1912 .path
1913 .segments
1914 .last()
1915 .map(|s| s.ident == "Self")
1916 .unwrap_or(false) =>
1917 {
1918 ReturnHandling::OptionExternalPtr
1919 }
1920 _ => ReturnHandling::OptionIntoR,
1921 }
1922 } else {
1923 ReturnHandling::OptionIntoR
1924 }
1925 }
1926
1927 syn::Type::Path(p)
1929 if p.path
1930 .segments
1931 .last()
1932 .map(|s| s.ident == "Result")
1933 .unwrap_or(false) =>
1934 {
1935 let seg = p.path.segments.last().unwrap();
1936 let err_is_unit = crate::second_type_argument(seg)
1939 .is_some_and(|ty| #[allow(non_exhaustive_omitted_patterns)] match ty {
syn::Type::Tuple(t) if t.elems.is_empty() => true,
_ => false,
}matches!(ty, syn::Type::Tuple(t) if t.elems.is_empty()));
1940 if err_is_unit {
1941 return ReturnHandling::ResultNullOnErr;
1942 }
1943 if let Some(ok_ty) = first_type_argument(seg) {
1944 match ok_ty {
1945 syn::Type::Tuple(t) if t.elems.is_empty() => ReturnHandling::ResultUnit,
1946 syn::Type::Path(ip)
1947 if ip
1948 .path
1949 .segments
1950 .last()
1951 .map(|s| s.ident == "SEXP")
1952 .unwrap_or(false) =>
1953 {
1954 ReturnHandling::ResultSexp
1955 }
1956 syn::Type::Path(ip)
1960 if ip
1961 .path
1962 .segments
1963 .last()
1964 .map(|s| s.ident == "Self")
1965 .unwrap_or(false) =>
1966 {
1967 ReturnHandling::ResultExternalPtr
1968 }
1969 _ => ReturnHandling::ResultIntoR,
1970 }
1971 } else {
1972 ReturnHandling::ResultIntoR
1973 }
1974 }
1975
1976 _ => ReturnHandling::IntoR,
1978 }
1979}
1980
1981fn first_type_argument(seg: &syn::PathSegment) -> Option<&syn::Type> {
1986 if let syn::PathArguments::AngleBracketed(ab) = &seg.arguments {
1987 for arg in ab.args.iter() {
1988 if let syn::GenericArgument::Type(ty) = arg {
1989 return Some(ty);
1990 }
1991 }
1992 }
1993 None
1994}
1995
1996#[cfg(test)]
1997mod tests;