// ⚠️ GENERATED CODE ⚠️ - this entire file was generated by the `roc glue` CLI command #![allow(unused_unsafe)] #![allow(unused_variables)] #![allow(dead_code)] #![allow(unused_mut)] #![allow(non_snake_case)] #![allow(non_camel_case_types)] #![allow(non_upper_case_globals)] #![allow(clippy::undocumented_unsafe_blocks)] #![allow(clippy::redundant_static_lifetimes)] #![allow(clippy::unused_unit)] #![allow(clippy::missing_safety_doc)] #![allow(clippy::let_and_return)] #![allow(clippy::missing_safety_doc)] #![allow(clippy::redundant_static_lifetimes)] #![allow(clippy::needless_borrow)] #![allow(clippy::clone_on_copy)] type Op_StderrWrite = roc_std::RocStr; type Op_StdoutWrite = roc_std::RocStr; type TODO_roc_function_69 = roc_std::RocStr; type TODO_roc_function_70 = roc_std::RocStr; #[cfg(any( target_arch = "arm", target_arch = "aarch64", target_arch = "wasm32", target_arch = "x86", target_arch = "x86_64" ))] #[derive(Clone, Copy, PartialEq, PartialOrd, Eq, Ord, Hash)] #[repr(u8)] pub enum discriminant_Op { Done = 0, StderrWrite = 1, StdoutWrite = 2, } impl core::fmt::Debug for discriminant_Op { fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { match self { Self::Done => f.write_str("discriminant_Op::Done"), Self::StderrWrite => f.write_str("discriminant_Op::StderrWrite"), Self::StdoutWrite => f.write_str("discriminant_Op::StdoutWrite"), } } } #[cfg(any( target_arch = "arm", target_arch = "aarch64", target_arch = "wasm32", target_arch = "x86", target_arch = "x86_64" ))] #[repr(transparent)] pub struct Op { pointer: *mut union_Op, } #[cfg(any( target_arch = "arm", target_arch = "aarch64", target_arch = "wasm32", target_arch = "x86", target_arch = "x86_64" ))] #[repr(C)] union union_Op { StderrWrite: core::mem::ManuallyDrop, StdoutWrite: core::mem::ManuallyDrop, _sizer: [u8; 8], } #[cfg(any( target_arch = "arm", target_arch = "arm", target_arch = "aarch64", target_arch = "aarch64", target_arch = "wasm32", target_arch = "wasm32", target_arch = "x86", target_arch = "x86", target_arch = "x86_64", target_arch = "x86_64" ))] //TODO HAS CLOSURE 2 #[cfg(any( target_arch = "arm", target_arch = "aarch64", target_arch = "wasm32", target_arch = "x86", target_arch = "x86_64" ))] #[repr(C)] pub struct RocFunction_66 { pub closure_data: Vec, } impl RocFunction_66 { pub fn force_thunk(mut self, arg_0: ()) -> Op { extern "C" { fn roc__mainForHost_0_caller(arg_0: &(), closure_data: *mut u8, output: *mut Op); } let mut output = std::mem::MaybeUninit::uninit(); unsafe { roc__mainForHost_0_caller(&arg_0, self.closure_data.as_mut_ptr(), output.as_mut_ptr()) }; unsafe { output.assume_init() } } } #[cfg(any( target_arch = "arm", target_arch = "aarch64", target_arch = "wasm32", target_arch = "x86", target_arch = "x86_64" ))] #[repr(C)] pub struct RocFunction_67 { pub closure_data: Vec, } impl RocFunction_67 { pub fn force_thunk(mut self, arg_0: ()) -> Op { extern "C" { fn roc__mainForHost_1_caller(arg_0: &(), closure_data: *mut u8, output: *mut Op); } let mut output = std::mem::MaybeUninit::uninit(); unsafe { roc__mainForHost_1_caller(&arg_0, self.closure_data.as_mut_ptr(), output.as_mut_ptr()) }; unsafe { output.assume_init() } } } impl Op { #[cfg(any( target_arch = "arm", target_arch = "aarch64", target_arch = "wasm32", target_arch = "x86", target_arch = "x86_64" ))] #[inline(always)] fn storage(&self) -> Option<&core::cell::Cell> { let mask = match std::mem::size_of::() { 4 => 0b11, 8 => 0b111, _ => unreachable!(), }; // NOTE: pointer provenance is probably lost here let unmasked_address = (self.pointer as usize) & !mask; let untagged = unmasked_address as *const core::cell::Cell; if untagged.is_null() { None } else { unsafe { Some(&*untagged.sub(1)) } } } #[cfg(any(target_arch = "arm", target_arch = "wasm32", target_arch = "x86"))] /// Returns which variant this tag union holds. Note that this never includes a payload! pub fn discriminant(&self) -> discriminant_Op { // The discriminant is stored in the unused bytes at the end of the recursive pointer unsafe { core::mem::transmute::((self.pointer as u8) & 0b11) } } #[cfg(any(target_arch = "arm", target_arch = "wasm32", target_arch = "x86"))] /// Internal helper fn tag_discriminant(pointer: *mut union_Op, discriminant: discriminant_Op) -> *mut union_Op { // The discriminant is stored in the unused bytes at the end of the union pointer let untagged = (pointer as usize) & (!0b11 as usize); let tagged = untagged | (discriminant as usize); tagged as *mut union_Op } #[cfg(any(target_arch = "arm", target_arch = "wasm32", target_arch = "x86"))] /// Internal helper fn union_pointer(&self) -> *mut union_Op { // The discriminant is stored in the unused bytes at the end of the union pointer ((self.pointer as usize) & (!0b11 as usize)) as *mut union_Op } #[cfg(any( target_arch = "arm", target_arch = "aarch64", target_arch = "wasm32", target_arch = "x86", target_arch = "x86_64" ))] /// A tag named Done, which has no payload. pub const Done: Self = Self { pointer: core::ptr::null_mut(), }; #[cfg(any( target_arch = "arm", target_arch = "aarch64", target_arch = "wasm32", target_arch = "x86", target_arch = "x86_64" ))] /// Unsafely assume this `Op` has a `.discriminant()` of `StderrWrite` and return its payload at index 0. /// (Always examine `.discriminant()` first to make sure this is the correct variant!) /// Panics in debug builds if the `.discriminant()` doesn't return `StderrWrite`. pub unsafe fn get_StderrWrite_0(&self) -> roc_std::RocStr { debug_assert_eq!(self.discriminant(), discriminant_Op::StderrWrite); extern "C" { #[link_name = "roc__getter__2_generic"] fn getter(_: *mut roc_std::RocStr, _: *const Op); } let mut ret = core::mem::MaybeUninit::uninit(); getter(ret.as_mut_ptr(), self); ret.assume_init() } #[cfg(any( target_arch = "arm", target_arch = "aarch64", target_arch = "wasm32", target_arch = "x86", target_arch = "x86_64" ))] /// Unsafely assume this `Op` has a `.discriminant()` of `StderrWrite` and return its payload at index 1. /// (Always examine `.discriminant()` first to make sure this is the correct variant!) /// Panics in debug builds if the `.discriminant()` doesn't return `StderrWrite`. pub unsafe fn get_StderrWrite_1(&self) -> RocFunction_67 { debug_assert_eq!(self.discriminant(), discriminant_Op::StderrWrite); extern "C" { #[link_name = "roc__roc__getter__3_size"] fn size() -> usize; #[link_name = "roc__getter__3_generic"] fn getter(_: *mut u8, _: *const Op); } // dumb heap allocation for now let mut bytes = vec![0xAAu8; size()]; getter(bytes.as_mut_ptr(), self); RocFunction_67 { closure_data: bytes, } } #[cfg(any( target_arch = "arm", target_arch = "aarch64", target_arch = "wasm32", target_arch = "x86", target_arch = "x86_64" ))] /// Construct a tag named `StderrWrite`, with the appropriate payload pub fn StderrWrite(arg: Op_StderrWrite) -> Self { let size = core::mem::size_of::(); let align = core::mem::align_of::() as u32; unsafe { let ptr = roc_std::roc_alloc_refcounted::(); *ptr = union_Op { StderrWrite: core::mem::ManuallyDrop::new(arg), }; Self { pointer: Self::tag_discriminant(ptr, discriminant_Op::StderrWrite), } } } #[cfg(any(target_arch = "arm", target_arch = "wasm32", target_arch = "x86"))] /// Unsafely assume this `Op` has a `.discriminant()` of `StderrWrite` and convert it to `StderrWrite`'s payload. /// (Always examine `.discriminant()` first to make sure this is the correct variant!) /// Panics in debug builds if the `.discriminant()` doesn't return `StderrWrite`. pub unsafe fn into_StderrWrite(mut self) -> Op_StderrWrite { debug_assert_eq!(self.discriminant(), discriminant_Op::StderrWrite); let payload = { let ptr = (self.pointer as usize & !0b11) as *mut union_Op; let mut uninitialized = core::mem::MaybeUninit::uninit(); let swapped = unsafe { core::mem::replace( &mut (*ptr).StderrWrite, core::mem::ManuallyDrop::new(uninitialized.assume_init()), ) }; core::mem::forget(self); core::mem::ManuallyDrop::into_inner(swapped) }; payload } #[cfg(any(target_arch = "arm", target_arch = "wasm32", target_arch = "x86"))] /// Unsafely assume this `Op` has a `.discriminant()` of `StderrWrite` and return its payload. /// (Always examine `.discriminant()` first to make sure this is the correct variant!) /// Panics in debug builds if the `.discriminant()` doesn't return `StderrWrite`. pub unsafe fn as_StderrWrite(&self) -> &Op_StderrWrite { debug_assert_eq!(self.discriminant(), discriminant_Op::StderrWrite); let payload = { let ptr = (self.pointer as usize & !0b11) as *mut union_Op; unsafe { &(*ptr).StderrWrite } }; &payload } #[cfg(any( target_arch = "arm", target_arch = "aarch64", target_arch = "wasm32", target_arch = "x86", target_arch = "x86_64" ))] /// Unsafely assume this `Op` has a `.discriminant()` of `StdoutWrite` and return its payload at index 0. /// (Always examine `.discriminant()` first to make sure this is the correct variant!) /// Panics in debug builds if the `.discriminant()` doesn't return `StdoutWrite`. pub unsafe fn get_StdoutWrite_0(&self) -> roc_std::RocStr { debug_assert_eq!(self.discriminant(), discriminant_Op::StdoutWrite); extern "C" { #[link_name = "roc__getter__2_generic"] fn getter(_: *mut roc_std::RocStr, _: *const Op); } let mut ret = core::mem::MaybeUninit::uninit(); getter(ret.as_mut_ptr(), self); ret.assume_init() } #[cfg(any( target_arch = "arm", target_arch = "aarch64", target_arch = "wasm32", target_arch = "x86", target_arch = "x86_64" ))] /// Unsafely assume this `Op` has a `.discriminant()` of `StdoutWrite` and return its payload at index 1. /// (Always examine `.discriminant()` first to make sure this is the correct variant!) /// Panics in debug builds if the `.discriminant()` doesn't return `StdoutWrite`. pub unsafe fn get_StdoutWrite_1(&self) -> RocFunction_66 { debug_assert_eq!(self.discriminant(), discriminant_Op::StdoutWrite); extern "C" { #[link_name = "roc__roc__getter__3_size"] fn size() -> usize; #[link_name = "roc__getter__3_generic"] fn getter(_: *mut u8, _: *const Op); } // dumb heap allocation for now let mut bytes = vec![0xAAu8; size()]; getter(bytes.as_mut_ptr(), self); RocFunction_66 { closure_data: bytes, } } #[cfg(any( target_arch = "arm", target_arch = "aarch64", target_arch = "wasm32", target_arch = "x86", target_arch = "x86_64" ))] /// Construct a tag named `StdoutWrite`, with the appropriate payload pub fn StdoutWrite(arg: Op_StdoutWrite) -> Self { let size = core::mem::size_of::(); let align = core::mem::align_of::() as u32; unsafe { let ptr = roc_std::roc_alloc_refcounted::(); *ptr = union_Op { StdoutWrite: core::mem::ManuallyDrop::new(arg), }; Self { pointer: Self::tag_discriminant(ptr, discriminant_Op::StdoutWrite), } } } #[cfg(any(target_arch = "arm", target_arch = "wasm32", target_arch = "x86"))] /// Unsafely assume this `Op` has a `.discriminant()` of `StdoutWrite` and convert it to `StdoutWrite`'s payload. /// (Always examine `.discriminant()` first to make sure this is the correct variant!) /// Panics in debug builds if the `.discriminant()` doesn't return `StdoutWrite`. pub unsafe fn into_StdoutWrite(mut self) -> Op_StdoutWrite { debug_assert_eq!(self.discriminant(), discriminant_Op::StdoutWrite); let payload = { let ptr = (self.pointer as usize & !0b11) as *mut union_Op; let mut uninitialized = core::mem::MaybeUninit::uninit(); let swapped = unsafe { core::mem::replace( &mut (*ptr).StdoutWrite, core::mem::ManuallyDrop::new(uninitialized.assume_init()), ) }; core::mem::forget(self); core::mem::ManuallyDrop::into_inner(swapped) }; payload } #[cfg(any(target_arch = "arm", target_arch = "wasm32", target_arch = "x86"))] /// Unsafely assume this `Op` has a `.discriminant()` of `StdoutWrite` and return its payload. /// (Always examine `.discriminant()` first to make sure this is the correct variant!) /// Panics in debug builds if the `.discriminant()` doesn't return `StdoutWrite`. pub unsafe fn as_StdoutWrite(&self) -> &Op_StdoutWrite { debug_assert_eq!(self.discriminant(), discriminant_Op::StdoutWrite); let payload = { let ptr = (self.pointer as usize & !0b11) as *mut union_Op; unsafe { &(*ptr).StdoutWrite } }; &payload } #[cfg(any(target_arch = "aarch64", target_arch = "x86_64"))] /// Returns which variant this tag union holds. Note that this never includes a payload! pub fn discriminant(&self) -> discriminant_Op { // The discriminant is stored in the unused bytes at the end of the recursive pointer unsafe { core::mem::transmute::((self.pointer as u8) & 0b111) } } #[cfg(any(target_arch = "aarch64", target_arch = "x86_64"))] /// Internal helper fn tag_discriminant(pointer: *mut union_Op, discriminant: discriminant_Op) -> *mut union_Op { // The discriminant is stored in the unused bytes at the end of the union pointer let untagged = (pointer as usize) & (!0b111 as usize); let tagged = untagged | (discriminant as usize); tagged as *mut union_Op } #[cfg(any(target_arch = "aarch64", target_arch = "x86_64"))] /// Internal helper fn union_pointer(&self) -> *mut union_Op { // The discriminant is stored in the unused bytes at the end of the union pointer ((self.pointer as usize) & (!0b111 as usize)) as *mut union_Op } #[cfg(any(target_arch = "aarch64", target_arch = "x86_64"))] /// Unsafely assume this `Op` has a `.discriminant()` of `StderrWrite` and convert it to `StderrWrite`'s payload. /// (Always examine `.discriminant()` first to make sure this is the correct variant!) /// Panics in debug builds if the `.discriminant()` doesn't return `StderrWrite`. pub unsafe fn into_StderrWrite(mut self) -> Op_StderrWrite { debug_assert_eq!(self.discriminant(), discriminant_Op::StderrWrite); let payload = { let ptr = (self.pointer as usize & !0b111) as *mut union_Op; let mut uninitialized = core::mem::MaybeUninit::uninit(); let swapped = unsafe { core::mem::replace( &mut (*ptr).StderrWrite, core::mem::ManuallyDrop::new(uninitialized.assume_init()), ) }; core::mem::forget(self); core::mem::ManuallyDrop::into_inner(swapped) }; payload } #[cfg(any(target_arch = "aarch64", target_arch = "x86_64"))] /// Unsafely assume this `Op` has a `.discriminant()` of `StderrWrite` and return its payload. /// (Always examine `.discriminant()` first to make sure this is the correct variant!) /// Panics in debug builds if the `.discriminant()` doesn't return `StderrWrite`. pub unsafe fn as_StderrWrite(&self) -> &Op_StderrWrite { debug_assert_eq!(self.discriminant(), discriminant_Op::StderrWrite); let payload = { let ptr = (self.pointer as usize & !0b111) as *mut union_Op; unsafe { &(*ptr).StderrWrite } }; &payload } #[cfg(any(target_arch = "aarch64", target_arch = "x86_64"))] /// Unsafely assume this `Op` has a `.discriminant()` of `StdoutWrite` and convert it to `StdoutWrite`'s payload. /// (Always examine `.discriminant()` first to make sure this is the correct variant!) /// Panics in debug builds if the `.discriminant()` doesn't return `StdoutWrite`. pub unsafe fn into_StdoutWrite(mut self) -> Op_StdoutWrite { debug_assert_eq!(self.discriminant(), discriminant_Op::StdoutWrite); let payload = { let ptr = (self.pointer as usize & !0b111) as *mut union_Op; let mut uninitialized = core::mem::MaybeUninit::uninit(); let swapped = unsafe { core::mem::replace( &mut (*ptr).StdoutWrite, core::mem::ManuallyDrop::new(uninitialized.assume_init()), ) }; core::mem::forget(self); core::mem::ManuallyDrop::into_inner(swapped) }; payload } #[cfg(any(target_arch = "aarch64", target_arch = "x86_64"))] /// Unsafely assume this `Op` has a `.discriminant()` of `StdoutWrite` and return its payload. /// (Always examine `.discriminant()` first to make sure this is the correct variant!) /// Panics in debug builds if the `.discriminant()` doesn't return `StdoutWrite`. pub unsafe fn as_StdoutWrite(&self) -> &Op_StdoutWrite { debug_assert_eq!(self.discriminant(), discriminant_Op::StdoutWrite); let payload = { let ptr = (self.pointer as usize & !0b111) as *mut union_Op; unsafe { &(*ptr).StdoutWrite } }; &payload } } impl Drop for Op { #[cfg(any( target_arch = "arm", target_arch = "aarch64", target_arch = "wasm32", target_arch = "x86", target_arch = "x86_64" ))] fn drop(&mut self) { // We only need to do any work if there's actually a heap-allocated payload. if let Some(storage) = self.storage() { let mut new_storage = storage.get(); // Decrement the refcount let needs_dealloc = !new_storage.is_readonly() && new_storage.decrease(); if needs_dealloc { // Drop the payload first. match self.discriminant() { discriminant_Op::Done => {} discriminant_Op::StderrWrite => unsafe { core::mem::ManuallyDrop::drop(&mut (&mut *self.union_pointer()).StderrWrite) }, discriminant_Op::StdoutWrite => unsafe { core::mem::ManuallyDrop::drop(&mut (&mut *self.union_pointer()).StdoutWrite) }, } // Dealloc the pointer let alignment = core::mem::align_of::().max(core::mem::align_of::()); unsafe { crate::roc_dealloc(storage.as_ptr().cast(), alignment as u32); } } else { // Write the storage back. storage.set(new_storage); } } } } impl Eq for Op {} impl PartialEq for Op { #[cfg(any( target_arch = "arm", target_arch = "aarch64", target_arch = "wasm32", target_arch = "x86", target_arch = "x86_64" ))] fn eq(&self, other: &Self) -> bool { if self.discriminant() != other.discriminant() { return false; } unsafe { match self.discriminant() { discriminant_Op::Done => true, discriminant_Op::StderrWrite => { (&*self.union_pointer()).StderrWrite == (&*other.union_pointer()).StderrWrite } discriminant_Op::StdoutWrite => { (&*self.union_pointer()).StdoutWrite == (&*other.union_pointer()).StdoutWrite } } } } } impl PartialOrd for Op { #[cfg(any( target_arch = "arm", target_arch = "aarch64", target_arch = "wasm32", target_arch = "x86", target_arch = "x86_64" ))] fn partial_cmp(&self, other: &Self) -> Option { match self.discriminant().partial_cmp(&other.discriminant()) { Some(core::cmp::Ordering::Equal) => {} not_eq => return not_eq, } unsafe { match self.discriminant() { discriminant_Op::Done => Some(core::cmp::Ordering::Equal), discriminant_Op::StderrWrite => (&*self.union_pointer()) .StderrWrite .partial_cmp(&(&*other.union_pointer()).StderrWrite), discriminant_Op::StdoutWrite => (&*self.union_pointer()) .StdoutWrite .partial_cmp(&(&*other.union_pointer()).StdoutWrite), } } } } impl Ord for Op { #[cfg(any( target_arch = "arm", target_arch = "aarch64", target_arch = "wasm32", target_arch = "x86", target_arch = "x86_64" ))] fn cmp(&self, other: &Self) -> core::cmp::Ordering { match self.discriminant().cmp(&other.discriminant()) { core::cmp::Ordering::Equal => {} not_eq => return not_eq, } unsafe { match self.discriminant() { discriminant_Op::Done => core::cmp::Ordering::Equal, discriminant_Op::StderrWrite => (&*self.union_pointer()) .StderrWrite .cmp(&(&*other.union_pointer()).StderrWrite), discriminant_Op::StdoutWrite => (&*self.union_pointer()) .StdoutWrite .cmp(&(&*other.union_pointer()).StdoutWrite), } } } } impl Clone for Op { #[cfg(any( target_arch = "arm", target_arch = "aarch64", target_arch = "wasm32", target_arch = "x86", target_arch = "x86_64" ))] fn clone(&self) -> Self { if let Some(storage) = self.storage() { let mut new_storage = storage.get(); if !new_storage.is_readonly() { new_storage.increment_reference_count(); storage.set(new_storage); } } Self { pointer: self.pointer, } } } impl core::hash::Hash for Op { #[cfg(any( target_arch = "arm", target_arch = "aarch64", target_arch = "wasm32", target_arch = "x86", target_arch = "x86_64" ))] fn hash(&self, state: &mut H) { match self.discriminant() { discriminant_Op::Done => discriminant_Op::Done.hash(state), discriminant_Op::StderrWrite => unsafe { discriminant_Op::StderrWrite.hash(state); (&*self.union_pointer()).StderrWrite.hash(state); }, discriminant_Op::StdoutWrite => unsafe { discriminant_Op::StdoutWrite.hash(state); (&*self.union_pointer()).StdoutWrite.hash(state); }, } } } impl core::fmt::Debug for Op { #[cfg(any( target_arch = "arm", target_arch = "aarch64", target_arch = "wasm32", target_arch = "x86", target_arch = "x86_64" ))] fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { f.write_str("Op::")?; unsafe { match self.discriminant() { discriminant_Op::Done => f.write_str("Done"), discriminant_Op::StderrWrite => f .debug_tuple("StderrWrite") // TODO HAS CLOSURE .finish(), discriminant_Op::StdoutWrite => f .debug_tuple("StdoutWrite") // TODO HAS CLOSURE .finish(), } } } }