From 0dd222be89023ce14f8559c8d9ec9eadd20610df Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Mon, 3 Aug 2026 13:50:08 +0100 Subject: [PATCH 1/2] Allow records with system header fields to implement ByteRepr --- cpp2rust/converter/converter_lib.cpp | 4 - .../out/refcount/array_of_noncopy_struct.rs | 43 +- tests/unit/out/refcount/class_templates.rs | 247 +++++++--- .../refcount/foreach_disjoint_field_borrow.rs | 36 +- tests/unit/out/refcount/huffman.rs | 397 ++++++++------- tests/unit/out/refcount/implicit_autoref.rs | 41 +- tests/unit/out/refcount/kruskal.rs | 455 +++++++++--------- .../refcount/libc_struct_without_default.rs | 94 ++-- .../unit/out/refcount/struct_default_ctor.rs | 51 +- .../unit/out/refcount/typedef-anon-struct.rs | 66 ++- tests/unit/out/refcount/unique_ptr.rs | 206 ++++---- .../out/refcount/unique_ptr_const_deref.rs | 25 +- tests/unit/out/refcount/unique_ptr_nested.rs | 64 +-- tests/unit/out/refcount/void_cast.rs | 42 +- 14 files changed, 1046 insertions(+), 725 deletions(-) diff --git a/cpp2rust/converter/converter_lib.cpp b/cpp2rust/converter/converter_lib.cpp index f932fa23c..2ce0f85e5 100644 --- a/cpp2rust/converter/converter_lib.cpp +++ b/cpp2rust/converter/converter_lib.cpp @@ -207,10 +207,6 @@ bool TypeImplementsByteRepr(clang::QualType qt) { return TypeImplementsByteRepr(arr->getElementType()); } if (const auto *rd = qt->getAsRecordDecl()) { - if (rd->getASTContext().getSourceManager().isInSystemHeader( - rd->getLocation())) { - return false; - } if (rd->isUnion()) { return true; } diff --git a/tests/unit/out/refcount/array_of_noncopy_struct.rs b/tests/unit/out/refcount/array_of_noncopy_struct.rs index 3d31d3a93..d8da5fd7c 100644 --- a/tests/unit/out/refcount/array_of_noncopy_struct.rs +++ b/tests/unit/out/refcount/array_of_noncopy_struct.rs @@ -6,21 +6,36 @@ use std::io::prelude::*; use std::io::{Read, Seek, Write}; use std::os::fd::AsFd; use std::rc::{Rc, Weak}; +#[repr(C)] #[derive(Default)] pub struct NonCopy { - pub data: Value>, - pub tag: Value, + pub data: Vec, + pub tag: i32, } impl Clone for NonCopy { fn clone(&self) -> Self { let mut this = Self { - data: Rc::new(RefCell::new((*self.data.borrow()).clone())), - tag: Rc::new(RefCell::new((*self.tag.borrow()))), + data: (self.data).clone(), + tag: self.tag, }; this } } -impl ByteRepr for NonCopy {} +impl ByteRepr for NonCopy { + fn byte_size() -> usize { + 32 + } + fn to_bytes(&self, buf: &mut [u8]) { + self.data.to_bytes(&mut buf[0..24]); + self.tag.to_bytes(&mut buf[24..28]); + } + fn from_bytes(buf: &[u8]) -> Self { + Self { + data: >::from_bytes(&buf[0..24]), + tag: ::from_bytes(&buf[24..28]), + } + } +} pub fn main() { std::process::exit(main_0()); } @@ -30,17 +45,21 @@ fn main_0() -> i32 { .map(|_| ::default()) .collect::>(), )); - (*(*arr.borrow())[(0) as usize].tag.borrow_mut()) = 7; - (*(*arr.borrow())[(1) as usize].data.borrow_mut()).push(42); - assert!(((*(*arr.borrow())[(0) as usize].tag.borrow()) == 7)); - assert!(((*(*arr.borrow())[(1) as usize].data.borrow()).len() == 1_usize)); + (*arr.borrow_mut())[(0) as usize].tag = 7; + (*arr.borrow_mut())[(1) as usize].data.push(42); + assert!(((*arr.borrow())[(0) as usize].tag == 7)); + assert!(((*arr.borrow())[(1) as usize].data.len() == 1_usize)); assert!( - ((((*arr.borrow())[(1) as usize].data.as_pointer() as Ptr) + ((((arr.as_pointer() as Ptr).offset(1).field_ptr( + 0, + |__v: &NonCopy| &__v.data[..], + |__v: &mut NonCopy| &mut __v.data[..] + ) as Ptr) .offset(0_usize) .read()) == 42) ); - assert!(((*(*arr.borrow())[(2) as usize].tag.borrow()) == 0)); - assert!(((*(*arr.borrow())[(2) as usize].data.borrow()).len() == 0_usize)); + assert!(((*arr.borrow())[(2) as usize].tag == 0)); + assert!(((*arr.borrow())[(2) as usize].data.len() == 0_usize)); return 0; } diff --git a/tests/unit/out/refcount/class_templates.rs b/tests/unit/out/refcount/class_templates.rs index 3cbce86e7..6b970c6f9 100644 --- a/tests/unit/out/refcount/class_templates.rs +++ b/tests/unit/out/refcount/class_templates.rs @@ -6,155 +6,248 @@ use std::io::prelude::*; use std::io::{Read, Seek, Write}; use std::os::fd::AsFd; use std::rc::{Rc, Weak}; +#[repr(C)] #[derive(Default)] pub struct MyContainer_int_ { - vec_: Value>, + vec_: Vec, } -impl MyContainer_int_ { - pub fn empty(&self) -> bool { - return (*self.vec_.borrow()).is_empty(); - } - pub fn size(&self) -> usize { - return (*self.vec_.borrow()).len(); - } - pub fn back_const(&self) -> Ptr { - return (self.vec_.as_pointer() as Ptr).to_last(); - } - pub fn back(&self) -> Ptr { - return (self.vec_.as_pointer() as Ptr).to_last(); - } - pub fn pop_back(&self) { - (*self.vec_.borrow_mut()).pop(); +pub trait MyContainer_int_Methods { + fn empty(&self) -> bool; + fn size(&self) -> usize; + fn back_const(&self) -> Ptr; + fn back(&self) -> Ptr; + fn pop_back(&self); + fn push_back(&self, item: Ptr); +} +impl MyContainer_int_Methods for Ptr { + fn empty(&self) -> bool { + return self.with(|__v| (*__v).vec_.clone()).is_empty(); + } + fn size(&self) -> usize { + return self.with(|__v| (*__v).vec_.clone()).len(); + } + fn back_const(&self) -> Ptr { + return (self.field_ptr( + 0, + |__v: &MyContainer_int_| &__v.vec_[..], + |__v: &mut MyContainer_int_| &mut __v.vec_[..], + ) as Ptr) + .to_last(); + } + fn back(&self) -> Ptr { + return (self.field_ptr( + 0, + |__v: &MyContainer_int_| &__v.vec_[..], + |__v: &mut MyContainer_int_| &mut __v.vec_[..], + ) as Ptr) + .to_last(); + } + fn pop_back(&self) { + self.with_mut(|__v| __v.vec_.pop()); return; } - pub fn push_back(&self, item: Ptr) { + fn push_back(&self, item: Ptr) { { let a0_clone = (item.read()).clone(); - (*self.vec_.borrow_mut()).push(a0_clone) + self.with_mut(|__v| __v.vec_.push(a0_clone)) }; } } impl Clone for MyContainer_int_ { fn clone(&self) -> Self { let mut this = Self { - vec_: Rc::new(RefCell::new((*self.vec_.borrow()).clone())), + vec_: (self.vec_).clone(), }; this } } -impl ByteRepr for MyContainer_int_ {} -#[derive(Default)] -pub struct MyContainer_char_ { - vec_: Value>, -} -impl MyContainer_char_ { - pub fn empty(&self) -> bool { - return (*self.vec_.borrow()).is_empty(); - } - pub fn size(&self) -> usize { - return (*self.vec_.borrow()).len(); +impl ByteRepr for MyContainer_int_ { + fn byte_size() -> usize { + 24 } - pub fn back_const(&self) -> Ptr { - return (self.vec_.as_pointer() as Ptr).to_last(); + fn to_bytes(&self, buf: &mut [u8]) { + self.vec_.to_bytes(&mut buf[0..24]); } - pub fn back(&self) -> Ptr { - return (self.vec_.as_pointer() as Ptr).to_last(); + fn from_bytes(buf: &[u8]) -> Self { + Self { + vec_: >::from_bytes(&buf[0..24]), + } } - pub fn pop_back(&self) { - (*self.vec_.borrow_mut()).pop(); +} +#[repr(C)] +#[derive(Default)] +pub struct MyContainer_char_ { + vec_: Vec, +} +pub trait MyContainer_char_Methods { + fn empty(&self) -> bool; + fn size(&self) -> usize; + fn back_const(&self) -> Ptr; + fn back(&self) -> Ptr; + fn pop_back(&self); + fn push_back(&self, item: Ptr); +} +impl MyContainer_char_Methods for Ptr { + fn empty(&self) -> bool { + return self.with(|__v| (*__v).vec_.clone()).is_empty(); + } + fn size(&self) -> usize { + return self.with(|__v| (*__v).vec_.clone()).len(); + } + fn back_const(&self) -> Ptr { + return (self.field_ptr( + 0, + |__v: &MyContainer_char_| &__v.vec_[..], + |__v: &mut MyContainer_char_| &mut __v.vec_[..], + ) as Ptr) + .to_last(); + } + fn back(&self) -> Ptr { + return (self.field_ptr( + 0, + |__v: &MyContainer_char_| &__v.vec_[..], + |__v: &mut MyContainer_char_| &mut __v.vec_[..], + ) as Ptr) + .to_last(); + } + fn pop_back(&self) { + self.with_mut(|__v| __v.vec_.pop()); return; } - pub fn push_back(&self, item: Ptr) { + fn push_back(&self, item: Ptr) { { let a0_clone = (item.read()).clone(); - (*self.vec_.borrow_mut()).push(a0_clone) + self.with_mut(|__v| __v.vec_.push(a0_clone)) }; } } impl Clone for MyContainer_char_ { fn clone(&self) -> Self { let mut this = Self { - vec_: Rc::new(RefCell::new((*self.vec_.borrow()).clone())), + vec_: (self.vec_).clone(), }; this } } -impl ByteRepr for MyContainer_char_ {} -#[derive(Default)] -pub struct MyContainer_float_ { - vec_: Value>, -} -impl MyContainer_float_ { - pub fn empty(&self) -> bool { - return (*self.vec_.borrow()).is_empty(); - } - pub fn size(&self) -> usize { - return (*self.vec_.borrow()).len(); +impl ByteRepr for MyContainer_char_ { + fn byte_size() -> usize { + 24 } - pub fn back_const(&self) -> Ptr { - return (self.vec_.as_pointer() as Ptr).to_last(); + fn to_bytes(&self, buf: &mut [u8]) { + self.vec_.to_bytes(&mut buf[0..24]); } - pub fn back(&self) -> Ptr { - return (self.vec_.as_pointer() as Ptr).to_last(); + fn from_bytes(buf: &[u8]) -> Self { + Self { + vec_: >::from_bytes(&buf[0..24]), + } } - pub fn pop_back(&self) { - (*self.vec_.borrow_mut()).pop(); +} +#[repr(C)] +#[derive(Default)] +pub struct MyContainer_float_ { + vec_: Vec, +} +pub trait MyContainer_float_Methods { + fn empty(&self) -> bool; + fn size(&self) -> usize; + fn back_const(&self) -> Ptr; + fn back(&self) -> Ptr; + fn pop_back(&self); + fn push_back(&self, item: Ptr); +} +impl MyContainer_float_Methods for Ptr { + fn empty(&self) -> bool { + return self.with(|__v| (*__v).vec_.clone()).is_empty(); + } + fn size(&self) -> usize { + return self.with(|__v| (*__v).vec_.clone()).len(); + } + fn back_const(&self) -> Ptr { + return (self.field_ptr( + 0, + |__v: &MyContainer_float_| &__v.vec_[..], + |__v: &mut MyContainer_float_| &mut __v.vec_[..], + ) as Ptr) + .to_last(); + } + fn back(&self) -> Ptr { + return (self.field_ptr( + 0, + |__v: &MyContainer_float_| &__v.vec_[..], + |__v: &mut MyContainer_float_| &mut __v.vec_[..], + ) as Ptr) + .to_last(); + } + fn pop_back(&self) { + self.with_mut(|__v| __v.vec_.pop()); return; } - pub fn push_back(&self, item: Ptr) { + fn push_back(&self, item: Ptr) { { let a0_clone = (item.read()).clone(); - (*self.vec_.borrow_mut()).push(a0_clone) + self.with_mut(|__v| __v.vec_.push(a0_clone)) }; } } impl Clone for MyContainer_float_ { fn clone(&self) -> Self { let mut this = Self { - vec_: Rc::new(RefCell::new((*self.vec_.borrow()).clone())), + vec_: (self.vec_).clone(), }; this } } -impl ByteRepr for MyContainer_float_ {} +impl ByteRepr for MyContainer_float_ { + fn byte_size() -> usize { + 24 + } + fn to_bytes(&self, buf: &mut [u8]) { + self.vec_.to_bytes(&mut buf[0..24]); + } + fn from_bytes(buf: &[u8]) -> Self { + Self { + vec_: >::from_bytes(&buf[0..24]), + } + } +} pub fn main() { std::process::exit(main_0()); } fn main_0() -> i32 { let imc: Value = Rc::new(RefCell::new(::default())); - assert!(({ (*imc.borrow()).empty() })); + assert!(({ imc.as_pointer().empty() })); ({ let _item: Value = Rc::new(RefCell::new(1)); - (*imc.borrow()).push_back(_item.as_pointer()) + imc.as_pointer().push_back(_item.as_pointer()) }); assert!( - (({ (*imc.borrow()).size() }) == 1_usize) && ((({ (*imc.borrow()).back() }).read()) == 1) + (({ imc.as_pointer().size() }) == 1_usize) && ((({ imc.as_pointer().back() }).read()) == 1) ); - ({ (*imc.borrow()).pop_back() }); - assert!(({ (*imc.borrow()).empty() })); + ({ imc.as_pointer().pop_back() }); + assert!(({ imc.as_pointer().empty() })); let cmc: Value = Rc::new(RefCell::new(::default())); - assert!(({ (*cmc.borrow()).empty() })); + assert!(({ cmc.as_pointer().empty() })); ({ let _item: Value = Rc::new(RefCell::new(('a' as u8))); - (*cmc.borrow()).push_back(_item.as_pointer()) + cmc.as_pointer().push_back(_item.as_pointer()) }); assert!( - (({ (*cmc.borrow()).size() }) == 1_usize) - && (((({ (*cmc.borrow()).back() }).read()) as i32) == (('a' as u8) as i32)) + (({ cmc.as_pointer().size() }) == 1_usize) + && (((({ cmc.as_pointer().back() }).read()) as i32) == (('a' as u8) as i32)) ); - ({ (*cmc.borrow()).pop_back() }); - assert!(({ (*cmc.borrow()).empty() })); + ({ cmc.as_pointer().pop_back() }); + assert!(({ cmc.as_pointer().empty() })); let fmc: Value = Rc::new(RefCell::new(::default())); - assert!(({ (*fmc.borrow()).empty() })); + assert!(({ fmc.as_pointer().empty() })); ({ let _item: Value = Rc::new(RefCell::new((1.0E+0 as f32))); - (*fmc.borrow()).push_back(_item.as_pointer()) + fmc.as_pointer().push_back(_item.as_pointer()) }); assert!( - (({ (*fmc.borrow()).size() }) == 1_usize) - && (((({ (*fmc.borrow()).back() }).read()) as f64) == 1.0E+0) + (({ fmc.as_pointer().size() }) == 1_usize) + && (((({ fmc.as_pointer().back() }).read()) as f64) == 1.0E+0) ); - ({ (*fmc.borrow()).pop_back() }); - assert!(({ (*fmc.borrow()).empty() })); + ({ fmc.as_pointer().pop_back() }); + assert!(({ fmc.as_pointer().empty() })); return 0; } diff --git a/tests/unit/out/refcount/foreach_disjoint_field_borrow.rs b/tests/unit/out/refcount/foreach_disjoint_field_borrow.rs index 66c9e892d..74cb57be1 100644 --- a/tests/unit/out/refcount/foreach_disjoint_field_borrow.rs +++ b/tests/unit/out/refcount/foreach_disjoint_field_borrow.rs @@ -6,30 +6,48 @@ use std::io::prelude::*; use std::io::{Read, Seek, Write}; use std::os::fd::AsFd; use std::rc::{Rc, Weak}; +#[repr(C)] #[derive(Default)] pub struct S { - pub v: Value>, - pub a: Value, + pub v: Vec, + pub a: i32, } impl Clone for S { fn clone(&self) -> Self { let mut this = Self { - v: Rc::new(RefCell::new((*self.v.borrow()).clone())), - a: Rc::new(RefCell::new((*self.a.borrow()))), + v: (self.v).clone(), + a: self.a, }; this } } -impl ByteRepr for S {} +impl ByteRepr for S { + fn byte_size() -> usize { + 32 + } + fn to_bytes(&self, buf: &mut [u8]) { + self.v.to_bytes(&mut buf[0..24]); + self.a.to_bytes(&mut buf[24..28]); + } + fn from_bytes(buf: &[u8]) -> Self { + Self { + v: >::from_bytes(&buf[0..24]), + a: ::from_bytes(&buf[24..28]), + } + } +} pub fn main() { std::process::exit(main_0()); } fn main_0() -> i32 { let s: Value = Rc::new(RefCell::new(::default())); - (*(*s.borrow()).v.borrow_mut()).push(1); - 'loop_: for mut e in (*s.borrow()).v.as_pointer() as Ptr { - let e: Value = Rc::new(RefCell::new(e.read().clone())); - (*(*s.borrow()).a.borrow_mut()).postfix_inc(); + (*s.borrow_mut()).v.push(1); + 'loop_: for mut e in + (s.as_pointer() + .field_ptr(0, |__v: &S| &__v.v[..], |__v: &mut S| &mut __v.v[..]) as Ptr) + { + let e: Value = Rc::new(RefCell::new((e.read()).clone())); + (*s.borrow_mut()).a.postfix_inc(); } return 0; } diff --git a/tests/unit/out/refcount/huffman.rs b/tests/unit/out/refcount/huffman.rs index f023a5450..80b5ace35 100644 --- a/tests/unit/out/refcount/huffman.rs +++ b/tests/unit/out/refcount/huffman.rs @@ -6,25 +6,30 @@ use std::io::prelude::*; use std::io::{Read, Seek, Write}; use std::os::fd::AsFd; use std::rc::{Rc, Weak}; +#[repr(C)] #[derive(Default)] pub struct MinHeapNode { - pub data: Value, - pub freq: Value, - pub left: Value>, - pub right: Value>, + pub data: u8, + pub freq: i32, + pub left: Ptr, + pub right: Ptr, } -impl MinHeapNode { - pub fn IsLeaf(&self) -> bool { - return ((*self.left.borrow()).is_null()) && ((*self.right.borrow()).is_null()); +pub trait MinHeapNodeMethods { + fn IsLeaf(&self) -> bool; +} +impl MinHeapNodeMethods for Ptr { + fn IsLeaf(&self) -> bool { + return ((self.with(|__v| (*__v).left.clone())).is_null()) + && ((self.with(|__v| (*__v).right.clone())).is_null()); } } impl Clone for MinHeapNode { fn clone(&self) -> Self { let mut this = Self { - data: Rc::new(RefCell::new((*self.data.borrow()))), - freq: Rc::new(RefCell::new((*self.freq.borrow()))), - left: Rc::new(RefCell::new((*self.left.borrow()).clone())), - right: Rc::new(RefCell::new((*self.right.borrow()).clone())), + data: self.data, + freq: self.freq, + left: (self.left).clone(), + right: (self.right).clone(), }; this } @@ -34,165 +39,201 @@ impl ByteRepr for MinHeapNode { 24 } fn to_bytes(&self, buf: &mut [u8]) { - (*self.data.borrow()).to_bytes(&mut buf[0..1]); - (*self.freq.borrow()).to_bytes(&mut buf[4..8]); - (*self.left.borrow()).to_bytes(&mut buf[8..16]); - (*self.right.borrow()).to_bytes(&mut buf[16..24]); + self.data.to_bytes(&mut buf[0..1]); + self.freq.to_bytes(&mut buf[4..8]); + self.left.to_bytes(&mut buf[8..16]); + self.right.to_bytes(&mut buf[16..24]); } fn from_bytes(buf: &[u8]) -> Self { Self { - data: Rc::new(RefCell::new(::from_bytes(&buf[0..1]))), - freq: Rc::new(RefCell::new(::from_bytes(&buf[4..8]))), - left: Rc::new(RefCell::new(>::from_bytes(&buf[8..16]))), - right: Rc::new(RefCell::new(>::from_bytes(&buf[16..24]))), + data: ::from_bytes(&buf[0..1]), + freq: ::from_bytes(&buf[4..8]), + left: >::from_bytes(&buf[8..16]), + right: >::from_bytes(&buf[16..24]), } } } pub fn Swap_0(a: Ptr, b: Ptr) { let t: Value = Rc::new(RefCell::new(MinHeapNode { - data: Rc::new(RefCell::new((*(*a.upgrade().deref()).data.borrow()))), - freq: Rc::new(RefCell::new((*(*a.upgrade().deref()).freq.borrow()))), - left: Rc::new(RefCell::new( - (*(*a.upgrade().deref()).left.borrow()).clone(), - )), - right: Rc::new(RefCell::new( - (*(*a.upgrade().deref()).right.borrow()).clone(), - )), + data: a.with(|__v| (*__v).data), + freq: a.with(|__v| (*__v).freq), + left: (a.with(|__v| (*__v).left.clone())).clone(), + right: (a.with(|__v| (*__v).right.clone())).clone(), })); let __rhs = MinHeapNode { - data: Rc::new(RefCell::new((*(*b.upgrade().deref()).data.borrow()))), - freq: Rc::new(RefCell::new((*(*b.upgrade().deref()).freq.borrow()))), - left: Rc::new(RefCell::new( - (*(*b.upgrade().deref()).left.borrow()).clone(), - )), - right: Rc::new(RefCell::new( - (*(*b.upgrade().deref()).right.borrow()).clone(), - )), + data: b.with(|__v| (*__v).data), + freq: b.with(|__v| (*__v).freq), + left: (b.with(|__v| (*__v).left.clone())).clone(), + right: (b.with(|__v| (*__v).right.clone())).clone(), }; a.write(__rhs); let __rhs = MinHeapNode { - data: Rc::new(RefCell::new((*(*t.borrow()).data.borrow()))), - freq: Rc::new(RefCell::new((*(*t.borrow()).freq.borrow()))), - left: Rc::new(RefCell::new((*(*t.borrow()).left.borrow()).clone())), - right: Rc::new(RefCell::new((*(*t.borrow()).right.borrow()).clone())), + data: (*t.borrow()).data, + freq: (*t.borrow()).freq, + left: ((*t.borrow()).left).clone(), + right: ((*t.borrow()).right).clone(), }; b.write(__rhs); } +#[repr(C)] #[derive(Default)] pub struct MinHeap { - pub size: Value, - pub capacity: Value, - pub arr: Value]>>>>, - pub next: Value, - pub alloc: Value>>>, + pub size: i32, + pub capacity: i32, + pub arr: Option]>>>, + pub next: i32, + pub alloc: Option>>, +} +pub trait MinHeapMethods { + fn Alloc(&self, data: u8, freq: i32) -> Ptr; + fn Heapify(&self, idx: i32); + fn ExtractMin(&self) -> Ptr; + fn Insert(&self, node: Ptr); + fn Build( + &self, + data: Ptr>>>, + freq: Ptr>>>, + n: i32, + ); } -impl MinHeap { - pub fn Alloc(&self, data: u8, freq: i32) -> Ptr { +impl MinHeapMethods for Ptr { + fn Alloc(&self, data: u8, freq: i32) -> Ptr { let data: Value = Rc::new(RefCell::new(data)); let freq: Value = Rc::new(RefCell::new(freq)); - (*self.alloc.borrow()).as_ref().unwrap().borrow_mut() - [((*self.next.borrow()) as usize) as usize] = MinHeapNode { - data: Rc::new(RefCell::new((*data.borrow()))), - freq: Rc::new(RefCell::new((*freq.borrow()))), - left: Rc::new(RefCell::new(Ptr::::null())), - right: Rc::new(RefCell::new(Ptr::::null())), + (*self + .with(|__v| (*__v).alloc.clone()) + .as_ref() + .unwrap() + .borrow_mut())[(self.with(|__v| (*__v).next) as usize) as usize] = MinHeapNode { + data: (*data.borrow()), + freq: (*freq.borrow()), + left: Ptr::::null(), + right: Ptr::::null(), }; - return ((*self.alloc.borrow()) + return ((self + .with(|__v| (*__v).alloc.clone()) .as_ref() .unwrap() - .as_pointer() - .offset(((*self.next.borrow_mut()).postfix_inc() as usize))) + .as_pointer() as Ptr) + .offset((self.with_mut(|__v| __v.next.postfix_inc()) as usize))) .clone(); } - pub fn Heapify(&self, idx: i32) { + fn Heapify(&self, idx: i32) { let idx: Value = Rc::new(RefCell::new(idx)); let smallest: Value = Rc::new(RefCell::new((*idx.borrow()))); let left: Value = Rc::new(RefCell::new(((2 * (*idx.borrow())) + 1))); let right: Value = Rc::new(RefCell::new(((2 * (*idx.borrow())) + 2))); - if ((*left.borrow()) < (*self.size.borrow())) - && ((*(*(*self.arr.borrow()).as_ref().unwrap().borrow() - [((*left.borrow()) as usize) as usize] - .upgrade() - .deref()) - .freq - .borrow()) - < (*(*(*self.arr.borrow()).as_ref().unwrap().borrow() - [((*smallest.borrow()) as usize) as usize] - .upgrade() - .deref()) - .freq - .borrow())) + if ((*left.borrow()) < self.with(|__v| (*__v).size)) + && ((*self + .with(|__v| (*__v).arr.clone()) + .as_ref() + .unwrap() + .borrow())[((*left.borrow()) as usize) as usize] + .with(|__v| (*__v).freq) + < (*self + .with(|__v| (*__v).arr.clone()) + .as_ref() + .unwrap() + .borrow())[((*smallest.borrow()) as usize) as usize] + .with(|__v| (*__v).freq)) { (*smallest.borrow_mut()) = (*left.borrow()); } - if ((*right.borrow()) < (*self.size.borrow())) - && ((*(*(*self.arr.borrow()).as_ref().unwrap().borrow() - [((*right.borrow()) as usize) as usize] - .upgrade() - .deref()) - .freq - .borrow()) - < (*(*(*self.arr.borrow()).as_ref().unwrap().borrow() - [((*smallest.borrow()) as usize) as usize] - .upgrade() - .deref()) - .freq - .borrow())) + if ((*right.borrow()) < self.with(|__v| (*__v).size)) + && ((*self + .with(|__v| (*__v).arr.clone()) + .as_ref() + .unwrap() + .borrow())[((*right.borrow()) as usize) as usize] + .with(|__v| (*__v).freq) + < (*self + .with(|__v| (*__v).arr.clone()) + .as_ref() + .unwrap() + .borrow())[((*smallest.borrow()) as usize) as usize] + .with(|__v| (*__v).freq)) { (*smallest.borrow_mut()) = (*right.borrow()); } if ((*smallest.borrow()) != (*idx.borrow())) { ({ - let _a: Ptr = ((*self.arr.borrow()).as_ref().unwrap().borrow() - [((*smallest.borrow()) as usize) as usize]) + let _a: Ptr = ((*self + .with(|__v| (*__v).arr.clone()) + .as_ref() + .unwrap() + .borrow())[((*smallest.borrow()) as usize) as usize]) .clone(); - let _b: Ptr = ((*self.arr.borrow()).as_ref().unwrap().borrow() - [((*idx.borrow()) as usize) as usize]) + let _b: Ptr = ((*self + .with(|__v| (*__v).arr.clone()) + .as_ref() + .unwrap() + .borrow())[((*idx.borrow()) as usize) as usize]) .clone(); Swap_0(_a, _b) }); ({ self.Heapify((*smallest.borrow())) }); } } - pub fn ExtractMin(&self) -> Ptr { + fn ExtractMin(&self) -> Ptr { let out: Value> = Rc::new(RefCell::new( - ((*self.arr.borrow()).as_ref().unwrap().borrow()[(0_usize) as usize]).clone(), + ((*self + .with(|__v| (*__v).arr.clone()) + .as_ref() + .unwrap() + .borrow())[(0_usize) as usize]) + .clone(), )); - (*self.size.borrow_mut()).prefix_dec(); - let __rhs = ((*self.arr.borrow()).as_ref().unwrap().borrow() - [((*self.size.borrow()) as usize) as usize]) + self.with_mut(|__v| __v.size.prefix_dec()); + let __rhs = ((*self + .with(|__v| (*__v).arr.clone()) + .as_ref() + .unwrap() + .borrow())[(self.with(|__v| (*__v).size) as usize) as usize]) .clone(); - (*self.arr.borrow()).as_ref().unwrap().borrow_mut()[(0_usize) as usize] = __rhs; + (*self + .with(|__v| (*__v).arr.clone()) + .as_ref() + .unwrap() + .borrow_mut())[(0_usize) as usize] = __rhs; ({ self.Heapify(0) }); return (*out.borrow()).clone(); } - pub fn Insert(&self, node: Ptr) { + fn Insert(&self, node: Ptr) { let node: Value> = Rc::new(RefCell::new(node)); - (*self.size.borrow_mut()).prefix_inc(); - let i: Value = Rc::new(RefCell::new(((*self.size.borrow()) - 1))); + self.with_mut(|__v| __v.size.prefix_inc()); + let i: Value = Rc::new(RefCell::new((self.with(|__v| (*__v).size) - 1))); 'loop_: while ((*i.borrow()) != 0) && ({ - let _lhs = (*(*(*node.borrow()).upgrade().deref()).freq.borrow()); - _lhs < (*(*(*self.arr.borrow()).as_ref().unwrap().borrow() - [((((*i.borrow()) - 1) / 2) as usize) as usize] - .upgrade() - .deref()) - .freq - .borrow()) + let _lhs = (*node.borrow()).with(|__v| (*__v).freq); + _lhs < (*self + .with(|__v| (*__v).arr.clone()) + .as_ref() + .unwrap() + .borrow())[((((*i.borrow()) - 1) / 2) as usize) as usize] + .with(|__v| (*__v).freq) }) { - let __rhs = ((*self.arr.borrow()).as_ref().unwrap().borrow() - [((((*i.borrow()) - 1) / 2) as usize) as usize]) + let __rhs = ((*self + .with(|__v| (*__v).arr.clone()) + .as_ref() + .unwrap() + .borrow())[((((*i.borrow()) - 1) / 2) as usize) as usize]) .clone(); - (*self.arr.borrow()).as_ref().unwrap().borrow_mut() - [((*i.borrow()) as usize) as usize] = __rhs; + (*self + .with(|__v| (*__v).arr.clone()) + .as_ref() + .unwrap() + .borrow_mut())[((*i.borrow()) as usize) as usize] = __rhs; let __rhs = (((*i.borrow()) - 1) / 2); (*i.borrow_mut()) = __rhs; } - (*self.arr.borrow()).as_ref().unwrap().borrow_mut()[((*i.borrow()) as usize) as usize] = - (*node.borrow()).clone(); + (*self + .with(|__v| (*__v).arr.clone()) + .as_ref() + .unwrap() + .borrow_mut())[((*i.borrow()) as usize) as usize] = (*node.borrow()).clone(); } - pub fn Build( + fn Build( &self, data: Ptr>>>, freq: Ptr>>>, @@ -201,41 +242,65 @@ impl MinHeap { let n: Value = Rc::new(RefCell::new(n)); let i: Value = Rc::new(RefCell::new(0)); 'loop_: while ((*i.borrow()) < (*n.borrow())) { - (*self.arr.borrow()).as_ref().unwrap().borrow_mut() - [((*self.size.borrow_mut()).postfix_inc() as usize) as usize] = ({ - let _data: u8 = (*data.upgrade().deref()).as_ref().unwrap().borrow() - [((*i.borrow()) as usize) as usize]; - let _freq: i32 = (*freq.upgrade().deref()).as_ref().unwrap().borrow() - [((*i.borrow()) as usize) as usize]; - self.Alloc(_data, _freq) - }); + (*self + .with(|__v| (*__v).arr.clone()) + .as_ref() + .unwrap() + .borrow_mut())[(self.with_mut(|__v| __v.size.postfix_inc()) as usize) as usize] = + ({ + let _data: u8 = (*(data.read()).as_ref().unwrap().borrow()) + [((*i.borrow()) as usize) as usize]; + let _freq: i32 = (*(freq.read()).as_ref().unwrap().borrow()) + [((*i.borrow()) as usize) as usize]; + self.Alloc(_data, _freq) + }); (*i.borrow_mut()).prefix_inc(); } - let i: Value = Rc::new(RefCell::new((((*self.size.borrow()) - 2) / 2))); + let i: Value = Rc::new(RefCell::new(((self.with(|__v| (*__v).size) - 2) / 2))); 'loop_: while ((*i.borrow()) >= 0) { ({ self.Heapify((*i.borrow())) }); (*i.borrow_mut()).prefix_dec(); } } } -impl ByteRepr for MinHeap {} +impl ByteRepr for MinHeap { + fn byte_size() -> usize { + 32 + } + fn to_bytes(&self, buf: &mut [u8]) { + self.size.to_bytes(&mut buf[0..4]); + self.capacity.to_bytes(&mut buf[4..8]); + self.arr.to_bytes(&mut buf[8..16]); + self.next.to_bytes(&mut buf[16..20]); + self.alloc.to_bytes(&mut buf[24..32]); + } + fn from_bytes(buf: &[u8]) -> Self { + Self { + size: ::from_bytes(&buf[0..4]), + capacity: ::from_bytes(&buf[4..8]), + arr: ]>>>>::from_bytes(&buf[8..16]), + next: ::from_bytes(&buf[16..20]), + alloc: >>>::from_bytes(&buf[24..32]), + } + } +} pub fn AllocMinHeap_1(capacity: i32) -> Option> { let capacity: Value = Rc::new(RefCell::new(capacity)); let minHeap: Value>> = Rc::new(RefCell::new(Some(Rc::new(RefCell::new(MinHeap { - size: Rc::new(RefCell::new(0)), - capacity: Rc::new(RefCell::new((*capacity.borrow()))), - arr: Rc::new(RefCell::new(Some(Rc::new(RefCell::new( + size: 0, + capacity: (*capacity.borrow()), + arr: Some(Rc::new(RefCell::new( (0..((*capacity.borrow()) as usize)) .map(|_| >::default()) .collect::>(), - ))))), - next: Rc::new(RefCell::new(0)), - alloc: Rc::new(RefCell::new(Some(Rc::new(RefCell::new( + ))), + next: 0, + alloc: Some(Rc::new(RefCell::new( (0..10000_usize) .map(|_| ::default()) .collect::>(), - ))))), + ))), }))))); return (*minHeap.borrow_mut()).take(); } @@ -251,30 +316,26 @@ pub fn Huffman_2( let _data: Ptr>>> = (data).clone(); let _freq: Ptr>>> = (freq).clone(); let _n: i32 = (*size.borrow()); - (*(*minHeap.borrow()).as_ref().unwrap().borrow()).Build(_data, _freq, _n) + ((*minHeap.borrow()).as_pointer()).Build(_data, _freq, _n) }); - 'loop_: while ((*(*(*minHeap.borrow()).as_ref().unwrap().borrow()) - .size - .borrow()) - != 1) - { + 'loop_: while ((*(*minHeap.borrow()).as_ref().unwrap().borrow()).size != 1) { let left: Value> = Rc::new(RefCell::new( - ({ (*(*minHeap.borrow()).as_ref().unwrap().borrow()).ExtractMin() }), + ({ ((*minHeap.borrow()).as_pointer()).ExtractMin() }), )); let right: Value> = Rc::new(RefCell::new( - ({ (*(*minHeap.borrow()).as_ref().unwrap().borrow()).ExtractMin() }), + ({ ((*minHeap.borrow()).as_pointer()).ExtractMin() }), )); let top: Value> = Rc::new(RefCell::new( ({ - (*(*minHeap.borrow()).as_ref().unwrap().borrow()).Alloc(('$' as u8), { - let _lhs = (*(*(*left.borrow()).upgrade().deref()).freq.borrow()); - _lhs + (*(*(*right.borrow()).upgrade().deref()).freq.borrow()) + ((*minHeap.borrow()).as_pointer()).Alloc(('$' as u8), { + let _lhs = (*left.borrow()).with(|__v| (*__v).freq); + _lhs + (*right.borrow()).with(|__v| (*__v).freq) }) }), )); - (*(*(*top.borrow()).upgrade().deref()).left.borrow_mut()) = (*left.borrow()).clone(); - (*(*(*top.borrow()).upgrade().deref()).right.borrow_mut()) = (*right.borrow()).clone(); - ({ (*(*minHeap.borrow()).as_ref().unwrap().borrow()).Insert((*top.borrow()).clone()) }); + (*top.borrow()).with_mut(|__v| __v.left = (*left.borrow()).clone()); + (*top.borrow()).with_mut(|__v| __v.right = (*right.borrow()).clone()); + ({ ((*minHeap.borrow()).as_pointer()).Insert((*top.borrow()).clone()) }); } return (*minHeap.borrow_mut()).take(); } @@ -285,22 +346,18 @@ pub fn CollectCode_3( next: Ptr, ) { let top: Value = Rc::new(RefCell::new(top)); - (*out.upgrade().deref()).as_ref().unwrap().borrow_mut()[((next.read()) as usize) as usize] = 0; + (*(out.read()).as_ref().unwrap().borrow_mut())[((next.read()) as usize) as usize] = 0; let i: Value = Rc::new(RefCell::new(0)); 'loop_: while ((*i.borrow()) < (*top.borrow())) { - let __rhs = ((*out.upgrade().deref()).as_ref().unwrap().borrow() - [((next.read()) as usize) as usize] - * 10); - (*out.upgrade().deref()).as_ref().unwrap().borrow_mut() - [((next.read()) as usize) as usize] = __rhs; + let __rhs = + ((*(out.read()).as_ref().unwrap().borrow())[((next.read()) as usize) as usize] * 10); + (*(out.read()).as_ref().unwrap().borrow_mut())[((next.read()) as usize) as usize] = __rhs; let __rhs = { - let _lhs = (*out.upgrade().deref()).as_ref().unwrap().borrow() - [((next.read()) as usize) as usize]; - _lhs + (*arr.upgrade().deref()).as_ref().unwrap().borrow() - [((*i.borrow()) as usize) as usize] + let _lhs = + (*(out.read()).as_ref().unwrap().borrow())[((next.read()) as usize) as usize]; + _lhs + (*(arr.read()).as_ref().unwrap().borrow())[((*i.borrow()) as usize) as usize] }; - (*out.upgrade().deref()).as_ref().unwrap().borrow_mut() - [((next.read()) as usize) as usize] = __rhs; + (*(out.read()).as_ref().unwrap().borrow_mut())[((next.read()) as usize) as usize] = __rhs; (*i.borrow_mut()).prefix_inc(); } next.with_mut(|__v| __v.prefix_inc()); @@ -314,12 +371,11 @@ pub fn CollectCodes_4( ) { let root: Value> = Rc::new(RefCell::new(root)); let top: Value = Rc::new(RefCell::new(top)); - if !((*(*(*root.borrow()).upgrade().deref()).left.borrow()).is_null()) { - (*arr.upgrade().deref()).as_ref().unwrap().borrow_mut() - [((*top.borrow()) as usize) as usize] = 0; + if !(((*root.borrow()).with(|__v| (*__v).left.clone())).is_null()) { + (*(arr.read()).as_ref().unwrap().borrow_mut())[((*top.borrow()) as usize) as usize] = 0; ({ let _root: Ptr = - (*(*(*root.borrow()).upgrade().deref()).left.borrow()).clone(); + ((*root.borrow()).with(|__v| (*__v).left.clone())).clone(); let _arr: Ptr>>> = (arr).clone(); let _top: i32 = ((*top.borrow()) + 1); let _out: Ptr>>> = (out).clone(); @@ -327,12 +383,11 @@ pub fn CollectCodes_4( CollectCodes_4(_root, _arr, _top, _out, _next) }); } - if !((*(*(*root.borrow()).upgrade().deref()).right.borrow()).is_null()) { - (*arr.upgrade().deref()).as_ref().unwrap().borrow_mut() - [((*top.borrow()) as usize) as usize] = 1; + if !(((*root.borrow()).with(|__v| (*__v).right.clone())).is_null()) { + (*(arr.read()).as_ref().unwrap().borrow_mut())[((*top.borrow()) as usize) as usize] = 1; ({ let _root: Ptr = - (*(*(*root.borrow()).upgrade().deref()).right.borrow()).clone(); + ((*root.borrow()).with(|__v| (*__v).right.clone())).clone(); let _arr: Ptr>>> = (arr).clone(); let _top: i32 = ((*top.borrow()) + 1); let _out: Ptr>>> = (out).clone(); @@ -340,7 +395,7 @@ pub fn CollectCodes_4( CollectCodes_4(_root, _arr, _top, _out, _next) }); } - if ({ (*(*root.borrow()).upgrade().deref()).IsLeaf() }) { + if ({ (*root.borrow()).IsLeaf() }) { ({ let _arr: Ptr>>> = (arr).clone(); let _top: i32 = (*top.borrow()); @@ -365,7 +420,7 @@ pub fn HuffmanCodes_5( }), )); let root: Value> = Rc::new(RefCell::new( - ({ (*(*minHeap.borrow()).as_ref().unwrap().borrow()).ExtractMin() }), + ({ ((*minHeap.borrow()).as_pointer()).ExtractMin() }), )); let arr: Value>>> = Rc::new(RefCell::new(Some(Rc::new(RefCell::new( (0..100_usize) @@ -418,19 +473,21 @@ fn main_0() -> i32 { let i: Value = Rc::new(RefCell::new(0)); 'loop_: while ((*i.borrow()) < (*size.borrow())) { let __rhs = (*arr1.borrow())[(*i.borrow()) as usize]; - (*data.borrow()).as_ref().unwrap().borrow_mut()[((*i.borrow()) as usize) as usize] = __rhs; + (*(*data.borrow()).as_ref().unwrap().borrow_mut())[((*i.borrow()) as usize) as usize] = + __rhs; let __rhs = (*arr2.borrow())[(*i.borrow()) as usize]; - (*freq.borrow()).as_ref().unwrap().borrow_mut()[((*i.borrow()) as usize) as usize] = __rhs; + (*(*freq.borrow()).as_ref().unwrap().borrow_mut())[((*i.borrow()) as usize) as usize] = + __rhs; (*i.borrow_mut()).prefix_inc(); } let out: Value>>> = Rc::new(RefCell::new( ({ HuffmanCodes_5(data.as_pointer(), freq.as_pointer(), (*size.borrow())) }), )); - return ((((((((*out.borrow()).as_ref().unwrap().borrow()[(0_usize) as usize] == 0) - && ((*out.borrow()).as_ref().unwrap().borrow()[(1_usize) as usize] == 100)) - && ((*out.borrow()).as_ref().unwrap().borrow()[(2_usize) as usize] == 101)) - && ((*out.borrow()).as_ref().unwrap().borrow()[(3_usize) as usize] == 1100)) - && ((*out.borrow()).as_ref().unwrap().borrow()[(4_usize) as usize] == 1101)) - && ((*out.borrow()).as_ref().unwrap().borrow()[(5_usize) as usize] == 111)) + return ((((((((*(*out.borrow()).as_ref().unwrap().borrow())[(0_usize) as usize] == 0) + && ((*(*out.borrow()).as_ref().unwrap().borrow())[(1_usize) as usize] == 100)) + && ((*(*out.borrow()).as_ref().unwrap().borrow())[(2_usize) as usize] == 101)) + && ((*(*out.borrow()).as_ref().unwrap().borrow())[(3_usize) as usize] == 1100)) + && ((*(*out.borrow()).as_ref().unwrap().borrow())[(4_usize) as usize] == 1101)) + && ((*(*out.borrow()).as_ref().unwrap().borrow())[(5_usize) as usize] == 111)) as i32); } diff --git a/tests/unit/out/refcount/implicit_autoref.rs b/tests/unit/out/refcount/implicit_autoref.rs index a406be113..46fbd98f3 100644 --- a/tests/unit/out/refcount/implicit_autoref.rs +++ b/tests/unit/out/refcount/implicit_autoref.rs @@ -6,19 +6,32 @@ use std::io::prelude::*; use std::io::{Read, Seek, Write}; use std::os::fd::AsFd; use std::rc::{Rc, Weak}; +#[repr(C)] #[derive(Default)] pub struct Holder { - pub v: Value>, + pub v: Vec, } impl Clone for Holder { fn clone(&self) -> Self { let mut this = Self { - v: Rc::new(RefCell::new((*self.v.borrow()).clone())), + v: (self.v).clone(), }; this } } -impl ByteRepr for Holder {} +impl ByteRepr for Holder { + fn byte_size() -> usize { + 24 + } + fn to_bytes(&self, buf: &mut [u8]) { + self.v.to_bytes(&mut buf[0..24]); + } + fn from_bytes(buf: &[u8]) -> Self { + Self { + v: >::from_bytes(&buf[0..24]), + } + } +} pub fn write_through_0(p: Ptr) { let p: Value> = Rc::new(RefCell::new(p)); (*p.borrow()).write(42); @@ -40,15 +53,23 @@ fn main_0() -> i32 { .offset(1_usize) .write(30); let h: Value = Rc::new(RefCell::new(::default())); - (*(*h.borrow()).v.borrow_mut()).push(40); - (*(*h.borrow()).v.borrow_mut()).push(50); + (*h.borrow_mut()).v.push(40); + (*h.borrow_mut()).v.push(50); let hp: Value> = Rc::new(RefCell::new((h.as_pointer()))); let b: Value = Rc::new(RefCell::new( - (((*(*hp.borrow()).upgrade().deref()).v.as_pointer() as Ptr) + (((*hp.borrow()).field_ptr( + 0, + |__v: &Holder| &__v.v[..], + |__v: &mut Holder| &mut __v.v[..], + ) as Ptr) .offset(0_usize) .read()), )); - ((*(*hp.borrow()).upgrade().deref()).v.as_pointer() as Ptr) + ((*hp.borrow()).field_ptr( + 0, + |__v: &Holder| &__v.v[..], + |__v: &mut Holder| &mut __v.v[..], + ) as Ptr) .offset(1_usize) .write(60); assert!(((*a.borrow()) == 10)); @@ -60,7 +81,11 @@ fn main_0() -> i32 { ); assert!(((*b.borrow()) == 40)); assert!( - ((((*(*hp.borrow()).upgrade().deref()).v.as_pointer() as Ptr) + ((((*hp.borrow()).field_ptr( + 0, + |__v: &Holder| &__v.v[..], + |__v: &mut Holder| &mut __v.v[..] + ) as Ptr) .offset(1_usize) .read()) == 60) diff --git a/tests/unit/out/refcount/kruskal.rs b/tests/unit/out/refcount/kruskal.rs index d5277b512..01e9990cb 100644 --- a/tests/unit/out/refcount/kruskal.rs +++ b/tests/unit/out/refcount/kruskal.rs @@ -6,18 +6,19 @@ use std::io::prelude::*; use std::io::{Read, Seek, Write}; use std::os::fd::AsFd; use std::rc::{Rc, Weak}; +#[repr(C)] #[derive(Default)] pub struct Edge { - pub u: Value, - pub v: Value, - pub weight: Value, + pub u: i32, + pub v: i32, + pub weight: f64, } impl Clone for Edge { fn clone(&self) -> Self { let mut this = Self { - u: Rc::new(RefCell::new((*self.u.borrow()))), - v: Rc::new(RefCell::new((*self.v.borrow()))), - weight: Rc::new(RefCell::new((*self.weight.borrow()))), + u: self.u, + v: self.v, + weight: self.weight, }; this } @@ -27,36 +28,32 @@ impl ByteRepr for Edge { 16 } fn to_bytes(&self, buf: &mut [u8]) { - (*self.u.borrow()).to_bytes(&mut buf[0..4]); - (*self.v.borrow()).to_bytes(&mut buf[4..8]); - (*self.weight.borrow()).to_bytes(&mut buf[8..16]); + self.u.to_bytes(&mut buf[0..4]); + self.v.to_bytes(&mut buf[4..8]); + self.weight.to_bytes(&mut buf[8..16]); } fn from_bytes(buf: &[u8]) -> Self { Self { - u: Rc::new(RefCell::new(::from_bytes(&buf[0..4]))), - v: Rc::new(RefCell::new(::from_bytes(&buf[4..8]))), - weight: Rc::new(RefCell::new(::from_bytes(&buf[8..16]))), + u: ::from_bytes(&buf[0..4]), + v: ::from_bytes(&buf[4..8]), + weight: ::from_bytes(&buf[8..16]), } } } pub fn partition_0(arr: Ptr>>>, start: i32, end: i32) -> i32 { let start: Value = Rc::new(RefCell::new(start)); let end: Value = Rc::new(RefCell::new(end)); - let pivot: Ptr = ((*arr.upgrade().deref()) - .as_ref() - .unwrap() - .as_pointer() + let pivot: Ptr = (((arr.read()).as_ref().unwrap().as_pointer() as Ptr) .offset(((*start.borrow()) as usize))) .clone(); let count: Value = Rc::new(RefCell::new(0)); let i: Value = Rc::new(RefCell::new(((*start.borrow()) + 1))); 'loop_: while ((*i.borrow()) <= (*end.borrow())) { if { - let _lhs = (*(*arr.upgrade().deref()).as_ref().unwrap().borrow() + let _lhs = (*(arr.read()).as_ref().unwrap().borrow()) [((*i.borrow()) as usize) as usize] - .weight - .borrow()); - _lhs <= (*(*pivot.upgrade().deref()).weight.borrow()) + .weight; + _lhs <= pivot.with(|__v| (*__v).weight) } { (*count.borrow_mut()).postfix_inc(); } @@ -64,123 +61,65 @@ pub fn partition_0(arr: Ptr>>>, start: i32, end: i32) - } let pidx: Value = Rc::new(RefCell::new(((*start.borrow()) + (*count.borrow())))); let tmp: Value = Rc::new(RefCell::new(Edge { - u: Rc::new(RefCell::new( - (*(*arr.upgrade().deref()).as_ref().unwrap().borrow() - [((*pidx.borrow()) as usize) as usize] - .u - .borrow()), - )), - v: Rc::new(RefCell::new( - (*(*arr.upgrade().deref()).as_ref().unwrap().borrow() - [((*pidx.borrow()) as usize) as usize] - .v - .borrow()), - )), - weight: Rc::new(RefCell::new( - (*(*arr.upgrade().deref()).as_ref().unwrap().borrow() - [((*pidx.borrow()) as usize) as usize] - .weight - .borrow()), - )), + u: (*(arr.read()).as_ref().unwrap().borrow())[((*pidx.borrow()) as usize) as usize].u, + v: (*(arr.read()).as_ref().unwrap().borrow())[((*pidx.borrow()) as usize) as usize].v, + weight: (*(arr.read()).as_ref().unwrap().borrow())[((*pidx.borrow()) as usize) as usize] + .weight, })); let __rhs = Edge { - u: Rc::new(RefCell::new( - (*(*arr.upgrade().deref()).as_ref().unwrap().borrow() - [((*start.borrow()) as usize) as usize] - .u - .borrow()), - )), - v: Rc::new(RefCell::new( - (*(*arr.upgrade().deref()).as_ref().unwrap().borrow() - [((*start.borrow()) as usize) as usize] - .v - .borrow()), - )), - weight: Rc::new(RefCell::new( - (*(*arr.upgrade().deref()).as_ref().unwrap().borrow() - [((*start.borrow()) as usize) as usize] - .weight - .borrow()), - )), + u: (*(arr.read()).as_ref().unwrap().borrow())[((*start.borrow()) as usize) as usize].u, + v: (*(arr.read()).as_ref().unwrap().borrow())[((*start.borrow()) as usize) as usize].v, + weight: (*(arr.read()).as_ref().unwrap().borrow())[((*start.borrow()) as usize) as usize] + .weight, }; - (*arr.upgrade().deref()).as_ref().unwrap().borrow_mut()[((*pidx.borrow()) as usize) as usize] = - __rhs; - (*arr.upgrade().deref()).as_ref().unwrap().borrow_mut() - [((*start.borrow()) as usize) as usize] = Edge { - u: Rc::new(RefCell::new((*(*tmp.borrow()).u.borrow()))), - v: Rc::new(RefCell::new((*(*tmp.borrow()).v.borrow()))), - weight: Rc::new(RefCell::new((*(*tmp.borrow()).weight.borrow()))), + (*(arr.read()).as_ref().unwrap().borrow_mut())[((*pidx.borrow()) as usize) as usize] = __rhs; + (*(arr.read()).as_ref().unwrap().borrow_mut())[((*start.borrow()) as usize) as usize] = Edge { + u: (*tmp.borrow()).u, + v: (*tmp.borrow()).v, + weight: (*tmp.borrow()).weight, }; let i: Value = Rc::new(RefCell::new((*start.borrow()))); let j: Value = Rc::new(RefCell::new((*end.borrow()))); 'loop_: while ((*i.borrow()) < (*pidx.borrow())) && ((*j.borrow()) > (*pidx.borrow())) { 'loop_: while { - let _lhs = (*(*arr.upgrade().deref()).as_ref().unwrap().borrow() + let _lhs = (*(arr.read()).as_ref().unwrap().borrow()) [((*i.borrow()) as usize) as usize] - .weight - .borrow()); - _lhs <= (*(*pivot.upgrade().deref()).weight.borrow()) + .weight; + _lhs <= pivot.with(|__v| (*__v).weight) } { (*i.borrow_mut()).prefix_inc(); } 'loop_: while { - let _lhs = (*(*arr.upgrade().deref()).as_ref().unwrap().borrow() + let _lhs = (*(arr.read()).as_ref().unwrap().borrow()) [((*j.borrow()) as usize) as usize] - .weight - .borrow()); - _lhs > (*(*pivot.upgrade().deref()).weight.borrow()) + .weight; + _lhs > pivot.with(|__v| (*__v).weight) } { (*j.borrow_mut()).prefix_dec(); } if ((*i.borrow()) < (*pidx.borrow())) && ((*j.borrow()) > (*pidx.borrow())) { (*tmp.borrow_mut()) = Edge { - u: Rc::new(RefCell::new( - (*(*arr.upgrade().deref()).as_ref().unwrap().borrow() - [((*i.borrow()) as usize) as usize] - .u - .borrow()), - )), - v: Rc::new(RefCell::new( - (*(*arr.upgrade().deref()).as_ref().unwrap().borrow() - [((*i.borrow()) as usize) as usize] - .v - .borrow()), - )), - weight: Rc::new(RefCell::new( - (*(*arr.upgrade().deref()).as_ref().unwrap().borrow() - [((*i.borrow()) as usize) as usize] - .weight - .borrow()), - )), + u: (*(arr.read()).as_ref().unwrap().borrow())[((*i.borrow()) as usize) as usize].u, + v: (*(arr.read()).as_ref().unwrap().borrow())[((*i.borrow()) as usize) as usize].v, + weight: (*(arr.read()).as_ref().unwrap().borrow()) + [((*i.borrow()) as usize) as usize] + .weight, }; let __rhs = Edge { - u: Rc::new(RefCell::new( - (*(*arr.upgrade().deref()).as_ref().unwrap().borrow() - [((*j.borrow()) as usize) as usize] - .u - .borrow()), - )), - v: Rc::new(RefCell::new( - (*(*arr.upgrade().deref()).as_ref().unwrap().borrow() - [((*j.borrow()) as usize) as usize] - .v - .borrow()), - )), - weight: Rc::new(RefCell::new( - (*(*arr.upgrade().deref()).as_ref().unwrap().borrow() - [((*j.borrow()) as usize) as usize] - .weight - .borrow()), - )), - }; - (*arr.upgrade().deref()).as_ref().unwrap().borrow_mut() - [((*i.borrow()) as usize) as usize] = __rhs; - (*arr.upgrade().deref()).as_ref().unwrap().borrow_mut() - [((*j.borrow()) as usize) as usize] = Edge { - u: Rc::new(RefCell::new((*(*tmp.borrow()).u.borrow()))), - v: Rc::new(RefCell::new((*(*tmp.borrow()).v.borrow()))), - weight: Rc::new(RefCell::new((*(*tmp.borrow()).weight.borrow()))), + u: (*(arr.read()).as_ref().unwrap().borrow())[((*j.borrow()) as usize) as usize].u, + v: (*(arr.read()).as_ref().unwrap().borrow())[((*j.borrow()) as usize) as usize].v, + weight: (*(arr.read()).as_ref().unwrap().borrow()) + [((*j.borrow()) as usize) as usize] + .weight, }; + (*(arr.read()).as_ref().unwrap().borrow_mut())[((*i.borrow()) as usize) as usize] = + __rhs; + (*(arr.read()).as_ref().unwrap().borrow_mut())[((*j.borrow()) as usize) as usize] = + Edge { + u: (*tmp.borrow()).u, + v: (*tmp.borrow()).v, + weight: (*tmp.borrow()).weight, + }; (*i.borrow_mut()).postfix_inc(); (*j.borrow_mut()).postfix_dec(); } @@ -214,41 +153,66 @@ pub fn quicksort_1(arr: Ptr>>>, start: i32, end: i32) { quicksort_1(_arr, _start, _end) }); } +#[repr(C)] #[derive(Default)] pub struct DisjointSet { - pub rank: Value>>>, - pub parent: Value>>>, - pub n: Value, + pub rank: Option>>, + pub parent: Option>>, + pub n: i32, +} +pub trait DisjointSetMethods { + fn makeSet(&self); + fn find(&self, x: i32) -> i32; + fn merge(&self, x: i32, y: i32); } -impl DisjointSet { - pub fn makeSet(&self) { +impl DisjointSetMethods for Ptr { + fn makeSet(&self) { let i: Value = Rc::new(RefCell::new(0)); - 'loop_: while ((*i.borrow()) < (*self.n.borrow())) { + 'loop_: while ((*i.borrow()) < self.with(|__v| (*__v).n)) { let __rhs = (*i.borrow()); - (*self.parent.borrow()).as_ref().unwrap().borrow_mut() - [((*i.borrow()) as usize) as usize] = __rhs; - (*self.rank.borrow()).as_ref().unwrap().borrow_mut() - [((*i.borrow()) as usize) as usize] = 1; + (*self + .with(|__v| (*__v).parent.clone()) + .as_ref() + .unwrap() + .borrow_mut())[((*i.borrow()) as usize) as usize] = __rhs; + (*self + .with(|__v| (*__v).rank.clone()) + .as_ref() + .unwrap() + .borrow_mut())[((*i.borrow()) as usize) as usize] = 1; (*i.borrow_mut()).postfix_inc(); } } - pub fn find(&self, x: i32) -> i32 { + fn find(&self, x: i32) -> i32 { let x: Value = Rc::new(RefCell::new(x)); - if ((*self.parent.borrow()).as_ref().unwrap().borrow()[((*x.borrow()) as usize) as usize] + if ((*self + .with(|__v| (*__v).parent.clone()) + .as_ref() + .unwrap() + .borrow())[((*x.borrow()) as usize) as usize] != (*x.borrow())) { let __rhs = ({ - let _x: i32 = (*self.parent.borrow()).as_ref().unwrap().borrow() - [((*x.borrow()) as usize) as usize]; + let _x: i32 = (*self + .with(|__v| (*__v).parent.clone()) + .as_ref() + .unwrap() + .borrow())[((*x.borrow()) as usize) as usize]; self.find(_x) }); - (*self.parent.borrow()).as_ref().unwrap().borrow_mut() - [((*x.borrow()) as usize) as usize] = __rhs; + (*self + .with(|__v| (*__v).parent.clone()) + .as_ref() + .unwrap() + .borrow_mut())[((*x.borrow()) as usize) as usize] = __rhs; } - return (*self.parent.borrow()).as_ref().unwrap().borrow() - [((*x.borrow()) as usize) as usize]; + return (*self + .with(|__v| (*__v).parent.clone()) + .as_ref() + .unwrap() + .borrow())[((*x.borrow()) as usize) as usize]; } - pub fn merge(&self, x: i32, y: i32) { + fn merge(&self, x: i32, y: i32) { let x: Value = Rc::new(RefCell::new(x)); let y: Value = Rc::new(RefCell::new(y)); let xset: Value = Rc::new(RefCell::new(({ self.find((*x.borrow())) }))); @@ -256,91 +220,157 @@ impl DisjointSet { if ((*xset.borrow()) == (*yset.borrow())) { return; } - if ((*self.rank.borrow()).as_ref().unwrap().borrow()[((*xset.borrow()) as usize) as usize] - < (*self.rank.borrow()).as_ref().unwrap().borrow() - [((*yset.borrow()) as usize) as usize]) + if ((*self + .with(|__v| (*__v).rank.clone()) + .as_ref() + .unwrap() + .borrow())[((*xset.borrow()) as usize) as usize] + < (*self + .with(|__v| (*__v).rank.clone()) + .as_ref() + .unwrap() + .borrow())[((*yset.borrow()) as usize) as usize]) { - (*self.parent.borrow()).as_ref().unwrap().borrow_mut() - [((*xset.borrow()) as usize) as usize] = (*yset.borrow()); - } else if ((*self.rank.borrow()).as_ref().unwrap().borrow() - [((*xset.borrow()) as usize) as usize] - > (*self.rank.borrow()).as_ref().unwrap().borrow() - [((*yset.borrow()) as usize) as usize]) + (*self + .with(|__v| (*__v).parent.clone()) + .as_ref() + .unwrap() + .borrow_mut())[((*xset.borrow()) as usize) as usize] = (*yset.borrow()); + } else if ((*self + .with(|__v| (*__v).rank.clone()) + .as_ref() + .unwrap() + .borrow())[((*xset.borrow()) as usize) as usize] + > (*self + .with(|__v| (*__v).rank.clone()) + .as_ref() + .unwrap() + .borrow())[((*yset.borrow()) as usize) as usize]) { - (*self.parent.borrow()).as_ref().unwrap().borrow_mut() - [((*yset.borrow()) as usize) as usize] = (*xset.borrow()); + (*self + .with(|__v| (*__v).parent.clone()) + .as_ref() + .unwrap() + .borrow_mut())[((*yset.borrow()) as usize) as usize] = (*xset.borrow()); } else { - (*self.parent.borrow()).as_ref().unwrap().borrow_mut() - [((*yset.borrow()) as usize) as usize] = (*xset.borrow()); - let __rhs = ((*self.rank.borrow()).as_ref().unwrap().borrow() - [((*xset.borrow()) as usize) as usize] + (*self + .with(|__v| (*__v).parent.clone()) + .as_ref() + .unwrap() + .borrow_mut())[((*yset.borrow()) as usize) as usize] = (*xset.borrow()); + let __rhs = ((*self + .with(|__v| (*__v).rank.clone()) + .as_ref() + .unwrap() + .borrow())[((*xset.borrow()) as usize) as usize] + 1); - (*self.rank.borrow()).as_ref().unwrap().borrow_mut() - [((*xset.borrow()) as usize) as usize] = __rhs; + (*self + .with(|__v| (*__v).rank.clone()) + .as_ref() + .unwrap() + .borrow_mut())[((*xset.borrow()) as usize) as usize] = __rhs; + } + } +} +impl ByteRepr for DisjointSet { + fn byte_size() -> usize { + 24 + } + fn to_bytes(&self, buf: &mut [u8]) { + self.rank.to_bytes(&mut buf[0..8]); + self.parent.to_bytes(&mut buf[8..16]); + self.n.to_bytes(&mut buf[16..20]); + } + fn from_bytes(buf: &[u8]) -> Self { + Self { + rank: >>>::from_bytes(&buf[0..8]), + parent: >>>::from_bytes(&buf[8..16]), + n: ::from_bytes(&buf[16..20]), } } } -impl ByteRepr for DisjointSet {} +#[repr(C)] #[derive(Default)] pub struct Graph { - pub edges: Value>>>, - pub V: Value, - pub E: Value, + pub edges: Option>>, + pub V: i32, + pub E: i32, +} +impl ByteRepr for Graph { + fn byte_size() -> usize { + 16 + } + fn to_bytes(&self, buf: &mut [u8]) { + self.edges.to_bytes(&mut buf[0..8]); + self.V.to_bytes(&mut buf[8..12]); + self.E.to_bytes(&mut buf[12..16]); + } + fn from_bytes(buf: &[u8]) -> Self { + Self { + edges: >>>::from_bytes(&buf[0..8]), + V: ::from_bytes(&buf[8..12]), + E: ::from_bytes(&buf[12..16]), + } + } } -impl ByteRepr for Graph {} pub fn MSTKruskal_2(graph: Ptr) -> f64 { ({ - let _arr: Ptr>>> = (*graph.upgrade().deref()).edges.as_pointer(); - let _end: i32 = ((*(*graph.upgrade().deref()).E.borrow()) - 1); + let _arr: Ptr>>> = graph.field_ptr( + 0, + |__v: &Graph| ::std::slice::from_ref(&__v.edges), + |__v: &mut Graph| ::std::slice::from_mut(&mut __v.edges), + ); + let _end: i32 = (graph.with(|__v| (*__v).E) - 1); quicksort_1(_arr, 0, _end) }); let set: Value = Rc::new(RefCell::new(DisjointSet { - rank: Rc::new(RefCell::new(Some(Rc::new(RefCell::new( - (0..((*(*graph.upgrade().deref()).V.borrow()) as usize)) + rank: Some(Rc::new(RefCell::new( + (0..(graph.with(|__v| (*__v).V) as usize)) .map(|_| ::default()) .collect::>(), - ))))), - parent: Rc::new(RefCell::new(Some(Rc::new(RefCell::new( - (0..((*(*graph.upgrade().deref()).V.borrow()) as usize)) + ))), + parent: Some(Rc::new(RefCell::new( + (0..(graph.with(|__v| (*__v).V) as usize)) .map(|_| ::default()) .collect::>(), - ))))), - n: Rc::new(RefCell::new((*(*graph.upgrade().deref()).V.borrow()))), + ))), + n: graph.with(|__v| (*__v).V), })); - ({ (*set.borrow()).makeSet() }); + ({ set.as_pointer().makeSet() }); let total_weight: Value = Rc::new(RefCell::new(0_f64)); let i: Value = Rc::new(RefCell::new(0)); 'loop_: while { let _lhs = (*i.borrow()); - _lhs < (*(*graph.upgrade().deref()).E.borrow()) + _lhs < graph.with(|__v| (*__v).E) } { let x: Value = Rc::new(RefCell::new( - (*(*(*graph.upgrade().deref()).edges.borrow()) + (*graph + .with(|__v| (*__v).edges.clone()) .as_ref() .unwrap() - .borrow()[((*i.borrow()) as usize) as usize] - .u - .borrow()), + .borrow())[((*i.borrow()) as usize) as usize] + .u, )); let y: Value = Rc::new(RefCell::new( - (*(*(*graph.upgrade().deref()).edges.borrow()) + (*graph + .with(|__v| (*__v).edges.clone()) .as_ref() .unwrap() - .borrow()[((*i.borrow()) as usize) as usize] - .v - .borrow()), + .borrow())[((*i.borrow()) as usize) as usize] + .v, )); let w: Value = Rc::new(RefCell::new( - (*(*(*graph.upgrade().deref()).edges.borrow()) + (*graph + .with(|__v| (*__v).edges.clone()) .as_ref() .unwrap() - .borrow()[((*i.borrow()) as usize) as usize] - .weight - .borrow()), + .borrow())[((*i.borrow()) as usize) as usize] + .weight, )); - if (({ (*set.borrow()).find((*x.borrow())) }) != ({ (*set.borrow()).find((*y.borrow())) })) + if (({ set.as_pointer().find((*x.borrow())) }) + != ({ set.as_pointer().find((*y.borrow())) })) { - ({ (*set.borrow()).merge((*x.borrow()), (*y.borrow())) }); + ({ set.as_pointer().merge((*x.borrow()), (*y.borrow())) }); (*total_weight.borrow_mut()) += (*w.borrow()); } (*i.borrow_mut()).prefix_inc(); @@ -354,53 +384,38 @@ fn main_0() -> i32 { let V: Value = Rc::new(RefCell::new(4)); let E: Value = Rc::new(RefCell::new(5)); let graph: Value = Rc::new(RefCell::new(Graph { - edges: Rc::new(RefCell::new(Some(Rc::new(RefCell::new( + edges: Some(Rc::new(RefCell::new( (0..((*E.borrow()) as usize)) .map(|_| ::default()) .collect::>(), - ))))), - V: Rc::new(RefCell::new((*V.borrow()))), - E: Rc::new(RefCell::new((*E.borrow()))), + ))), + V: (*V.borrow()), + E: (*E.borrow()), })); - (*(*graph.borrow()).edges.borrow()) - .as_ref() - .unwrap() - .borrow_mut()[(0_usize) as usize] = Edge { - u: Rc::new(RefCell::new(0)), - v: Rc::new(RefCell::new(1)), - weight: Rc::new(RefCell::new(10_f64)), + (*(*graph.borrow()).edges.as_ref().unwrap().borrow_mut())[(0_usize) as usize] = Edge { + u: 0, + v: 1, + weight: 10_f64, }; - (*(*graph.borrow()).edges.borrow()) - .as_ref() - .unwrap() - .borrow_mut()[(1_usize) as usize] = Edge { - u: Rc::new(RefCell::new(1)), - v: Rc::new(RefCell::new(3)), - weight: Rc::new(RefCell::new(15_f64)), + (*(*graph.borrow()).edges.as_ref().unwrap().borrow_mut())[(1_usize) as usize] = Edge { + u: 1, + v: 3, + weight: 15_f64, }; - (*(*graph.borrow()).edges.borrow()) - .as_ref() - .unwrap() - .borrow_mut()[(2_usize) as usize] = Edge { - u: Rc::new(RefCell::new(2)), - v: Rc::new(RefCell::new(3)), - weight: Rc::new(RefCell::new(4_f64)), + (*(*graph.borrow()).edges.as_ref().unwrap().borrow_mut())[(2_usize) as usize] = Edge { + u: 2, + v: 3, + weight: 4_f64, }; - (*(*graph.borrow()).edges.borrow()) - .as_ref() - .unwrap() - .borrow_mut()[(3_usize) as usize] = Edge { - u: Rc::new(RefCell::new(2)), - v: Rc::new(RefCell::new(0)), - weight: Rc::new(RefCell::new(6_f64)), + (*(*graph.borrow()).edges.as_ref().unwrap().borrow_mut())[(3_usize) as usize] = Edge { + u: 2, + v: 0, + weight: 6_f64, }; - (*(*graph.borrow()).edges.borrow()) - .as_ref() - .unwrap() - .borrow_mut()[(4_usize) as usize] = Edge { - u: Rc::new(RefCell::new(0)), - v: Rc::new(RefCell::new(3)), - weight: Rc::new(RefCell::new(5_f64)), + (*(*graph.borrow()).edges.as_ref().unwrap().borrow_mut())[(4_usize) as usize] = Edge { + u: 0, + v: 3, + weight: 5_f64, }; let total_weight: Value = Rc::new(RefCell::new(({ MSTKruskal_2(graph.as_pointer()) }))); return ((*total_weight.borrow()) as i32); diff --git a/tests/unit/out/refcount/libc_struct_without_default.rs b/tests/unit/out/refcount/libc_struct_without_default.rs index 9e5405656..9256ea9fd 100644 --- a/tests/unit/out/refcount/libc_struct_without_default.rs +++ b/tests/unit/out/refcount/libc_struct_without_default.rs @@ -6,16 +6,17 @@ use std::io::prelude::*; use std::io::{Read, Seek, Write}; use std::os::fd::AsFd; use std::rc::{Rc, Weak}; +#[repr(C)] #[derive()] pub struct UserDefined { - pub a: Value>, - pub v: Value>, + pub a: Vec, + pub v: Vec, } impl Clone for UserDefined { fn clone(&self) -> Self { let mut this = Self { - a: Rc::new(RefCell::new((*self.a.borrow()).clone())), - v: Rc::new(RefCell::new((*self.v.borrow()).clone())), + a: (self.a).clone(), + v: (self.v).clone(), }; this } @@ -23,22 +24,35 @@ impl Clone for UserDefined { impl Default for UserDefined { fn default() -> Self { UserDefined { - a: Rc::new(RefCell::new( - std::array::from_fn::<_, 1, _>(|_| Default::default()).to_vec(), - )), - v: Rc::new(RefCell::new(Default::default())), + a: std::array::from_fn::<_, 1, _>(|_| Default::default()).to_vec(), + v: Default::default(), } } } -impl ByteRepr for UserDefined {} +impl ByteRepr for UserDefined { + fn byte_size() -> usize { + 32 + } + fn to_bytes(&self, buf: &mut [u8]) { + self.a.to_bytes(&mut buf[0..4]); + self.v.to_bytes(&mut buf[8..32]); + } + fn from_bytes(buf: &[u8]) -> Self { + Self { + a: >::from_bytes(&buf[0..4]), + v: >::from_bytes(&buf[8..32]), + } + } +} +#[repr(C)] #[derive()] pub struct FieldIsLibcType { - pub addr: Value, + pub addr: libcc2rs::Sockaddr, } impl Clone for FieldIsLibcType { fn clone(&self) -> Self { let mut this = Self { - addr: Rc::new(RefCell::new((*self.addr.borrow()).clone())), + addr: (self.addr).clone(), }; this } @@ -46,44 +60,60 @@ impl Clone for FieldIsLibcType { impl Default for FieldIsLibcType { fn default() -> Self { FieldIsLibcType { - addr: Rc::new(RefCell::new(Default::default())), + addr: Default::default(), + } + } +} +impl ByteRepr for FieldIsLibcType { + fn byte_size() -> usize { + 16 + } + fn to_bytes(&self, buf: &mut [u8]) { + self.addr.to_bytes(&mut buf[0..16]); + } + fn from_bytes(buf: &[u8]) -> Self { + Self { + addr: ::from_bytes(&buf[0..16]), } } } -impl ByteRepr for FieldIsLibcType {} pub fn main() { std::process::exit(main_0()); } fn main_0() -> i32 { let p: Value = Rc::new(RefCell::new(Default::default())); - (*(*p.borrow()).fd.borrow_mut()) = -1_i32; - (*(*p.borrow()).events.borrow_mut()) = 0_i16; - (*(*p.borrow()).revents.borrow_mut()) = 2_i16; - assert!(((*(*p.borrow()).fd.borrow()) == -1_i32)); - assert!((((*(*p.borrow()).events.borrow()) as i32) == 0)); - assert!((((*(*p.borrow()).revents.borrow()) as i32) == 2)); + (*p.borrow_mut()).fd = -1_i32; + (*p.borrow_mut()).events = 0_i16; + (*p.borrow_mut()).revents = 2_i16; + assert!(((*p.borrow()).fd == -1_i32)); + assert!((((*p.borrow()).events as i32) == 0)); + assert!((((*p.borrow()).revents as i32) == 2)); let ia: Value = Rc::new(RefCell::new(Default::default())); - (*(*ia.borrow()).s_addr.borrow_mut()) = 1_u32; - assert!(((*(*ia.borrow()).s_addr.borrow()) == 1_u32)); + (*ia.borrow_mut()).s_addr = 1_u32; + assert!(((*ia.borrow()).s_addr == 1_u32)); let t: Value = Rc::new(RefCell::new(Default::default())); - (*(*t.borrow()).tm_year.borrow_mut()) = 124; - (*(*t.borrow()).tm_mon.borrow_mut()) = 5; - (*(*t.borrow()).tm_mday.borrow_mut()) = 15; - assert!(((*(*t.borrow()).tm_year.borrow()) == 124)); - assert!(((*(*t.borrow()).tm_mon.borrow()) == 5)); - assert!(((*(*t.borrow()).tm_mday.borrow()) == 15)); + (*t.borrow_mut()).tm_year = 124; + (*t.borrow_mut()).tm_mon = 5; + (*t.borrow_mut()).tm_mday = 15; + assert!(((*t.borrow()).tm_year == 124)); + assert!(((*t.borrow()).tm_mon == 5)); + assert!(((*t.borrow()).tm_mday == 15)); let st: Value = Rc::new(RefCell::new(Default::default())); - (*(*st.borrow()).st_size.borrow_mut()) = 1024_i64; - assert!(((*(*st.borrow()).st_size.borrow()) == 1024_i64)); + (*st.borrow_mut()).st_size = 1024_i64; + assert!(((*st.borrow()).st_size == 1024_i64)); let ud: Value = Rc::new(RefCell::new(::default())); assert!( - ((((*ud.borrow()).a.as_pointer() as Ptr) + (((ud.as_pointer().field_ptr( + 0, + |__v: &UserDefined| &__v.a[..], + |__v: &mut UserDefined| &mut __v.a[..] + ) as Ptr) .offset(0_usize) .read()) == 0) ); - assert!(((*(*ud.borrow()).v.borrow()).len() == 0_usize)); + assert!(((*ud.borrow()).v.len() == 0_usize)); let filt: Value = Rc::new(RefCell::new(::default())); - assert!((((*(*(*filt.borrow()).addr.borrow()).sa_family.borrow()) as i32) == 0)); + assert!((((*filt.borrow()).addr.sa_family as i32) == 0)); return 0; } diff --git a/tests/unit/out/refcount/struct_default_ctor.rs b/tests/unit/out/refcount/struct_default_ctor.rs index 39e1bd871..e1493994e 100644 --- a/tests/unit/out/refcount/struct_default_ctor.rs +++ b/tests/unit/out/refcount/struct_default_ctor.rs @@ -6,23 +6,22 @@ use std::io::prelude::*; use std::io::{Read, Seek, Write}; use std::os::fd::AsFd; use std::rc::{Rc, Weak}; +#[repr(C)] #[derive()] pub struct WOFF2Params { - pub extended_metadata: Value>, - pub brotli_quality: Value, - pub allow_transforms: Value, + pub extended_metadata: Vec, + pub brotli_quality: i32, + pub allow_transforms: bool, } impl WOFF2Params { pub fn WOFF2Params() -> Self { let mut this = Self { - extended_metadata: Rc::new(RefCell::new( - Ptr::from_string_literal(b"") - .to_c_string_iterator() - .chain(std::iter::once(0)) - .collect::>(), - )), - brotli_quality: Rc::new(RefCell::new(11)), - allow_transforms: Rc::new(RefCell::new(true)), + extended_metadata: Ptr::from_string_literal(b"") + .to_c_string_iterator() + .chain(std::iter::once(0)) + .collect::>(), + brotli_quality: 11, + allow_transforms: true, }; this } @@ -30,9 +29,9 @@ impl WOFF2Params { impl Clone for WOFF2Params { fn clone(&self) -> Self { let mut this = Self { - extended_metadata: Rc::new(RefCell::new((*self.extended_metadata.borrow()).clone())), - brotli_quality: Rc::new(RefCell::new((*self.brotli_quality.borrow()))), - allow_transforms: Rc::new(RefCell::new((*self.allow_transforms.borrow()))), + extended_metadata: (self.extended_metadata).clone(), + brotli_quality: self.brotli_quality, + allow_transforms: self.allow_transforms, }; this } @@ -42,14 +41,30 @@ impl Default for WOFF2Params { { WOFF2Params::WOFF2Params() } } } -impl ByteRepr for WOFF2Params {} +impl ByteRepr for WOFF2Params { + fn byte_size() -> usize { + 40 + } + fn to_bytes(&self, buf: &mut [u8]) { + self.extended_metadata.to_bytes(&mut buf[0..32]); + self.brotli_quality.to_bytes(&mut buf[32..36]); + self.allow_transforms.to_bytes(&mut buf[36..37]); + } + fn from_bytes(buf: &[u8]) -> Self { + Self { + extended_metadata: >::from_bytes(&buf[0..32]), + brotli_quality: ::from_bytes(&buf[32..36]), + allow_transforms: ::from_bytes(&buf[36..37]), + } + } +} pub fn main() { std::process::exit(main_0()); } fn main_0() -> i32 { let params: Value = Rc::new(RefCell::new(WOFF2Params::WOFF2Params())); - assert!((((*(*params.borrow()).extended_metadata.borrow()).len() - 1) == 0_usize)); - assert!(((*(*params.borrow()).brotli_quality.borrow()) == 11)); - assert!((((*(*params.borrow()).allow_transforms.borrow()) as i32) == (true as i32))); + assert!((((*params.borrow()).extended_metadata.len() - 1) == 0_usize)); + assert!(((*params.borrow()).brotli_quality == 11)); + assert!((((*params.borrow()).allow_transforms as i32) == (true as i32))); return 0; } diff --git a/tests/unit/out/refcount/typedef-anon-struct.rs b/tests/unit/out/refcount/typedef-anon-struct.rs index ebc6ad42b..c8a0d9dd6 100644 --- a/tests/unit/out/refcount/typedef-anon-struct.rs +++ b/tests/unit/out/refcount/typedef-anon-struct.rs @@ -6,16 +6,17 @@ use std::io::prelude::*; use std::io::{Read, Seek, Write}; use std::os::fd::AsFd; use std::rc::{Rc, Weak}; +#[repr(C)] #[derive(Default)] pub struct Outer_RunInfo { - pub block_idx: Value, - pub num_extra_zero_runs: Value, + pub block_idx: i32, + pub num_extra_zero_runs: i32, } impl Clone for Outer_RunInfo { fn clone(&self) -> Self { let mut this = Self { - block_idx: Rc::new(RefCell::new((*self.block_idx.borrow()))), - num_extra_zero_runs: Rc::new(RefCell::new((*self.num_extra_zero_runs.borrow()))), + block_idx: self.block_idx, + num_extra_zero_runs: self.num_extra_zero_runs, }; this } @@ -25,58 +26,73 @@ impl ByteRepr for Outer_RunInfo { 8 } fn to_bytes(&self, buf: &mut [u8]) { - (*self.block_idx.borrow()).to_bytes(&mut buf[0..4]); - (*self.num_extra_zero_runs.borrow()).to_bytes(&mut buf[4..8]); + self.block_idx.to_bytes(&mut buf[0..4]); + self.num_extra_zero_runs.to_bytes(&mut buf[4..8]); } fn from_bytes(buf: &[u8]) -> Self { Self { - block_idx: Rc::new(RefCell::new(::from_bytes(&buf[0..4]))), - num_extra_zero_runs: Rc::new(RefCell::new(::from_bytes(&buf[4..8]))), + block_idx: ::from_bytes(&buf[0..4]), + num_extra_zero_runs: ::from_bytes(&buf[4..8]), } } } +#[repr(C)] #[derive(Default)] pub struct Outer { - pub runs: Value>, + pub runs: Vec, } impl Clone for Outer { fn clone(&self) -> Self { let mut this = Self { - runs: Rc::new(RefCell::new((*self.runs.borrow()).clone())), + runs: (self.runs).clone(), }; this } } -impl ByteRepr for Outer {} +impl ByteRepr for Outer { + fn byte_size() -> usize { + 24 + } + fn to_bytes(&self, buf: &mut [u8]) { + self.runs.to_bytes(&mut buf[0..24]); + } + fn from_bytes(buf: &[u8]) -> Self { + Self { + runs: >::from_bytes(&buf[0..24]), + } + } +} pub fn main() { std::process::exit(main_0()); } fn main_0() -> i32 { let o: Value = Rc::new(RefCell::new(::default())); let info: Value = Rc::new(RefCell::new(::default())); - (*(*info.borrow()).block_idx.borrow_mut()) = 1; - (*(*info.borrow()).num_extra_zero_runs.borrow_mut()) = 2; + (*info.borrow_mut()).block_idx = 1; + (*info.borrow_mut()).num_extra_zero_runs = 2; { let a0_clone = (*info.borrow()).clone(); - (*(*o.borrow()).runs.borrow_mut()).push(a0_clone) + (*o.borrow_mut()).runs.push(a0_clone) }; - assert!(((*(*o.borrow()).runs.borrow()).len() == 1_usize)); + assert!(((*o.borrow()).runs.len() == 1_usize)); assert!( - ((*(*((*o.borrow()).runs.as_pointer() as Ptr) + ((o.as_pointer().field_ptr( + 0, + |__v: &Outer| &__v.runs[..], + |__v: &mut Outer| &mut __v.runs[..] + ) as Ptr) .offset(0_usize) - .upgrade() - .deref()) - .block_idx - .borrow()) + .with(|__v| (*__v).block_idx) == 1) ); assert!( - ((*(*((*o.borrow()).runs.as_pointer() as Ptr) + ((o.as_pointer().field_ptr( + 0, + |__v: &Outer| &__v.runs[..], + |__v: &mut Outer| &mut __v.runs[..] + ) as Ptr) .offset(0_usize) - .upgrade() - .deref()) - .num_extra_zero_runs - .borrow()) + .with(|__v| (*__v).num_extra_zero_runs) == 2) ); return 0; diff --git a/tests/unit/out/refcount/unique_ptr.rs b/tests/unit/out/refcount/unique_ptr.rs index 8f570b48a..e991a59f1 100644 --- a/tests/unit/out/refcount/unique_ptr.rs +++ b/tests/unit/out/refcount/unique_ptr.rs @@ -6,26 +6,51 @@ use std::io::prelude::*; use std::io::{Read, Seek, Write}; use std::os::fd::AsFd; use std::rc::{Rc, Weak}; +#[repr(C)] #[derive(Default)] pub struct SafePointer { - pub ptr: Value>>, + pub ptr: Option>, } -impl SafePointer { - pub fn inc(&self) { - (*(*self.ptr.borrow_mut()).as_ref().unwrap().borrow_mut()).prefix_inc(); +pub trait SafePointerMethods { + fn inc(&self); +} +impl SafePointerMethods for Ptr { + fn inc(&self) { + (*self + .with(|__v| (*__v).ptr.clone()) + .as_ref() + .unwrap() + .borrow_mut()) + .prefix_inc(); + } +} +impl ByteRepr for SafePointer { + fn byte_size() -> usize { + 8 + } + fn to_bytes(&self, buf: &mut [u8]) { + self.ptr.to_bytes(&mut buf[0..8]); + } + fn from_bytes(buf: &[u8]) -> Self { + Self { + ptr: >>::from_bytes(&buf[0..8]), + } } } -impl ByteRepr for SafePointer {} +#[repr(C)] #[derive(Default)] pub struct Pair { - pub x: Value, - pub y: Value, + pub x: i32, + pub y: i32, +} +pub trait PairMethods { + fn inc(&self, k: i32); } impl Clone for Pair { fn clone(&self) -> Self { let mut this = Self { - x: Rc::new(RefCell::new((*self.x.borrow()))), - y: Rc::new(RefCell::new((*self.y.borrow()))), + x: self.x, + y: self.y, }; this } @@ -35,21 +60,21 @@ impl ByteRepr for Pair { 8 } fn to_bytes(&self, buf: &mut [u8]) { - (*self.x.borrow()).to_bytes(&mut buf[0..4]); - (*self.y.borrow()).to_bytes(&mut buf[4..8]); + self.x.to_bytes(&mut buf[0..4]); + self.y.to_bytes(&mut buf[4..8]); } fn from_bytes(buf: &[u8]) -> Self { Self { - x: Rc::new(RefCell::new(::from_bytes(&buf[0..4]))), - y: Rc::new(RefCell::new(::from_bytes(&buf[4..8]))), + x: ::from_bytes(&buf[0..4]), + y: ::from_bytes(&buf[4..8]), } } } -impl Pair { - pub fn inc(&self, k: i32) { +impl PairMethods for Ptr { + fn inc(&self, k: i32) { let k: Value = Rc::new(RefCell::new(k)); - (*self.x.borrow_mut()) += (*k.borrow()); - (*self.y.borrow_mut()) += (*k.borrow()); + self.with_mut(|__v| __v.x += (*k.borrow())); + self.with_mut(|__v| __v.y += (*k.borrow())); } } pub fn DoStuffWithSafePointer_0(safe_ptr: Ptr>>) { @@ -59,11 +84,9 @@ pub fn DoStuffWithSafePointer_0(safe_ptr: Ptr>>) { (*x1.borrow_mut()) = (*x2.borrow_mut()).take(); let raw_ptr1: Value> = Rc::new(RefCell::new(((*x1.borrow()).as_pointer()))); (*raw_ptr1.borrow()).with_mut(|__v| __v.prefix_inc()); - (*(*(*safe_ptr.upgrade().deref()).as_ref().unwrap().borrow()) - .ptr - .borrow_mut()) = (*x1.borrow_mut()).take(); - ({ (*(*safe_ptr.upgrade().deref()).as_ref().unwrap().borrow()).inc() }); - ({ (*(*safe_ptr.upgrade().deref()).as_ref().unwrap().borrow()).inc() }); + (*(safe_ptr.read()).as_ref().unwrap().borrow_mut()).ptr = (*x1.borrow_mut()).take(); + ({ ((safe_ptr.read()).as_pointer()).inc() }); + ({ ((safe_ptr.read()).as_pointer()).inc() }); let x3: Value>> = Rc::new(RefCell::new(Some(Rc::new(RefCell::new(10))))); let x4: Value>> = Rc::new(RefCell::new(Some(Rc::new(RefCell::new(20))))); let __rhs = ((*(*x3.borrow()).as_ref().unwrap().borrow()) @@ -73,32 +96,30 @@ pub fn DoStuffWithSafePointer_0(safe_ptr: Ptr>>) { let raw_ptr2: Value> = Rc::new(RefCell::new(((*x4.borrow()).as_pointer()))); { let _ptr = (*raw_ptr2.borrow()).clone(); - _ptr.write(_ptr.read() + 1) + _ptr.write((_ptr.read()) + 1) }; let pair: Value>> = Rc::new(RefCell::new(Some(Rc::new(RefCell::new(Pair { - x: Rc::new(RefCell::new(((*raw_ptr2.borrow()).read()))), - y: Rc::new(RefCell::new(5)), + x: ((*raw_ptr2.borrow()).read()), + y: 5, }))))); - ({ (*(*pair.borrow()).as_ref().unwrap().borrow()).inc(10) }); + ({ ((*pair.borrow()).as_pointer()).inc(10) }); let __rhs = { let _lhs = { - let _lhs = (*(*(*(*safe_ptr.upgrade().deref()).as_ref().unwrap().borrow()) + let _lhs = (*(*(safe_ptr.read()).as_ref().unwrap().borrow()) .ptr - .borrow()) - .as_ref() - .unwrap() - .borrow()); - _lhs + (*(*(*pair.borrow()).as_ref().unwrap().borrow()).x.borrow()) + .as_ref() + .unwrap() + .borrow()); + _lhs + (*(*pair.borrow()).as_ref().unwrap().borrow()).x }; - _lhs + (*(*(*pair.borrow()).as_ref().unwrap().borrow()).y.borrow()) + _lhs + (*(*pair.borrow()).as_ref().unwrap().borrow()).y }; - (*(*(*(*safe_ptr.upgrade().deref()).as_ref().unwrap().borrow()) + (*(*(safe_ptr.read()).as_ref().unwrap().borrow_mut()) .ptr - .borrow_mut()) - .as_ref() - .unwrap() - .borrow_mut()) = __rhs; + .as_ref() + .unwrap() + .borrow_mut()) = __rhs; } pub fn Consume_1(safe_ptr: Option>) -> i32 { let safe_ptr: Value>> = Rc::new(RefCell::new(safe_ptr)); @@ -106,11 +127,12 @@ pub fn Consume_1(safe_ptr: Option>) -> i32 { Rc::new(RefCell::new((*safe_ptr.borrow_mut()).take())); let p: Value>> = Rc::new(RefCell::new(Ptr::alloc(::default()).to_owned_opt())); - return ((*(*(*(*x.borrow()).as_ref().unwrap().borrow()).ptr.borrow()) + return ((*(*(*x.borrow()).as_ref().unwrap().borrow()) + .ptr .as_ref() .unwrap() .borrow()) - + (*(*(*p.borrow()).as_ref().unwrap().borrow()).x.borrow())); + + (*(*p.borrow()).as_ref().unwrap().borrow()).x); } pub fn RndStuff_2() { let x1: Value>>> = Rc::new(RefCell::new(None)); @@ -124,7 +146,7 @@ pub fn RndStuff_2() { )); let i: Value = Rc::new(RefCell::new(0)); 'loop_: while ((*i.borrow()) < 100) { - (*x2.borrow()).as_ref().unwrap().borrow_mut()[((*i.borrow()) as usize) as usize] = 1; + (*(*x2.borrow()).as_ref().unwrap().borrow_mut())[((*i.borrow()) as usize) as usize] = 1; (*i.borrow_mut()).prefix_inc(); } (*x2.borrow_mut()) = Ptr::alloc_array( @@ -135,13 +157,13 @@ pub fn RndStuff_2() { .to_owned_opt(); let i: Value = Rc::new(RefCell::new(0)); 'loop_: while ((*i.borrow()) < 200) { - (*x2.borrow()).as_ref().unwrap().borrow_mut()[((*i.borrow()) as usize) as usize] = 2; + (*(*x2.borrow()).as_ref().unwrap().borrow_mut())[((*i.borrow()) as usize) as usize] = 2; (*i.borrow_mut()).prefix_inc(); } let p2: Value> = Rc::new(RefCell::new((*x2.borrow()).as_pointer())); let i: Value = Rc::new(RefCell::new(0)); 'loop_: while ((*i.borrow()) < 200) { - assert!((((*p2.borrow()).offset((*i.borrow()) as isize).read()) == 2)); + assert!((((*p2.borrow()).offset(((*i.borrow()) as isize)).read()) == 2)); (*i.borrow_mut()).prefix_inc(); } let x3: Value>>> = Rc::new(RefCell::new(Some(Rc::new(RefCell::new( @@ -151,50 +173,40 @@ pub fn RndStuff_2() { ))))); let i: Value = Rc::new(RefCell::new(0)); 'loop_: while ((*i.borrow()) < 10) { - (*x3.borrow()).as_ref().unwrap().borrow_mut()[((*i.borrow()) as usize) as usize] = Pair { - x: Rc::new(RefCell::new(1)), - y: Rc::new(RefCell::new(2)), - }; + (*(*x3.borrow()).as_ref().unwrap().borrow_mut())[((*i.borrow()) as usize) as usize] = + Pair { x: 1, y: 2 }; (*i.borrow_mut()).prefix_inc(); } let p3_0: Value> = Rc::new(RefCell::new((*x3.borrow()).as_pointer())); let i: Value = Rc::new(RefCell::new(0)); 'loop_: while ((*i.borrow()) < 10) { assert!( - ((*(*(*p3_0.borrow()) - .offset((*i.borrow()) as isize) - .upgrade() - .deref()) - .x - .borrow()) + ((*p3_0.borrow()) + .offset(((*i.borrow()) as isize)) + .with(|__v| (*__v).x) == 1) ); assert!( - ((*(*(*p3_0.borrow()) - .offset((*i.borrow()) as isize) - .upgrade() - .deref()) - .y - .borrow()) + ((*p3_0.borrow()) + .offset(((*i.borrow()) as isize)) + .with(|__v| (*__v).y) == 2) ); - ({ (*x3.borrow()).as_ref().unwrap().borrow()[((*i.borrow()) as usize) as usize].inc(10) }); + ({ + ((*x3.borrow()).as_ref().unwrap().as_pointer() as Ptr) + .offset(((*i.borrow()) as usize)) + .inc(10) + }); assert!( - ((*(*(*p3_0.borrow()) - .offset((*i.borrow()) as isize) - .upgrade() - .deref()) - .x - .borrow()) + ((*p3_0.borrow()) + .offset(((*i.borrow()) as isize)) + .with(|__v| (*__v).x) == 11) ); assert!( - ((*(*(*p3_0.borrow()) - .offset((*i.borrow()) as isize) - .upgrade() - .deref()) - .y - .borrow()) + ((*p3_0.borrow()) + .offset(((*i.borrow()) as isize)) + .with(|__v| (*__v).y) == 12) ); (*i.borrow_mut()).prefix_inc(); @@ -207,10 +219,11 @@ pub fn RndStuff_2() { .to_owned_opt(); let i: Value = Rc::new(RefCell::new(0)); 'loop_: while ((*i.borrow()) < 50) { - (*x3.borrow()).as_ref().unwrap().borrow_mut()[((*i.borrow()) as usize) as usize] = Pair { - x: Rc::new(RefCell::new(-1_i32)), - y: Rc::new(RefCell::new(-2_i32)), - }; + (*(*x3.borrow()).as_ref().unwrap().borrow_mut())[((*i.borrow()) as usize) as usize] = + Pair { + x: -1_i32, + y: -2_i32, + }; (*i.borrow_mut()).prefix_inc(); } let p3_1: Value> = Rc::new(RefCell::new((*x3.borrow()).as_pointer())); @@ -221,43 +234,32 @@ pub fn RndStuff_2() { let i: Value = Rc::new(RefCell::new(0)); 'loop_: while ((*i.borrow()) < 50) { assert!( - ((*(*(*p3_1.borrow()) - .offset((*i.borrow()) as isize) - .upgrade() - .deref()) - .x - .borrow()) + ((*p3_1.borrow()) + .offset(((*i.borrow()) as isize)) + .with(|__v| (*__v).x) == -1_i32) ); assert!( - ((*(*(*p3_1.borrow()) - .offset((*i.borrow()) as isize) - .upgrade() - .deref()) - .y - .borrow()) + ((*p3_1.borrow()) + .offset(((*i.borrow()) as isize)) + .with(|__v| (*__v).y) == -2_i32) ); ({ - (*x3.borrow()).as_ref().unwrap().borrow()[((*i.borrow()) as usize) as usize] + ((*x3.borrow()).as_ref().unwrap().as_pointer() as Ptr) + .offset(((*i.borrow()) as usize)) .inc(-10_i32) }); assert!( - ((*(*(*p3_1.borrow()) - .offset((*i.borrow()) as isize) - .upgrade() - .deref()) - .x - .borrow()) + ((*p3_1.borrow()) + .offset(((*i.borrow()) as isize)) + .with(|__v| (*__v).x) == -11_i32) ); assert!( - ((*(*(*p3_1.borrow()) - .offset((*i.borrow()) as isize) - .upgrade() - .deref()) - .y - .borrow()) + ((*p3_1.borrow()) + .offset(((*i.borrow()) as isize)) + .with(|__v| (*__v).y) == -12_i32) ); (*i.borrow_mut()).prefix_inc(); @@ -270,7 +272,7 @@ fn main_0() -> i32 { let x: Value>> = Rc::new(RefCell::new(Some(Rc::new(RefCell::new(0))))); let safe_ptr: Value>> = Rc::new(RefCell::new(Some(Rc::new(RefCell::new(SafePointer { - ptr: Rc::new(RefCell::new((*x.borrow_mut()).take())), + ptr: (*x.borrow_mut()).take(), }))))); ({ DoStuffWithSafePointer_0(safe_ptr.as_pointer()) }); return ({ Consume_1((*safe_ptr.borrow_mut()).take()) }); diff --git a/tests/unit/out/refcount/unique_ptr_const_deref.rs b/tests/unit/out/refcount/unique_ptr_const_deref.rs index ee468020c..f83da2901 100644 --- a/tests/unit/out/refcount/unique_ptr_const_deref.rs +++ b/tests/unit/out/refcount/unique_ptr_const_deref.rs @@ -6,14 +6,28 @@ use std::io::prelude::*; use std::io::{Read, Seek, Write}; use std::os::fd::AsFd; use std::rc::{Rc, Weak}; +#[repr(C)] #[derive(Default)] pub struct Holder { - pub val: Value>>, + pub val: Option>, +} +impl ByteRepr for Holder { + fn byte_size() -> usize { + 8 + } + fn to_bytes(&self, buf: &mut [u8]) { + self.val.to_bytes(&mut buf[0..8]); + } + fn from_bytes(buf: &[u8]) -> Self { + Self { + val: >>::from_bytes(&buf[0..8]), + } + } } -impl ByteRepr for Holder {} pub fn read_val_0(h: Ptr) -> i32 { let h: Value> = Rc::new(RefCell::new(h)); - return (*(*(*(*h.borrow()).upgrade().deref()).val.borrow()) + return (*(*h.borrow()) + .with(|__v| (*__v).val.clone()) .as_ref() .unwrap() .borrow()); @@ -21,7 +35,8 @@ pub fn read_val_0(h: Ptr) -> i32 { pub fn write_val_1(h: Ptr, v: i32) { let h: Value> = Rc::new(RefCell::new(h)); let v: Value = Rc::new(RefCell::new(v)); - (*(*(*(*h.borrow()).upgrade().deref()).val.borrow_mut()) + (*(*h.borrow()) + .with(|__v| (*__v).val.clone()) .as_ref() .unwrap() .borrow_mut()) = (*v.borrow()); @@ -31,7 +46,7 @@ pub fn main() { } fn main_0() -> i32 { let h: Value = Rc::new(RefCell::new(::default())); - (*(*h.borrow()).val.borrow_mut()) = Some(Rc::new(RefCell::new(10))); + (*h.borrow_mut()).val = Some(Rc::new(RefCell::new(10))); ({ write_val_1((h.as_pointer()), 42) }); return ({ read_val_0((h.as_pointer())) }); } diff --git a/tests/unit/out/refcount/unique_ptr_nested.rs b/tests/unit/out/refcount/unique_ptr_nested.rs index e1ad91819..20a8f380a 100644 --- a/tests/unit/out/refcount/unique_ptr_nested.rs +++ b/tests/unit/out/refcount/unique_ptr_nested.rs @@ -6,16 +6,17 @@ use std::io::prelude::*; use std::io::{Read, Seek, Write}; use std::os::fd::AsFd; use std::rc::{Rc, Weak}; +#[repr(C)] #[derive(Default)] pub struct Inner { - pub x: Value, - pub y: Value, + pub x: i32, + pub y: i32, } impl Clone for Inner { fn clone(&self) -> Self { let mut this = Self { - x: Rc::new(RefCell::new((*self.x.borrow()))), - y: Rc::new(RefCell::new((*self.y.borrow()))), + x: self.x, + y: self.y, }; this } @@ -25,51 +26,60 @@ impl ByteRepr for Inner { 8 } fn to_bytes(&self, buf: &mut [u8]) { - (*self.x.borrow()).to_bytes(&mut buf[0..4]); - (*self.y.borrow()).to_bytes(&mut buf[4..8]); + self.x.to_bytes(&mut buf[0..4]); + self.y.to_bytes(&mut buf[4..8]); } fn from_bytes(buf: &[u8]) -> Self { Self { - x: Rc::new(RefCell::new(::from_bytes(&buf[0..4]))), - y: Rc::new(RefCell::new(::from_bytes(&buf[4..8]))), + x: ::from_bytes(&buf[0..4]), + y: ::from_bytes(&buf[4..8]), } } } +#[repr(C)] #[derive(Default)] pub struct Outer { - pub inner: Value>>, + pub inner: Option>, +} +impl ByteRepr for Outer { + fn byte_size() -> usize { + 8 + } + fn to_bytes(&self, buf: &mut [u8]) { + self.inner.to_bytes(&mut buf[0..8]); + } + fn from_bytes(buf: &[u8]) -> Self { + Self { + inner: >>::from_bytes(&buf[0..8]), + } + } } -impl ByteRepr for Outer {} pub fn main() { std::process::exit(main_0()); } fn main_0() -> i32 { let o: Value>> = Rc::new(RefCell::new(Some(Rc::new(RefCell::new(Outer { - inner: Rc::new(RefCell::new(Some(Rc::new(RefCell::new(Inner { - x: Rc::new(RefCell::new(10)), - y: Rc::new(RefCell::new(20)), - }))))), + inner: Some(Rc::new(RefCell::new(Inner { x: 10, y: 20 }))), }))))); - (*(*(*(*(*o.borrow()).as_ref().unwrap().borrow()).inner.borrow()) + (*(*(*o.borrow_mut()).as_ref().unwrap().borrow_mut()) + .inner .as_ref() .unwrap() - .borrow()) - .x - .borrow_mut()) += 5; + .borrow_mut()) + .x += 5; let sum: Value = Rc::new(RefCell::new( - ((*(*(*(*(*o.borrow()).as_ref().unwrap().borrow()).inner.borrow()) + ((*(*(*o.borrow()).as_ref().unwrap().borrow()) + .inner + .as_ref() + .unwrap() + .borrow()) + .x + (*(*(*o.borrow()).as_ref().unwrap().borrow()) + .inner .as_ref() .unwrap() .borrow()) - .x - .borrow()) - + (*(*(*(*(*o.borrow()).as_ref().unwrap().borrow()).inner.borrow()) - .as_ref() - .unwrap() - .borrow()) - .y - .borrow())), + .y), )); let a: Value>> = Rc::new(RefCell::new(Some(Rc::new(RefCell::new(100))))); let b: Value>> = Rc::new(RefCell::new(Some(Rc::new(RefCell::new(0))))); diff --git a/tests/unit/out/refcount/void_cast.rs b/tests/unit/out/refcount/void_cast.rs index 0933260f7..1f44d414a 100644 --- a/tests/unit/out/refcount/void_cast.rs +++ b/tests/unit/out/refcount/void_cast.rs @@ -10,25 +10,38 @@ pub fn unused_param_0(x: i32) { let x: Value = Rc::new(RefCell::new(x)); (*x.borrow_mut()); } +#[repr(C)] #[derive(Default)] pub struct NonTrivial { - pub data: Value>, + pub data: Vec, } impl Clone for NonTrivial { fn clone(&self) -> Self { let mut this = Self { - data: Rc::new(RefCell::new((*self.data.borrow()).clone())), + data: (self.data).clone(), }; this } } -impl ByteRepr for NonTrivial {} +impl ByteRepr for NonTrivial { + fn byte_size() -> usize { + 24 + } + fn to_bytes(&self, buf: &mut [u8]) { + self.data.to_bytes(&mut buf[0..24]); + } + fn from_bytes(buf: &[u8]) -> Self { + Self { + data: >::from_bytes(&buf[0..24]), + } + } +} pub fn unused_ref_param_1(x: Ptr) { - (*x.upgrade().deref()).clone(); + (x.read()).clone(); } pub fn unused_ptr_param_2(p: Ptr) { let p: Value> = Rc::new(RefCell::new(p)); - (*(*p.borrow()).upgrade().deref()).clone(); + ((*p.borrow()).read()).clone(); } thread_local!( pub static side_effect_counter_3: Value = Rc::new(RefCell::new(0)); @@ -37,15 +50,14 @@ pub fn bump_and_return_4() -> i32 { (*side_effect_counter_3.with(Value::clone).borrow_mut()).prefix_inc(); return (*side_effect_counter_3.with(Value::clone).borrow()); } +#[repr(C)] #[derive(Default)] pub struct Holder { - pub field: Value, + pub field: i32, } impl Clone for Holder { fn clone(&self) -> Self { - let mut this = Self { - field: Rc::new(RefCell::new((*self.field.borrow()))), - }; + let mut this = Self { field: self.field }; this } } @@ -54,11 +66,11 @@ impl ByteRepr for Holder { 4 } fn to_bytes(&self, buf: &mut [u8]) { - (*self.field.borrow()).to_bytes(&mut buf[0..4]); + self.field.to_bytes(&mut buf[0..4]); } fn from_bytes(buf: &[u8]) -> Self { Self { - field: Rc::new(RefCell::new(::from_bytes(&buf[0..4]))), + field: ::from_bytes(&buf[0..4]), } } } @@ -116,12 +128,10 @@ fn main_0() -> i32 { (*p.borrow_mut()).clone(); let arr: Value> = Rc::new(RefCell::new(Box::new([1, 2, 3]))); ((*arr.borrow_mut())[(1) as usize]); - let h: Value = Rc::new(RefCell::new(Holder { - field: Rc::new(RefCell::new(17)), - })); - (*(*h.borrow()).field.borrow_mut()); + let h: Value = Rc::new(RefCell::new(Holder { field: 17 })); + ((*h.borrow()).field); let hp: Value> = Rc::new(RefCell::new((h.as_pointer()))); - (*(*(*hp.borrow()).upgrade().deref()).field.borrow_mut()); + ((*hp.borrow()).with(|__v| (*__v).field)); let nt: Value = Rc::new(RefCell::new(::default())); ({ unused_ref_param_1(nt.as_pointer()) }); ({ unused_ptr_param_2((nt.as_pointer())) }); From c732fbe51d4009cc581e642c67edd3c2e652c32f Mon Sep 17 00:00:00 2001 From: Lucian Popescu Date: Tue, 11 Aug 2026 13:23:42 +0100 Subject: [PATCH 2/2] Update tests --- .../out/refcount/array_of_noncopy_struct.rs | 35 +- tests/unit/out/refcount/class_templates.rs | 217 ++++----- .../refcount/foreach_disjoint_field_borrow.rs | 28 +- tests/unit/out/refcount/huffman.rs | 399 +++++++--------- tests/unit/out/refcount/implicit_autoref.rs | 31 +- tests/unit/out/refcount/kruskal.rs | 449 +++++++++--------- .../refcount/libc_struct_without_default.rs | 76 ++- tests/unit/out/refcount/push_emplace_back.rs | 18 +- .../unit/out/refcount/struct_default_ctor.rs | 45 +- .../unit/out/refcount/typedef-anon-struct.rs | 56 +-- tests/unit/out/refcount/unique_ptr.rs | 196 ++++---- .../out/refcount/unique_ptr_const_deref.rs | 15 +- tests/unit/out/refcount/unique_ptr_nested.rs | 54 ++- tests/unit/out/refcount/void_cast.rs | 32 +- 14 files changed, 791 insertions(+), 860 deletions(-) diff --git a/tests/unit/out/refcount/array_of_noncopy_struct.rs b/tests/unit/out/refcount/array_of_noncopy_struct.rs index d8da5fd7c..bfd0462fa 100644 --- a/tests/unit/out/refcount/array_of_noncopy_struct.rs +++ b/tests/unit/out/refcount/array_of_noncopy_struct.rs @@ -6,17 +6,16 @@ use std::io::prelude::*; use std::io::{Read, Seek, Write}; use std::os::fd::AsFd; use std::rc::{Rc, Weak}; -#[repr(C)] #[derive(Default)] pub struct NonCopy { - pub data: Vec, - pub tag: i32, + pub data: Value>, + pub tag: Value, } impl Clone for NonCopy { fn clone(&self) -> Self { let mut this = Self { - data: (self.data).clone(), - tag: self.tag, + data: Rc::new(RefCell::new((*self.data.borrow()).clone())), + tag: Rc::new(RefCell::new((*self.tag.borrow()))), }; this } @@ -26,13 +25,13 @@ impl ByteRepr for NonCopy { 32 } fn to_bytes(&self, buf: &mut [u8]) { - self.data.to_bytes(&mut buf[0..24]); - self.tag.to_bytes(&mut buf[24..28]); + (*self.data.borrow()).to_bytes(&mut buf[0..24]); + (*self.tag.borrow()).to_bytes(&mut buf[24..28]); } fn from_bytes(buf: &[u8]) -> Self { Self { - data: >::from_bytes(&buf[0..24]), - tag: ::from_bytes(&buf[24..28]), + data: Rc::new(RefCell::new(>::from_bytes(&buf[0..24]))), + tag: Rc::new(RefCell::new(::from_bytes(&buf[24..28]))), } } } @@ -45,21 +44,17 @@ fn main_0() -> i32 { .map(|_| ::default()) .collect::>(), )); - (*arr.borrow_mut())[(0) as usize].tag = 7; - (*arr.borrow_mut())[(1) as usize].data.push(42); - assert!(((*arr.borrow())[(0) as usize].tag == 7)); - assert!(((*arr.borrow())[(1) as usize].data.len() == 1_usize)); + (*(*arr.borrow())[(0) as usize].tag.borrow_mut()) = 7; + (*(*arr.borrow())[(1) as usize].data.borrow_mut()).push(42); + assert!(((*(*arr.borrow())[(0) as usize].tag.borrow()) == 7)); + assert!(((*(*arr.borrow())[(1) as usize].data.borrow()).len() == 1_usize)); assert!( - ((((arr.as_pointer() as Ptr).offset(1).field_ptr( - 0, - |__v: &NonCopy| &__v.data[..], - |__v: &mut NonCopy| &mut __v.data[..] - ) as Ptr) + ((((*arr.borrow())[(1) as usize].data.as_pointer() as Ptr) .offset(0_usize) .read()) == 42) ); - assert!(((*arr.borrow())[(2) as usize].tag == 0)); - assert!(((*arr.borrow())[(2) as usize].data.len() == 0_usize)); + assert!(((*(*arr.borrow())[(2) as usize].tag.borrow()) == 0)); + assert!(((*(*arr.borrow())[(2) as usize].data.borrow()).len() == 0_usize)); return 0; } diff --git a/tests/unit/out/refcount/class_templates.rs b/tests/unit/out/refcount/class_templates.rs index 6b970c6f9..183fbd415 100644 --- a/tests/unit/out/refcount/class_templates.rs +++ b/tests/unit/out/refcount/class_templates.rs @@ -6,57 +6,38 @@ use std::io::prelude::*; use std::io::{Read, Seek, Write}; use std::os::fd::AsFd; use std::rc::{Rc, Weak}; -#[repr(C)] #[derive(Default)] pub struct MyContainer_int_ { - vec_: Vec, + vec_: Value>, } -pub trait MyContainer_int_Methods { - fn empty(&self) -> bool; - fn size(&self) -> usize; - fn back_const(&self) -> Ptr; - fn back(&self) -> Ptr; - fn pop_back(&self); - fn push_back(&self, item: Ptr); -} -impl MyContainer_int_Methods for Ptr { - fn empty(&self) -> bool { - return self.with(|__v| (*__v).vec_.clone()).is_empty(); - } - fn size(&self) -> usize { - return self.with(|__v| (*__v).vec_.clone()).len(); - } - fn back_const(&self) -> Ptr { - return (self.field_ptr( - 0, - |__v: &MyContainer_int_| &__v.vec_[..], - |__v: &mut MyContainer_int_| &mut __v.vec_[..], - ) as Ptr) - .to_last(); - } - fn back(&self) -> Ptr { - return (self.field_ptr( - 0, - |__v: &MyContainer_int_| &__v.vec_[..], - |__v: &mut MyContainer_int_| &mut __v.vec_[..], - ) as Ptr) - .to_last(); - } - fn pop_back(&self) { - self.with_mut(|__v| __v.vec_.pop()); +impl MyContainer_int_ { + pub fn empty(&self) -> bool { + return (*self.vec_.borrow()).is_empty(); + } + pub fn size(&self) -> usize { + return (*self.vec_.borrow()).len(); + } + pub fn back_const(&self) -> Ptr { + return (self.vec_.as_pointer() as Ptr).to_last(); + } + pub fn back(&self) -> Ptr { + return (self.vec_.as_pointer() as Ptr).to_last(); + } + pub fn pop_back(&self) { + (*self.vec_.borrow_mut()).pop(); return; } - fn push_back(&self, item: Ptr) { + pub fn push_back(&self, item: Ptr) { { let a0_clone = (item.read()).clone(); - self.with_mut(|__v| __v.vec_.push(a0_clone)) + (*self.vec_.borrow_mut()).push(a0_clone) }; } } impl Clone for MyContainer_int_ { fn clone(&self) -> Self { let mut this = Self { - vec_: (self.vec_).clone(), + vec_: Rc::new(RefCell::new((*self.vec_.borrow()).clone())), }; this } @@ -66,65 +47,46 @@ impl ByteRepr for MyContainer_int_ { 24 } fn to_bytes(&self, buf: &mut [u8]) { - self.vec_.to_bytes(&mut buf[0..24]); + (*self.vec_.borrow()).to_bytes(&mut buf[0..24]); } fn from_bytes(buf: &[u8]) -> Self { Self { - vec_: >::from_bytes(&buf[0..24]), + vec_: Rc::new(RefCell::new(>::from_bytes(&buf[0..24]))), } } } -#[repr(C)] #[derive(Default)] pub struct MyContainer_char_ { - vec_: Vec, -} -pub trait MyContainer_char_Methods { - fn empty(&self) -> bool; - fn size(&self) -> usize; - fn back_const(&self) -> Ptr; - fn back(&self) -> Ptr; - fn pop_back(&self); - fn push_back(&self, item: Ptr); + vec_: Value>, } -impl MyContainer_char_Methods for Ptr { - fn empty(&self) -> bool { - return self.with(|__v| (*__v).vec_.clone()).is_empty(); - } - fn size(&self) -> usize { - return self.with(|__v| (*__v).vec_.clone()).len(); - } - fn back_const(&self) -> Ptr { - return (self.field_ptr( - 0, - |__v: &MyContainer_char_| &__v.vec_[..], - |__v: &mut MyContainer_char_| &mut __v.vec_[..], - ) as Ptr) - .to_last(); - } - fn back(&self) -> Ptr { - return (self.field_ptr( - 0, - |__v: &MyContainer_char_| &__v.vec_[..], - |__v: &mut MyContainer_char_| &mut __v.vec_[..], - ) as Ptr) - .to_last(); - } - fn pop_back(&self) { - self.with_mut(|__v| __v.vec_.pop()); +impl MyContainer_char_ { + pub fn empty(&self) -> bool { + return (*self.vec_.borrow()).is_empty(); + } + pub fn size(&self) -> usize { + return (*self.vec_.borrow()).len(); + } + pub fn back_const(&self) -> Ptr { + return (self.vec_.as_pointer() as Ptr).to_last(); + } + pub fn back(&self) -> Ptr { + return (self.vec_.as_pointer() as Ptr).to_last(); + } + pub fn pop_back(&self) { + (*self.vec_.borrow_mut()).pop(); return; } - fn push_back(&self, item: Ptr) { + pub fn push_back(&self, item: Ptr) { { let a0_clone = (item.read()).clone(); - self.with_mut(|__v| __v.vec_.push(a0_clone)) + (*self.vec_.borrow_mut()).push(a0_clone) }; } } impl Clone for MyContainer_char_ { fn clone(&self) -> Self { let mut this = Self { - vec_: (self.vec_).clone(), + vec_: Rc::new(RefCell::new((*self.vec_.borrow()).clone())), }; this } @@ -134,65 +96,46 @@ impl ByteRepr for MyContainer_char_ { 24 } fn to_bytes(&self, buf: &mut [u8]) { - self.vec_.to_bytes(&mut buf[0..24]); + (*self.vec_.borrow()).to_bytes(&mut buf[0..24]); } fn from_bytes(buf: &[u8]) -> Self { Self { - vec_: >::from_bytes(&buf[0..24]), + vec_: Rc::new(RefCell::new(>::from_bytes(&buf[0..24]))), } } } -#[repr(C)] #[derive(Default)] pub struct MyContainer_float_ { - vec_: Vec, + vec_: Value>, } -pub trait MyContainer_float_Methods { - fn empty(&self) -> bool; - fn size(&self) -> usize; - fn back_const(&self) -> Ptr; - fn back(&self) -> Ptr; - fn pop_back(&self); - fn push_back(&self, item: Ptr); -} -impl MyContainer_float_Methods for Ptr { - fn empty(&self) -> bool { - return self.with(|__v| (*__v).vec_.clone()).is_empty(); - } - fn size(&self) -> usize { - return self.with(|__v| (*__v).vec_.clone()).len(); - } - fn back_const(&self) -> Ptr { - return (self.field_ptr( - 0, - |__v: &MyContainer_float_| &__v.vec_[..], - |__v: &mut MyContainer_float_| &mut __v.vec_[..], - ) as Ptr) - .to_last(); - } - fn back(&self) -> Ptr { - return (self.field_ptr( - 0, - |__v: &MyContainer_float_| &__v.vec_[..], - |__v: &mut MyContainer_float_| &mut __v.vec_[..], - ) as Ptr) - .to_last(); - } - fn pop_back(&self) { - self.with_mut(|__v| __v.vec_.pop()); +impl MyContainer_float_ { + pub fn empty(&self) -> bool { + return (*self.vec_.borrow()).is_empty(); + } + pub fn size(&self) -> usize { + return (*self.vec_.borrow()).len(); + } + pub fn back_const(&self) -> Ptr { + return (self.vec_.as_pointer() as Ptr).to_last(); + } + pub fn back(&self) -> Ptr { + return (self.vec_.as_pointer() as Ptr).to_last(); + } + pub fn pop_back(&self) { + (*self.vec_.borrow_mut()).pop(); return; } - fn push_back(&self, item: Ptr) { + pub fn push_back(&self, item: Ptr) { { let a0_clone = (item.read()).clone(); - self.with_mut(|__v| __v.vec_.push(a0_clone)) + (*self.vec_.borrow_mut()).push(a0_clone) }; } } impl Clone for MyContainer_float_ { fn clone(&self) -> Self { let mut this = Self { - vec_: (self.vec_).clone(), + vec_: Rc::new(RefCell::new((*self.vec_.borrow()).clone())), }; this } @@ -202,11 +145,11 @@ impl ByteRepr for MyContainer_float_ { 24 } fn to_bytes(&self, buf: &mut [u8]) { - self.vec_.to_bytes(&mut buf[0..24]); + (*self.vec_.borrow()).to_bytes(&mut buf[0..24]); } fn from_bytes(buf: &[u8]) -> Self { Self { - vec_: >::from_bytes(&buf[0..24]), + vec_: Rc::new(RefCell::new(>::from_bytes(&buf[0..24]))), } } } @@ -215,39 +158,39 @@ pub fn main() { } fn main_0() -> i32 { let imc: Value = Rc::new(RefCell::new(::default())); - assert!(({ imc.as_pointer().empty() })); + assert!(({ (*imc.borrow()).empty() })); ({ let _item: Value = Rc::new(RefCell::new(1)); - imc.as_pointer().push_back(_item.as_pointer()) + (*imc.borrow()).push_back(_item.as_pointer()) }); assert!( - (({ imc.as_pointer().size() }) == 1_usize) && ((({ imc.as_pointer().back() }).read()) == 1) + (({ (*imc.borrow()).size() }) == 1_usize) && ((({ (*imc.borrow()).back() }).read()) == 1) ); - ({ imc.as_pointer().pop_back() }); - assert!(({ imc.as_pointer().empty() })); + ({ (*imc.borrow()).pop_back() }); + assert!(({ (*imc.borrow()).empty() })); let cmc: Value = Rc::new(RefCell::new(::default())); - assert!(({ cmc.as_pointer().empty() })); + assert!(({ (*cmc.borrow()).empty() })); ({ let _item: Value = Rc::new(RefCell::new(('a' as u8))); - cmc.as_pointer().push_back(_item.as_pointer()) + (*cmc.borrow()).push_back(_item.as_pointer()) }); assert!( - (({ cmc.as_pointer().size() }) == 1_usize) - && (((({ cmc.as_pointer().back() }).read()) as i32) == (('a' as u8) as i32)) + (({ (*cmc.borrow()).size() }) == 1_usize) + && (((({ (*cmc.borrow()).back() }).read()) as i32) == (('a' as u8) as i32)) ); - ({ cmc.as_pointer().pop_back() }); - assert!(({ cmc.as_pointer().empty() })); + ({ (*cmc.borrow()).pop_back() }); + assert!(({ (*cmc.borrow()).empty() })); let fmc: Value = Rc::new(RefCell::new(::default())); - assert!(({ fmc.as_pointer().empty() })); + assert!(({ (*fmc.borrow()).empty() })); ({ let _item: Value = Rc::new(RefCell::new((1.0E+0 as f32))); - fmc.as_pointer().push_back(_item.as_pointer()) + (*fmc.borrow()).push_back(_item.as_pointer()) }); assert!( - (({ fmc.as_pointer().size() }) == 1_usize) - && (((({ fmc.as_pointer().back() }).read()) as f64) == 1.0E+0) + (({ (*fmc.borrow()).size() }) == 1_usize) + && (((({ (*fmc.borrow()).back() }).read()) as f64) == 1.0E+0) ); - ({ fmc.as_pointer().pop_back() }); - assert!(({ fmc.as_pointer().empty() })); + ({ (*fmc.borrow()).pop_back() }); + assert!(({ (*fmc.borrow()).empty() })); return 0; } diff --git a/tests/unit/out/refcount/foreach_disjoint_field_borrow.rs b/tests/unit/out/refcount/foreach_disjoint_field_borrow.rs index 74cb57be1..57c56051c 100644 --- a/tests/unit/out/refcount/foreach_disjoint_field_borrow.rs +++ b/tests/unit/out/refcount/foreach_disjoint_field_borrow.rs @@ -6,17 +6,16 @@ use std::io::prelude::*; use std::io::{Read, Seek, Write}; use std::os::fd::AsFd; use std::rc::{Rc, Weak}; -#[repr(C)] #[derive(Default)] pub struct S { - pub v: Vec, - pub a: i32, + pub v: Value>, + pub a: Value, } impl Clone for S { fn clone(&self) -> Self { let mut this = Self { - v: (self.v).clone(), - a: self.a, + v: Rc::new(RefCell::new((*self.v.borrow()).clone())), + a: Rc::new(RefCell::new((*self.a.borrow()))), }; this } @@ -26,13 +25,13 @@ impl ByteRepr for S { 32 } fn to_bytes(&self, buf: &mut [u8]) { - self.v.to_bytes(&mut buf[0..24]); - self.a.to_bytes(&mut buf[24..28]); + (*self.v.borrow()).to_bytes(&mut buf[0..24]); + (*self.a.borrow()).to_bytes(&mut buf[24..28]); } fn from_bytes(buf: &[u8]) -> Self { Self { - v: >::from_bytes(&buf[0..24]), - a: ::from_bytes(&buf[24..28]), + v: Rc::new(RefCell::new(>::from_bytes(&buf[0..24]))), + a: Rc::new(RefCell::new(::from_bytes(&buf[24..28]))), } } } @@ -41,13 +40,10 @@ pub fn main() { } fn main_0() -> i32 { let s: Value = Rc::new(RefCell::new(::default())); - (*s.borrow_mut()).v.push(1); - 'loop_: for mut e in - (s.as_pointer() - .field_ptr(0, |__v: &S| &__v.v[..], |__v: &mut S| &mut __v.v[..]) as Ptr) - { - let e: Value = Rc::new(RefCell::new((e.read()).clone())); - (*s.borrow_mut()).a.postfix_inc(); + (*(*s.borrow()).v.borrow_mut()).push(1); + 'loop_: for mut e in (*s.borrow()).v.as_pointer() as Ptr { + let e: Value = Rc::new(RefCell::new(e.read().clone())); + (*(*s.borrow()).a.borrow_mut()).postfix_inc(); } return 0; } diff --git a/tests/unit/out/refcount/huffman.rs b/tests/unit/out/refcount/huffman.rs index 80b5ace35..e2f608afb 100644 --- a/tests/unit/out/refcount/huffman.rs +++ b/tests/unit/out/refcount/huffman.rs @@ -6,30 +6,25 @@ use std::io::prelude::*; use std::io::{Read, Seek, Write}; use std::os::fd::AsFd; use std::rc::{Rc, Weak}; -#[repr(C)] #[derive(Default)] pub struct MinHeapNode { - pub data: u8, - pub freq: i32, - pub left: Ptr, - pub right: Ptr, + pub data: Value, + pub freq: Value, + pub left: Value>, + pub right: Value>, } -pub trait MinHeapNodeMethods { - fn IsLeaf(&self) -> bool; -} -impl MinHeapNodeMethods for Ptr { - fn IsLeaf(&self) -> bool { - return ((self.with(|__v| (*__v).left.clone())).is_null()) - && ((self.with(|__v| (*__v).right.clone())).is_null()); +impl MinHeapNode { + pub fn IsLeaf(&self) -> bool { + return ((*self.left.borrow()).is_null()) && ((*self.right.borrow()).is_null()); } } impl Clone for MinHeapNode { fn clone(&self) -> Self { let mut this = Self { - data: self.data, - freq: self.freq, - left: (self.left).clone(), - right: (self.right).clone(), + data: Rc::new(RefCell::new((*self.data.borrow()))), + freq: Rc::new(RefCell::new((*self.freq.borrow()))), + left: Rc::new(RefCell::new((*self.left.borrow()).clone())), + right: Rc::new(RefCell::new((*self.right.borrow()).clone())), }; this } @@ -39,201 +34,165 @@ impl ByteRepr for MinHeapNode { 24 } fn to_bytes(&self, buf: &mut [u8]) { - self.data.to_bytes(&mut buf[0..1]); - self.freq.to_bytes(&mut buf[4..8]); - self.left.to_bytes(&mut buf[8..16]); - self.right.to_bytes(&mut buf[16..24]); + (*self.data.borrow()).to_bytes(&mut buf[0..1]); + (*self.freq.borrow()).to_bytes(&mut buf[4..8]); + (*self.left.borrow()).to_bytes(&mut buf[8..16]); + (*self.right.borrow()).to_bytes(&mut buf[16..24]); } fn from_bytes(buf: &[u8]) -> Self { Self { - data: ::from_bytes(&buf[0..1]), - freq: ::from_bytes(&buf[4..8]), - left: >::from_bytes(&buf[8..16]), - right: >::from_bytes(&buf[16..24]), + data: Rc::new(RefCell::new(::from_bytes(&buf[0..1]))), + freq: Rc::new(RefCell::new(::from_bytes(&buf[4..8]))), + left: Rc::new(RefCell::new(>::from_bytes(&buf[8..16]))), + right: Rc::new(RefCell::new(>::from_bytes(&buf[16..24]))), } } } pub fn Swap_0(a: Ptr, b: Ptr) { let t: Value = Rc::new(RefCell::new(MinHeapNode { - data: a.with(|__v| (*__v).data), - freq: a.with(|__v| (*__v).freq), - left: (a.with(|__v| (*__v).left.clone())).clone(), - right: (a.with(|__v| (*__v).right.clone())).clone(), + data: Rc::new(RefCell::new((*(*a.upgrade().deref()).data.borrow()))), + freq: Rc::new(RefCell::new((*(*a.upgrade().deref()).freq.borrow()))), + left: Rc::new(RefCell::new( + (*(*a.upgrade().deref()).left.borrow()).clone(), + )), + right: Rc::new(RefCell::new( + (*(*a.upgrade().deref()).right.borrow()).clone(), + )), })); let __rhs = MinHeapNode { - data: b.with(|__v| (*__v).data), - freq: b.with(|__v| (*__v).freq), - left: (b.with(|__v| (*__v).left.clone())).clone(), - right: (b.with(|__v| (*__v).right.clone())).clone(), + data: Rc::new(RefCell::new((*(*b.upgrade().deref()).data.borrow()))), + freq: Rc::new(RefCell::new((*(*b.upgrade().deref()).freq.borrow()))), + left: Rc::new(RefCell::new( + (*(*b.upgrade().deref()).left.borrow()).clone(), + )), + right: Rc::new(RefCell::new( + (*(*b.upgrade().deref()).right.borrow()).clone(), + )), }; a.write(__rhs); let __rhs = MinHeapNode { - data: (*t.borrow()).data, - freq: (*t.borrow()).freq, - left: ((*t.borrow()).left).clone(), - right: ((*t.borrow()).right).clone(), + data: Rc::new(RefCell::new((*(*t.borrow()).data.borrow()))), + freq: Rc::new(RefCell::new((*(*t.borrow()).freq.borrow()))), + left: Rc::new(RefCell::new((*(*t.borrow()).left.borrow()).clone())), + right: Rc::new(RefCell::new((*(*t.borrow()).right.borrow()).clone())), }; b.write(__rhs); } -#[repr(C)] #[derive(Default)] pub struct MinHeap { - pub size: i32, - pub capacity: i32, - pub arr: Option]>>>, - pub next: i32, - pub alloc: Option>>, -} -pub trait MinHeapMethods { - fn Alloc(&self, data: u8, freq: i32) -> Ptr; - fn Heapify(&self, idx: i32); - fn ExtractMin(&self) -> Ptr; - fn Insert(&self, node: Ptr); - fn Build( - &self, - data: Ptr>>>, - freq: Ptr>>>, - n: i32, - ); + pub size: Value, + pub capacity: Value, + pub arr: Value]>>>>, + pub next: Value, + pub alloc: Value>>>, } -impl MinHeapMethods for Ptr { - fn Alloc(&self, data: u8, freq: i32) -> Ptr { +impl MinHeap { + pub fn Alloc(&self, data: u8, freq: i32) -> Ptr { let data: Value = Rc::new(RefCell::new(data)); let freq: Value = Rc::new(RefCell::new(freq)); - (*self - .with(|__v| (*__v).alloc.clone()) - .as_ref() - .unwrap() - .borrow_mut())[(self.with(|__v| (*__v).next) as usize) as usize] = MinHeapNode { - data: (*data.borrow()), - freq: (*freq.borrow()), - left: Ptr::::null(), - right: Ptr::::null(), + (*self.alloc.borrow()).as_ref().unwrap().borrow_mut() + [((*self.next.borrow()) as usize) as usize] = MinHeapNode { + data: Rc::new(RefCell::new((*data.borrow()))), + freq: Rc::new(RefCell::new((*freq.borrow()))), + left: Rc::new(RefCell::new(Ptr::::null())), + right: Rc::new(RefCell::new(Ptr::::null())), }; - return ((self - .with(|__v| (*__v).alloc.clone()) + return ((*self.alloc.borrow()) .as_ref() .unwrap() - .as_pointer() as Ptr) - .offset((self.with_mut(|__v| __v.next.postfix_inc()) as usize))) + .as_pointer() + .offset(((*self.next.borrow_mut()).postfix_inc() as usize))) .clone(); } - fn Heapify(&self, idx: i32) { + pub fn Heapify(&self, idx: i32) { let idx: Value = Rc::new(RefCell::new(idx)); let smallest: Value = Rc::new(RefCell::new((*idx.borrow()))); let left: Value = Rc::new(RefCell::new(((2 * (*idx.borrow())) + 1))); let right: Value = Rc::new(RefCell::new(((2 * (*idx.borrow())) + 2))); - if ((*left.borrow()) < self.with(|__v| (*__v).size)) - && ((*self - .with(|__v| (*__v).arr.clone()) - .as_ref() - .unwrap() - .borrow())[((*left.borrow()) as usize) as usize] - .with(|__v| (*__v).freq) - < (*self - .with(|__v| (*__v).arr.clone()) - .as_ref() - .unwrap() - .borrow())[((*smallest.borrow()) as usize) as usize] - .with(|__v| (*__v).freq)) + if ((*left.borrow()) < (*self.size.borrow())) + && ((*(*(*self.arr.borrow()).as_ref().unwrap().borrow() + [((*left.borrow()) as usize) as usize] + .upgrade() + .deref()) + .freq + .borrow()) + < (*(*(*self.arr.borrow()).as_ref().unwrap().borrow() + [((*smallest.borrow()) as usize) as usize] + .upgrade() + .deref()) + .freq + .borrow())) { (*smallest.borrow_mut()) = (*left.borrow()); } - if ((*right.borrow()) < self.with(|__v| (*__v).size)) - && ((*self - .with(|__v| (*__v).arr.clone()) - .as_ref() - .unwrap() - .borrow())[((*right.borrow()) as usize) as usize] - .with(|__v| (*__v).freq) - < (*self - .with(|__v| (*__v).arr.clone()) - .as_ref() - .unwrap() - .borrow())[((*smallest.borrow()) as usize) as usize] - .with(|__v| (*__v).freq)) + if ((*right.borrow()) < (*self.size.borrow())) + && ((*(*(*self.arr.borrow()).as_ref().unwrap().borrow() + [((*right.borrow()) as usize) as usize] + .upgrade() + .deref()) + .freq + .borrow()) + < (*(*(*self.arr.borrow()).as_ref().unwrap().borrow() + [((*smallest.borrow()) as usize) as usize] + .upgrade() + .deref()) + .freq + .borrow())) { (*smallest.borrow_mut()) = (*right.borrow()); } if ((*smallest.borrow()) != (*idx.borrow())) { ({ - let _a: Ptr = ((*self - .with(|__v| (*__v).arr.clone()) - .as_ref() - .unwrap() - .borrow())[((*smallest.borrow()) as usize) as usize]) + let _a: Ptr = ((*self.arr.borrow()).as_ref().unwrap().borrow() + [((*smallest.borrow()) as usize) as usize]) .clone(); - let _b: Ptr = ((*self - .with(|__v| (*__v).arr.clone()) - .as_ref() - .unwrap() - .borrow())[((*idx.borrow()) as usize) as usize]) + let _b: Ptr = ((*self.arr.borrow()).as_ref().unwrap().borrow() + [((*idx.borrow()) as usize) as usize]) .clone(); Swap_0(_a, _b) }); ({ self.Heapify((*smallest.borrow())) }); } } - fn ExtractMin(&self) -> Ptr { + pub fn ExtractMin(&self) -> Ptr { let out: Value> = Rc::new(RefCell::new( - ((*self - .with(|__v| (*__v).arr.clone()) - .as_ref() - .unwrap() - .borrow())[(0_usize) as usize]) - .clone(), + ((*self.arr.borrow()).as_ref().unwrap().borrow()[(0_usize) as usize]).clone(), )); - self.with_mut(|__v| __v.size.prefix_dec()); - let __rhs = ((*self - .with(|__v| (*__v).arr.clone()) - .as_ref() - .unwrap() - .borrow())[(self.with(|__v| (*__v).size) as usize) as usize]) + (*self.size.borrow_mut()).prefix_dec(); + let __rhs = ((*self.arr.borrow()).as_ref().unwrap().borrow() + [((*self.size.borrow()) as usize) as usize]) .clone(); - (*self - .with(|__v| (*__v).arr.clone()) - .as_ref() - .unwrap() - .borrow_mut())[(0_usize) as usize] = __rhs; + (*self.arr.borrow()).as_ref().unwrap().borrow_mut()[(0_usize) as usize] = __rhs; ({ self.Heapify(0) }); return (*out.borrow()).clone(); } - fn Insert(&self, node: Ptr) { + pub fn Insert(&self, node: Ptr) { let node: Value> = Rc::new(RefCell::new(node)); - self.with_mut(|__v| __v.size.prefix_inc()); - let i: Value = Rc::new(RefCell::new((self.with(|__v| (*__v).size) - 1))); + (*self.size.borrow_mut()).prefix_inc(); + let i: Value = Rc::new(RefCell::new(((*self.size.borrow()) - 1))); 'loop_: while ((*i.borrow()) != 0) && ({ - let _lhs = (*node.borrow()).with(|__v| (*__v).freq); - _lhs < (*self - .with(|__v| (*__v).arr.clone()) - .as_ref() - .unwrap() - .borrow())[((((*i.borrow()) - 1) / 2) as usize) as usize] - .with(|__v| (*__v).freq) + let _lhs = (*(*(*node.borrow()).upgrade().deref()).freq.borrow()); + _lhs < (*(*(*self.arr.borrow()).as_ref().unwrap().borrow() + [((((*i.borrow()) - 1) / 2) as usize) as usize] + .upgrade() + .deref()) + .freq + .borrow()) }) { - let __rhs = ((*self - .with(|__v| (*__v).arr.clone()) - .as_ref() - .unwrap() - .borrow())[((((*i.borrow()) - 1) / 2) as usize) as usize]) + let __rhs = ((*self.arr.borrow()).as_ref().unwrap().borrow() + [((((*i.borrow()) - 1) / 2) as usize) as usize]) .clone(); - (*self - .with(|__v| (*__v).arr.clone()) - .as_ref() - .unwrap() - .borrow_mut())[((*i.borrow()) as usize) as usize] = __rhs; + (*self.arr.borrow()).as_ref().unwrap().borrow_mut() + [((*i.borrow()) as usize) as usize] = __rhs; let __rhs = (((*i.borrow()) - 1) / 2); (*i.borrow_mut()) = __rhs; } - (*self - .with(|__v| (*__v).arr.clone()) - .as_ref() - .unwrap() - .borrow_mut())[((*i.borrow()) as usize) as usize] = (*node.borrow()).clone(); + (*self.arr.borrow()).as_ref().unwrap().borrow_mut()[((*i.borrow()) as usize) as usize] = + (*node.borrow()).clone(); } - fn Build( + pub fn Build( &self, data: Ptr>>>, freq: Ptr>>>, @@ -242,21 +201,17 @@ impl MinHeapMethods for Ptr { let n: Value = Rc::new(RefCell::new(n)); let i: Value = Rc::new(RefCell::new(0)); 'loop_: while ((*i.borrow()) < (*n.borrow())) { - (*self - .with(|__v| (*__v).arr.clone()) - .as_ref() - .unwrap() - .borrow_mut())[(self.with_mut(|__v| __v.size.postfix_inc()) as usize) as usize] = - ({ - let _data: u8 = (*(data.read()).as_ref().unwrap().borrow()) - [((*i.borrow()) as usize) as usize]; - let _freq: i32 = (*(freq.read()).as_ref().unwrap().borrow()) - [((*i.borrow()) as usize) as usize]; - self.Alloc(_data, _freq) - }); + (*self.arr.borrow()).as_ref().unwrap().borrow_mut() + [((*self.size.borrow_mut()).postfix_inc() as usize) as usize] = ({ + let _data: u8 = (*data.upgrade().deref()).as_ref().unwrap().borrow() + [((*i.borrow()) as usize) as usize]; + let _freq: i32 = (*freq.upgrade().deref()).as_ref().unwrap().borrow() + [((*i.borrow()) as usize) as usize]; + self.Alloc(_data, _freq) + }); (*i.borrow_mut()).prefix_inc(); } - let i: Value = Rc::new(RefCell::new(((self.with(|__v| (*__v).size) - 2) / 2))); + let i: Value = Rc::new(RefCell::new((((*self.size.borrow()) - 2) / 2))); 'loop_: while ((*i.borrow()) >= 0) { ({ self.Heapify((*i.borrow())) }); (*i.borrow_mut()).prefix_dec(); @@ -268,19 +223,23 @@ impl ByteRepr for MinHeap { 32 } fn to_bytes(&self, buf: &mut [u8]) { - self.size.to_bytes(&mut buf[0..4]); - self.capacity.to_bytes(&mut buf[4..8]); - self.arr.to_bytes(&mut buf[8..16]); - self.next.to_bytes(&mut buf[16..20]); - self.alloc.to_bytes(&mut buf[24..32]); + (*self.size.borrow()).to_bytes(&mut buf[0..4]); + (*self.capacity.borrow()).to_bytes(&mut buf[4..8]); + (*self.arr.borrow()).to_bytes(&mut buf[8..16]); + (*self.next.borrow()).to_bytes(&mut buf[16..20]); + (*self.alloc.borrow()).to_bytes(&mut buf[24..32]); } fn from_bytes(buf: &[u8]) -> Self { Self { - size: ::from_bytes(&buf[0..4]), - capacity: ::from_bytes(&buf[4..8]), - arr: ]>>>>::from_bytes(&buf[8..16]), - next: ::from_bytes(&buf[16..20]), - alloc: >>>::from_bytes(&buf[24..32]), + size: Rc::new(RefCell::new(::from_bytes(&buf[0..4]))), + capacity: Rc::new(RefCell::new(::from_bytes(&buf[4..8]))), + arr: Rc::new(RefCell::new( + ]>>>>::from_bytes(&buf[8..16]), + )), + next: Rc::new(RefCell::new(::from_bytes(&buf[16..20]))), + alloc: Rc::new(RefCell::new( + >>>::from_bytes(&buf[24..32]), + )), } } } @@ -288,19 +247,19 @@ pub fn AllocMinHeap_1(capacity: i32) -> Option> { let capacity: Value = Rc::new(RefCell::new(capacity)); let minHeap: Value>> = Rc::new(RefCell::new(Some(Rc::new(RefCell::new(MinHeap { - size: 0, - capacity: (*capacity.borrow()), - arr: Some(Rc::new(RefCell::new( + size: Rc::new(RefCell::new(0)), + capacity: Rc::new(RefCell::new((*capacity.borrow()))), + arr: Rc::new(RefCell::new(Some(Rc::new(RefCell::new( (0..((*capacity.borrow()) as usize)) .map(|_| >::default()) .collect::>(), - ))), - next: 0, - alloc: Some(Rc::new(RefCell::new( + ))))), + next: Rc::new(RefCell::new(0)), + alloc: Rc::new(RefCell::new(Some(Rc::new(RefCell::new( (0..10000_usize) .map(|_| ::default()) .collect::>(), - ))), + ))))), }))))); return (*minHeap.borrow_mut()).take(); } @@ -316,26 +275,30 @@ pub fn Huffman_2( let _data: Ptr>>> = (data).clone(); let _freq: Ptr>>> = (freq).clone(); let _n: i32 = (*size.borrow()); - ((*minHeap.borrow()).as_pointer()).Build(_data, _freq, _n) + (*(*minHeap.borrow()).as_ref().unwrap().borrow()).Build(_data, _freq, _n) }); - 'loop_: while ((*(*minHeap.borrow()).as_ref().unwrap().borrow()).size != 1) { + 'loop_: while ((*(*(*minHeap.borrow()).as_ref().unwrap().borrow()) + .size + .borrow()) + != 1) + { let left: Value> = Rc::new(RefCell::new( - ({ ((*minHeap.borrow()).as_pointer()).ExtractMin() }), + ({ (*(*minHeap.borrow()).as_ref().unwrap().borrow()).ExtractMin() }), )); let right: Value> = Rc::new(RefCell::new( - ({ ((*minHeap.borrow()).as_pointer()).ExtractMin() }), + ({ (*(*minHeap.borrow()).as_ref().unwrap().borrow()).ExtractMin() }), )); let top: Value> = Rc::new(RefCell::new( ({ - ((*minHeap.borrow()).as_pointer()).Alloc(('$' as u8), { - let _lhs = (*left.borrow()).with(|__v| (*__v).freq); - _lhs + (*right.borrow()).with(|__v| (*__v).freq) + (*(*minHeap.borrow()).as_ref().unwrap().borrow()).Alloc(('$' as u8), { + let _lhs = (*(*(*left.borrow()).upgrade().deref()).freq.borrow()); + _lhs + (*(*(*right.borrow()).upgrade().deref()).freq.borrow()) }) }), )); - (*top.borrow()).with_mut(|__v| __v.left = (*left.borrow()).clone()); - (*top.borrow()).with_mut(|__v| __v.right = (*right.borrow()).clone()); - ({ ((*minHeap.borrow()).as_pointer()).Insert((*top.borrow()).clone()) }); + (*(*(*top.borrow()).upgrade().deref()).left.borrow_mut()) = (*left.borrow()).clone(); + (*(*(*top.borrow()).upgrade().deref()).right.borrow_mut()) = (*right.borrow()).clone(); + ({ (*(*minHeap.borrow()).as_ref().unwrap().borrow()).Insert((*top.borrow()).clone()) }); } return (*minHeap.borrow_mut()).take(); } @@ -346,18 +309,22 @@ pub fn CollectCode_3( next: Ptr, ) { let top: Value = Rc::new(RefCell::new(top)); - (*(out.read()).as_ref().unwrap().borrow_mut())[((next.read()) as usize) as usize] = 0; + (*out.upgrade().deref()).as_ref().unwrap().borrow_mut()[((next.read()) as usize) as usize] = 0; let i: Value = Rc::new(RefCell::new(0)); 'loop_: while ((*i.borrow()) < (*top.borrow())) { - let __rhs = - ((*(out.read()).as_ref().unwrap().borrow())[((next.read()) as usize) as usize] * 10); - (*(out.read()).as_ref().unwrap().borrow_mut())[((next.read()) as usize) as usize] = __rhs; + let __rhs = ((*out.upgrade().deref()).as_ref().unwrap().borrow() + [((next.read()) as usize) as usize] + * 10); + (*out.upgrade().deref()).as_ref().unwrap().borrow_mut() + [((next.read()) as usize) as usize] = __rhs; let __rhs = { - let _lhs = - (*(out.read()).as_ref().unwrap().borrow())[((next.read()) as usize) as usize]; - _lhs + (*(arr.read()).as_ref().unwrap().borrow())[((*i.borrow()) as usize) as usize] + let _lhs = (*out.upgrade().deref()).as_ref().unwrap().borrow() + [((next.read()) as usize) as usize]; + _lhs + (*arr.upgrade().deref()).as_ref().unwrap().borrow() + [((*i.borrow()) as usize) as usize] }; - (*(out.read()).as_ref().unwrap().borrow_mut())[((next.read()) as usize) as usize] = __rhs; + (*out.upgrade().deref()).as_ref().unwrap().borrow_mut() + [((next.read()) as usize) as usize] = __rhs; (*i.borrow_mut()).prefix_inc(); } next.with_mut(|__v| __v.prefix_inc()); @@ -371,11 +338,12 @@ pub fn CollectCodes_4( ) { let root: Value> = Rc::new(RefCell::new(root)); let top: Value = Rc::new(RefCell::new(top)); - if !(((*root.borrow()).with(|__v| (*__v).left.clone())).is_null()) { - (*(arr.read()).as_ref().unwrap().borrow_mut())[((*top.borrow()) as usize) as usize] = 0; + if !((*(*(*root.borrow()).upgrade().deref()).left.borrow()).is_null()) { + (*arr.upgrade().deref()).as_ref().unwrap().borrow_mut() + [((*top.borrow()) as usize) as usize] = 0; ({ let _root: Ptr = - ((*root.borrow()).with(|__v| (*__v).left.clone())).clone(); + (*(*(*root.borrow()).upgrade().deref()).left.borrow()).clone(); let _arr: Ptr>>> = (arr).clone(); let _top: i32 = ((*top.borrow()) + 1); let _out: Ptr>>> = (out).clone(); @@ -383,11 +351,12 @@ pub fn CollectCodes_4( CollectCodes_4(_root, _arr, _top, _out, _next) }); } - if !(((*root.borrow()).with(|__v| (*__v).right.clone())).is_null()) { - (*(arr.read()).as_ref().unwrap().borrow_mut())[((*top.borrow()) as usize) as usize] = 1; + if !((*(*(*root.borrow()).upgrade().deref()).right.borrow()).is_null()) { + (*arr.upgrade().deref()).as_ref().unwrap().borrow_mut() + [((*top.borrow()) as usize) as usize] = 1; ({ let _root: Ptr = - ((*root.borrow()).with(|__v| (*__v).right.clone())).clone(); + (*(*(*root.borrow()).upgrade().deref()).right.borrow()).clone(); let _arr: Ptr>>> = (arr).clone(); let _top: i32 = ((*top.borrow()) + 1); let _out: Ptr>>> = (out).clone(); @@ -395,7 +364,7 @@ pub fn CollectCodes_4( CollectCodes_4(_root, _arr, _top, _out, _next) }); } - if ({ (*root.borrow()).IsLeaf() }) { + if ({ (*(*root.borrow()).upgrade().deref()).IsLeaf() }) { ({ let _arr: Ptr>>> = (arr).clone(); let _top: i32 = (*top.borrow()); @@ -420,7 +389,7 @@ pub fn HuffmanCodes_5( }), )); let root: Value> = Rc::new(RefCell::new( - ({ ((*minHeap.borrow()).as_pointer()).ExtractMin() }), + ({ (*(*minHeap.borrow()).as_ref().unwrap().borrow()).ExtractMin() }), )); let arr: Value>>> = Rc::new(RefCell::new(Some(Rc::new(RefCell::new( (0..100_usize) @@ -473,21 +442,19 @@ fn main_0() -> i32 { let i: Value = Rc::new(RefCell::new(0)); 'loop_: while ((*i.borrow()) < (*size.borrow())) { let __rhs = (*arr1.borrow())[(*i.borrow()) as usize]; - (*(*data.borrow()).as_ref().unwrap().borrow_mut())[((*i.borrow()) as usize) as usize] = - __rhs; + (*data.borrow()).as_ref().unwrap().borrow_mut()[((*i.borrow()) as usize) as usize] = __rhs; let __rhs = (*arr2.borrow())[(*i.borrow()) as usize]; - (*(*freq.borrow()).as_ref().unwrap().borrow_mut())[((*i.borrow()) as usize) as usize] = - __rhs; + (*freq.borrow()).as_ref().unwrap().borrow_mut()[((*i.borrow()) as usize) as usize] = __rhs; (*i.borrow_mut()).prefix_inc(); } let out: Value>>> = Rc::new(RefCell::new( ({ HuffmanCodes_5(data.as_pointer(), freq.as_pointer(), (*size.borrow())) }), )); - return ((((((((*(*out.borrow()).as_ref().unwrap().borrow())[(0_usize) as usize] == 0) - && ((*(*out.borrow()).as_ref().unwrap().borrow())[(1_usize) as usize] == 100)) - && ((*(*out.borrow()).as_ref().unwrap().borrow())[(2_usize) as usize] == 101)) - && ((*(*out.borrow()).as_ref().unwrap().borrow())[(3_usize) as usize] == 1100)) - && ((*(*out.borrow()).as_ref().unwrap().borrow())[(4_usize) as usize] == 1101)) - && ((*(*out.borrow()).as_ref().unwrap().borrow())[(5_usize) as usize] == 111)) + return ((((((((*out.borrow()).as_ref().unwrap().borrow()[(0_usize) as usize] == 0) + && ((*out.borrow()).as_ref().unwrap().borrow()[(1_usize) as usize] == 100)) + && ((*out.borrow()).as_ref().unwrap().borrow()[(2_usize) as usize] == 101)) + && ((*out.borrow()).as_ref().unwrap().borrow()[(3_usize) as usize] == 1100)) + && ((*out.borrow()).as_ref().unwrap().borrow()[(4_usize) as usize] == 1101)) + && ((*out.borrow()).as_ref().unwrap().borrow()[(5_usize) as usize] == 111)) as i32); } diff --git a/tests/unit/out/refcount/implicit_autoref.rs b/tests/unit/out/refcount/implicit_autoref.rs index 46fbd98f3..0b29d399c 100644 --- a/tests/unit/out/refcount/implicit_autoref.rs +++ b/tests/unit/out/refcount/implicit_autoref.rs @@ -6,15 +6,14 @@ use std::io::prelude::*; use std::io::{Read, Seek, Write}; use std::os::fd::AsFd; use std::rc::{Rc, Weak}; -#[repr(C)] #[derive(Default)] pub struct Holder { - pub v: Vec, + pub v: Value>, } impl Clone for Holder { fn clone(&self) -> Self { let mut this = Self { - v: (self.v).clone(), + v: Rc::new(RefCell::new((*self.v.borrow()).clone())), }; this } @@ -24,11 +23,11 @@ impl ByteRepr for Holder { 24 } fn to_bytes(&self, buf: &mut [u8]) { - self.v.to_bytes(&mut buf[0..24]); + (*self.v.borrow()).to_bytes(&mut buf[0..24]); } fn from_bytes(buf: &[u8]) -> Self { Self { - v: >::from_bytes(&buf[0..24]), + v: Rc::new(RefCell::new(>::from_bytes(&buf[0..24]))), } } } @@ -53,23 +52,15 @@ fn main_0() -> i32 { .offset(1_usize) .write(30); let h: Value = Rc::new(RefCell::new(::default())); - (*h.borrow_mut()).v.push(40); - (*h.borrow_mut()).v.push(50); + (*(*h.borrow()).v.borrow_mut()).push(40); + (*(*h.borrow()).v.borrow_mut()).push(50); let hp: Value> = Rc::new(RefCell::new((h.as_pointer()))); let b: Value = Rc::new(RefCell::new( - (((*hp.borrow()).field_ptr( - 0, - |__v: &Holder| &__v.v[..], - |__v: &mut Holder| &mut __v.v[..], - ) as Ptr) + (((*(*hp.borrow()).upgrade().deref()).v.as_pointer() as Ptr) .offset(0_usize) .read()), )); - ((*hp.borrow()).field_ptr( - 0, - |__v: &Holder| &__v.v[..], - |__v: &mut Holder| &mut __v.v[..], - ) as Ptr) + ((*(*hp.borrow()).upgrade().deref()).v.as_pointer() as Ptr) .offset(1_usize) .write(60); assert!(((*a.borrow()) == 10)); @@ -81,11 +72,7 @@ fn main_0() -> i32 { ); assert!(((*b.borrow()) == 40)); assert!( - ((((*hp.borrow()).field_ptr( - 0, - |__v: &Holder| &__v.v[..], - |__v: &mut Holder| &mut __v.v[..] - ) as Ptr) + ((((*(*hp.borrow()).upgrade().deref()).v.as_pointer() as Ptr) .offset(1_usize) .read()) == 60) diff --git a/tests/unit/out/refcount/kruskal.rs b/tests/unit/out/refcount/kruskal.rs index 01e9990cb..b07c301ee 100644 --- a/tests/unit/out/refcount/kruskal.rs +++ b/tests/unit/out/refcount/kruskal.rs @@ -6,19 +6,18 @@ use std::io::prelude::*; use std::io::{Read, Seek, Write}; use std::os::fd::AsFd; use std::rc::{Rc, Weak}; -#[repr(C)] #[derive(Default)] pub struct Edge { - pub u: i32, - pub v: i32, - pub weight: f64, + pub u: Value, + pub v: Value, + pub weight: Value, } impl Clone for Edge { fn clone(&self) -> Self { let mut this = Self { - u: self.u, - v: self.v, - weight: self.weight, + u: Rc::new(RefCell::new((*self.u.borrow()))), + v: Rc::new(RefCell::new((*self.v.borrow()))), + weight: Rc::new(RefCell::new((*self.weight.borrow()))), }; this } @@ -28,32 +27,36 @@ impl ByteRepr for Edge { 16 } fn to_bytes(&self, buf: &mut [u8]) { - self.u.to_bytes(&mut buf[0..4]); - self.v.to_bytes(&mut buf[4..8]); - self.weight.to_bytes(&mut buf[8..16]); + (*self.u.borrow()).to_bytes(&mut buf[0..4]); + (*self.v.borrow()).to_bytes(&mut buf[4..8]); + (*self.weight.borrow()).to_bytes(&mut buf[8..16]); } fn from_bytes(buf: &[u8]) -> Self { Self { - u: ::from_bytes(&buf[0..4]), - v: ::from_bytes(&buf[4..8]), - weight: ::from_bytes(&buf[8..16]), + u: Rc::new(RefCell::new(::from_bytes(&buf[0..4]))), + v: Rc::new(RefCell::new(::from_bytes(&buf[4..8]))), + weight: Rc::new(RefCell::new(::from_bytes(&buf[8..16]))), } } } pub fn partition_0(arr: Ptr>>>, start: i32, end: i32) -> i32 { let start: Value = Rc::new(RefCell::new(start)); let end: Value = Rc::new(RefCell::new(end)); - let pivot: Ptr = (((arr.read()).as_ref().unwrap().as_pointer() as Ptr) + let pivot: Ptr = ((*arr.upgrade().deref()) + .as_ref() + .unwrap() + .as_pointer() .offset(((*start.borrow()) as usize))) .clone(); let count: Value = Rc::new(RefCell::new(0)); let i: Value = Rc::new(RefCell::new(((*start.borrow()) + 1))); 'loop_: while ((*i.borrow()) <= (*end.borrow())) { if { - let _lhs = (*(arr.read()).as_ref().unwrap().borrow()) + let _lhs = (*(*arr.upgrade().deref()).as_ref().unwrap().borrow() [((*i.borrow()) as usize) as usize] - .weight; - _lhs <= pivot.with(|__v| (*__v).weight) + .weight + .borrow()); + _lhs <= (*(*pivot.upgrade().deref()).weight.borrow()) } { (*count.borrow_mut()).postfix_inc(); } @@ -61,65 +64,123 @@ pub fn partition_0(arr: Ptr>>>, start: i32, end: i32) - } let pidx: Value = Rc::new(RefCell::new(((*start.borrow()) + (*count.borrow())))); let tmp: Value = Rc::new(RefCell::new(Edge { - u: (*(arr.read()).as_ref().unwrap().borrow())[((*pidx.borrow()) as usize) as usize].u, - v: (*(arr.read()).as_ref().unwrap().borrow())[((*pidx.borrow()) as usize) as usize].v, - weight: (*(arr.read()).as_ref().unwrap().borrow())[((*pidx.borrow()) as usize) as usize] - .weight, + u: Rc::new(RefCell::new( + (*(*arr.upgrade().deref()).as_ref().unwrap().borrow() + [((*pidx.borrow()) as usize) as usize] + .u + .borrow()), + )), + v: Rc::new(RefCell::new( + (*(*arr.upgrade().deref()).as_ref().unwrap().borrow() + [((*pidx.borrow()) as usize) as usize] + .v + .borrow()), + )), + weight: Rc::new(RefCell::new( + (*(*arr.upgrade().deref()).as_ref().unwrap().borrow() + [((*pidx.borrow()) as usize) as usize] + .weight + .borrow()), + )), })); let __rhs = Edge { - u: (*(arr.read()).as_ref().unwrap().borrow())[((*start.borrow()) as usize) as usize].u, - v: (*(arr.read()).as_ref().unwrap().borrow())[((*start.borrow()) as usize) as usize].v, - weight: (*(arr.read()).as_ref().unwrap().borrow())[((*start.borrow()) as usize) as usize] - .weight, + u: Rc::new(RefCell::new( + (*(*arr.upgrade().deref()).as_ref().unwrap().borrow() + [((*start.borrow()) as usize) as usize] + .u + .borrow()), + )), + v: Rc::new(RefCell::new( + (*(*arr.upgrade().deref()).as_ref().unwrap().borrow() + [((*start.borrow()) as usize) as usize] + .v + .borrow()), + )), + weight: Rc::new(RefCell::new( + (*(*arr.upgrade().deref()).as_ref().unwrap().borrow() + [((*start.borrow()) as usize) as usize] + .weight + .borrow()), + )), }; - (*(arr.read()).as_ref().unwrap().borrow_mut())[((*pidx.borrow()) as usize) as usize] = __rhs; - (*(arr.read()).as_ref().unwrap().borrow_mut())[((*start.borrow()) as usize) as usize] = Edge { - u: (*tmp.borrow()).u, - v: (*tmp.borrow()).v, - weight: (*tmp.borrow()).weight, + (*arr.upgrade().deref()).as_ref().unwrap().borrow_mut()[((*pidx.borrow()) as usize) as usize] = + __rhs; + (*arr.upgrade().deref()).as_ref().unwrap().borrow_mut() + [((*start.borrow()) as usize) as usize] = Edge { + u: Rc::new(RefCell::new((*(*tmp.borrow()).u.borrow()))), + v: Rc::new(RefCell::new((*(*tmp.borrow()).v.borrow()))), + weight: Rc::new(RefCell::new((*(*tmp.borrow()).weight.borrow()))), }; let i: Value = Rc::new(RefCell::new((*start.borrow()))); let j: Value = Rc::new(RefCell::new((*end.borrow()))); 'loop_: while ((*i.borrow()) < (*pidx.borrow())) && ((*j.borrow()) > (*pidx.borrow())) { 'loop_: while { - let _lhs = (*(arr.read()).as_ref().unwrap().borrow()) + let _lhs = (*(*arr.upgrade().deref()).as_ref().unwrap().borrow() [((*i.borrow()) as usize) as usize] - .weight; - _lhs <= pivot.with(|__v| (*__v).weight) + .weight + .borrow()); + _lhs <= (*(*pivot.upgrade().deref()).weight.borrow()) } { (*i.borrow_mut()).prefix_inc(); } 'loop_: while { - let _lhs = (*(arr.read()).as_ref().unwrap().borrow()) + let _lhs = (*(*arr.upgrade().deref()).as_ref().unwrap().borrow() [((*j.borrow()) as usize) as usize] - .weight; - _lhs > pivot.with(|__v| (*__v).weight) + .weight + .borrow()); + _lhs > (*(*pivot.upgrade().deref()).weight.borrow()) } { (*j.borrow_mut()).prefix_dec(); } if ((*i.borrow()) < (*pidx.borrow())) && ((*j.borrow()) > (*pidx.borrow())) { (*tmp.borrow_mut()) = Edge { - u: (*(arr.read()).as_ref().unwrap().borrow())[((*i.borrow()) as usize) as usize].u, - v: (*(arr.read()).as_ref().unwrap().borrow())[((*i.borrow()) as usize) as usize].v, - weight: (*(arr.read()).as_ref().unwrap().borrow()) - [((*i.borrow()) as usize) as usize] - .weight, + u: Rc::new(RefCell::new( + (*(*arr.upgrade().deref()).as_ref().unwrap().borrow() + [((*i.borrow()) as usize) as usize] + .u + .borrow()), + )), + v: Rc::new(RefCell::new( + (*(*arr.upgrade().deref()).as_ref().unwrap().borrow() + [((*i.borrow()) as usize) as usize] + .v + .borrow()), + )), + weight: Rc::new(RefCell::new( + (*(*arr.upgrade().deref()).as_ref().unwrap().borrow() + [((*i.borrow()) as usize) as usize] + .weight + .borrow()), + )), }; let __rhs = Edge { - u: (*(arr.read()).as_ref().unwrap().borrow())[((*j.borrow()) as usize) as usize].u, - v: (*(arr.read()).as_ref().unwrap().borrow())[((*j.borrow()) as usize) as usize].v, - weight: (*(arr.read()).as_ref().unwrap().borrow()) - [((*j.borrow()) as usize) as usize] - .weight, + u: Rc::new(RefCell::new( + (*(*arr.upgrade().deref()).as_ref().unwrap().borrow() + [((*j.borrow()) as usize) as usize] + .u + .borrow()), + )), + v: Rc::new(RefCell::new( + (*(*arr.upgrade().deref()).as_ref().unwrap().borrow() + [((*j.borrow()) as usize) as usize] + .v + .borrow()), + )), + weight: Rc::new(RefCell::new( + (*(*arr.upgrade().deref()).as_ref().unwrap().borrow() + [((*j.borrow()) as usize) as usize] + .weight + .borrow()), + )), + }; + (*arr.upgrade().deref()).as_ref().unwrap().borrow_mut() + [((*i.borrow()) as usize) as usize] = __rhs; + (*arr.upgrade().deref()).as_ref().unwrap().borrow_mut() + [((*j.borrow()) as usize) as usize] = Edge { + u: Rc::new(RefCell::new((*(*tmp.borrow()).u.borrow()))), + v: Rc::new(RefCell::new((*(*tmp.borrow()).v.borrow()))), + weight: Rc::new(RefCell::new((*(*tmp.borrow()).weight.borrow()))), }; - (*(arr.read()).as_ref().unwrap().borrow_mut())[((*i.borrow()) as usize) as usize] = - __rhs; - (*(arr.read()).as_ref().unwrap().borrow_mut())[((*j.borrow()) as usize) as usize] = - Edge { - u: (*tmp.borrow()).u, - v: (*tmp.borrow()).v, - weight: (*tmp.borrow()).weight, - }; (*i.borrow_mut()).postfix_inc(); (*j.borrow_mut()).postfix_dec(); } @@ -153,66 +214,41 @@ pub fn quicksort_1(arr: Ptr>>>, start: i32, end: i32) { quicksort_1(_arr, _start, _end) }); } -#[repr(C)] #[derive(Default)] pub struct DisjointSet { - pub rank: Option>>, - pub parent: Option>>, - pub n: i32, -} -pub trait DisjointSetMethods { - fn makeSet(&self); - fn find(&self, x: i32) -> i32; - fn merge(&self, x: i32, y: i32); + pub rank: Value>>>, + pub parent: Value>>>, + pub n: Value, } -impl DisjointSetMethods for Ptr { - fn makeSet(&self) { +impl DisjointSet { + pub fn makeSet(&self) { let i: Value = Rc::new(RefCell::new(0)); - 'loop_: while ((*i.borrow()) < self.with(|__v| (*__v).n)) { + 'loop_: while ((*i.borrow()) < (*self.n.borrow())) { let __rhs = (*i.borrow()); - (*self - .with(|__v| (*__v).parent.clone()) - .as_ref() - .unwrap() - .borrow_mut())[((*i.borrow()) as usize) as usize] = __rhs; - (*self - .with(|__v| (*__v).rank.clone()) - .as_ref() - .unwrap() - .borrow_mut())[((*i.borrow()) as usize) as usize] = 1; + (*self.parent.borrow()).as_ref().unwrap().borrow_mut() + [((*i.borrow()) as usize) as usize] = __rhs; + (*self.rank.borrow()).as_ref().unwrap().borrow_mut() + [((*i.borrow()) as usize) as usize] = 1; (*i.borrow_mut()).postfix_inc(); } } - fn find(&self, x: i32) -> i32 { + pub fn find(&self, x: i32) -> i32 { let x: Value = Rc::new(RefCell::new(x)); - if ((*self - .with(|__v| (*__v).parent.clone()) - .as_ref() - .unwrap() - .borrow())[((*x.borrow()) as usize) as usize] + if ((*self.parent.borrow()).as_ref().unwrap().borrow()[((*x.borrow()) as usize) as usize] != (*x.borrow())) { let __rhs = ({ - let _x: i32 = (*self - .with(|__v| (*__v).parent.clone()) - .as_ref() - .unwrap() - .borrow())[((*x.borrow()) as usize) as usize]; + let _x: i32 = (*self.parent.borrow()).as_ref().unwrap().borrow() + [((*x.borrow()) as usize) as usize]; self.find(_x) }); - (*self - .with(|__v| (*__v).parent.clone()) - .as_ref() - .unwrap() - .borrow_mut())[((*x.borrow()) as usize) as usize] = __rhs; + (*self.parent.borrow()).as_ref().unwrap().borrow_mut() + [((*x.borrow()) as usize) as usize] = __rhs; } - return (*self - .with(|__v| (*__v).parent.clone()) - .as_ref() - .unwrap() - .borrow())[((*x.borrow()) as usize) as usize]; + return (*self.parent.borrow()).as_ref().unwrap().borrow() + [((*x.borrow()) as usize) as usize]; } - fn merge(&self, x: i32, y: i32) { + pub fn merge(&self, x: i32, y: i32) { let x: Value = Rc::new(RefCell::new(x)); let y: Value = Rc::new(RefCell::new(y)); let xset: Value = Rc::new(RefCell::new(({ self.find((*x.borrow())) }))); @@ -220,55 +256,27 @@ impl DisjointSetMethods for Ptr { if ((*xset.borrow()) == (*yset.borrow())) { return; } - if ((*self - .with(|__v| (*__v).rank.clone()) - .as_ref() - .unwrap() - .borrow())[((*xset.borrow()) as usize) as usize] - < (*self - .with(|__v| (*__v).rank.clone()) - .as_ref() - .unwrap() - .borrow())[((*yset.borrow()) as usize) as usize]) + if ((*self.rank.borrow()).as_ref().unwrap().borrow()[((*xset.borrow()) as usize) as usize] + < (*self.rank.borrow()).as_ref().unwrap().borrow() + [((*yset.borrow()) as usize) as usize]) { - (*self - .with(|__v| (*__v).parent.clone()) - .as_ref() - .unwrap() - .borrow_mut())[((*xset.borrow()) as usize) as usize] = (*yset.borrow()); - } else if ((*self - .with(|__v| (*__v).rank.clone()) - .as_ref() - .unwrap() - .borrow())[((*xset.borrow()) as usize) as usize] - > (*self - .with(|__v| (*__v).rank.clone()) - .as_ref() - .unwrap() - .borrow())[((*yset.borrow()) as usize) as usize]) + (*self.parent.borrow()).as_ref().unwrap().borrow_mut() + [((*xset.borrow()) as usize) as usize] = (*yset.borrow()); + } else if ((*self.rank.borrow()).as_ref().unwrap().borrow() + [((*xset.borrow()) as usize) as usize] + > (*self.rank.borrow()).as_ref().unwrap().borrow() + [((*yset.borrow()) as usize) as usize]) { - (*self - .with(|__v| (*__v).parent.clone()) - .as_ref() - .unwrap() - .borrow_mut())[((*yset.borrow()) as usize) as usize] = (*xset.borrow()); + (*self.parent.borrow()).as_ref().unwrap().borrow_mut() + [((*yset.borrow()) as usize) as usize] = (*xset.borrow()); } else { - (*self - .with(|__v| (*__v).parent.clone()) - .as_ref() - .unwrap() - .borrow_mut())[((*yset.borrow()) as usize) as usize] = (*xset.borrow()); - let __rhs = ((*self - .with(|__v| (*__v).rank.clone()) - .as_ref() - .unwrap() - .borrow())[((*xset.borrow()) as usize) as usize] + (*self.parent.borrow()).as_ref().unwrap().borrow_mut() + [((*yset.borrow()) as usize) as usize] = (*xset.borrow()); + let __rhs = ((*self.rank.borrow()).as_ref().unwrap().borrow() + [((*xset.borrow()) as usize) as usize] + 1); - (*self - .with(|__v| (*__v).rank.clone()) - .as_ref() - .unwrap() - .borrow_mut())[((*xset.borrow()) as usize) as usize] = __rhs; + (*self.rank.borrow()).as_ref().unwrap().borrow_mut() + [((*xset.borrow()) as usize) as usize] = __rhs; } } } @@ -277,100 +285,100 @@ impl ByteRepr for DisjointSet { 24 } fn to_bytes(&self, buf: &mut [u8]) { - self.rank.to_bytes(&mut buf[0..8]); - self.parent.to_bytes(&mut buf[8..16]); - self.n.to_bytes(&mut buf[16..20]); + (*self.rank.borrow()).to_bytes(&mut buf[0..8]); + (*self.parent.borrow()).to_bytes(&mut buf[8..16]); + (*self.n.borrow()).to_bytes(&mut buf[16..20]); } fn from_bytes(buf: &[u8]) -> Self { Self { - rank: >>>::from_bytes(&buf[0..8]), - parent: >>>::from_bytes(&buf[8..16]), - n: ::from_bytes(&buf[16..20]), + rank: Rc::new(RefCell::new(>>>::from_bytes( + &buf[0..8], + ))), + parent: Rc::new(RefCell::new(>>>::from_bytes( + &buf[8..16], + ))), + n: Rc::new(RefCell::new(::from_bytes(&buf[16..20]))), } } } -#[repr(C)] #[derive(Default)] pub struct Graph { - pub edges: Option>>, - pub V: i32, - pub E: i32, + pub edges: Value>>>, + pub V: Value, + pub E: Value, } impl ByteRepr for Graph { fn byte_size() -> usize { 16 } fn to_bytes(&self, buf: &mut [u8]) { - self.edges.to_bytes(&mut buf[0..8]); - self.V.to_bytes(&mut buf[8..12]); - self.E.to_bytes(&mut buf[12..16]); + (*self.edges.borrow()).to_bytes(&mut buf[0..8]); + (*self.V.borrow()).to_bytes(&mut buf[8..12]); + (*self.E.borrow()).to_bytes(&mut buf[12..16]); } fn from_bytes(buf: &[u8]) -> Self { Self { - edges: >>>::from_bytes(&buf[0..8]), - V: ::from_bytes(&buf[8..12]), - E: ::from_bytes(&buf[12..16]), + edges: Rc::new(RefCell::new(>>>::from_bytes( + &buf[0..8], + ))), + V: Rc::new(RefCell::new(::from_bytes(&buf[8..12]))), + E: Rc::new(RefCell::new(::from_bytes(&buf[12..16]))), } } } pub fn MSTKruskal_2(graph: Ptr) -> f64 { ({ - let _arr: Ptr>>> = graph.field_ptr( - 0, - |__v: &Graph| ::std::slice::from_ref(&__v.edges), - |__v: &mut Graph| ::std::slice::from_mut(&mut __v.edges), - ); - let _end: i32 = (graph.with(|__v| (*__v).E) - 1); + let _arr: Ptr>>> = (*graph.upgrade().deref()).edges.as_pointer(); + let _end: i32 = ((*(*graph.upgrade().deref()).E.borrow()) - 1); quicksort_1(_arr, 0, _end) }); let set: Value = Rc::new(RefCell::new(DisjointSet { - rank: Some(Rc::new(RefCell::new( - (0..(graph.with(|__v| (*__v).V) as usize)) + rank: Rc::new(RefCell::new(Some(Rc::new(RefCell::new( + (0..((*(*graph.upgrade().deref()).V.borrow()) as usize)) .map(|_| ::default()) .collect::>(), - ))), - parent: Some(Rc::new(RefCell::new( - (0..(graph.with(|__v| (*__v).V) as usize)) + ))))), + parent: Rc::new(RefCell::new(Some(Rc::new(RefCell::new( + (0..((*(*graph.upgrade().deref()).V.borrow()) as usize)) .map(|_| ::default()) .collect::>(), - ))), - n: graph.with(|__v| (*__v).V), + ))))), + n: Rc::new(RefCell::new((*(*graph.upgrade().deref()).V.borrow()))), })); - ({ set.as_pointer().makeSet() }); + ({ (*set.borrow()).makeSet() }); let total_weight: Value = Rc::new(RefCell::new(0_f64)); let i: Value = Rc::new(RefCell::new(0)); 'loop_: while { let _lhs = (*i.borrow()); - _lhs < graph.with(|__v| (*__v).E) + _lhs < (*(*graph.upgrade().deref()).E.borrow()) } { let x: Value = Rc::new(RefCell::new( - (*graph - .with(|__v| (*__v).edges.clone()) + (*(*(*graph.upgrade().deref()).edges.borrow()) .as_ref() .unwrap() - .borrow())[((*i.borrow()) as usize) as usize] - .u, + .borrow()[((*i.borrow()) as usize) as usize] + .u + .borrow()), )); let y: Value = Rc::new(RefCell::new( - (*graph - .with(|__v| (*__v).edges.clone()) + (*(*(*graph.upgrade().deref()).edges.borrow()) .as_ref() .unwrap() - .borrow())[((*i.borrow()) as usize) as usize] - .v, + .borrow()[((*i.borrow()) as usize) as usize] + .v + .borrow()), )); let w: Value = Rc::new(RefCell::new( - (*graph - .with(|__v| (*__v).edges.clone()) + (*(*(*graph.upgrade().deref()).edges.borrow()) .as_ref() .unwrap() - .borrow())[((*i.borrow()) as usize) as usize] - .weight, + .borrow()[((*i.borrow()) as usize) as usize] + .weight + .borrow()), )); - if (({ set.as_pointer().find((*x.borrow())) }) - != ({ set.as_pointer().find((*y.borrow())) })) + if (({ (*set.borrow()).find((*x.borrow())) }) != ({ (*set.borrow()).find((*y.borrow())) })) { - ({ set.as_pointer().merge((*x.borrow()), (*y.borrow())) }); + ({ (*set.borrow()).merge((*x.borrow()), (*y.borrow())) }); (*total_weight.borrow_mut()) += (*w.borrow()); } (*i.borrow_mut()).prefix_inc(); @@ -384,38 +392,53 @@ fn main_0() -> i32 { let V: Value = Rc::new(RefCell::new(4)); let E: Value = Rc::new(RefCell::new(5)); let graph: Value = Rc::new(RefCell::new(Graph { - edges: Some(Rc::new(RefCell::new( + edges: Rc::new(RefCell::new(Some(Rc::new(RefCell::new( (0..((*E.borrow()) as usize)) .map(|_| ::default()) .collect::>(), - ))), - V: (*V.borrow()), - E: (*E.borrow()), + ))))), + V: Rc::new(RefCell::new((*V.borrow()))), + E: Rc::new(RefCell::new((*E.borrow()))), })); - (*(*graph.borrow()).edges.as_ref().unwrap().borrow_mut())[(0_usize) as usize] = Edge { - u: 0, - v: 1, - weight: 10_f64, + (*(*graph.borrow()).edges.borrow()) + .as_ref() + .unwrap() + .borrow_mut()[(0_usize) as usize] = Edge { + u: Rc::new(RefCell::new(0)), + v: Rc::new(RefCell::new(1)), + weight: Rc::new(RefCell::new(10_f64)), }; - (*(*graph.borrow()).edges.as_ref().unwrap().borrow_mut())[(1_usize) as usize] = Edge { - u: 1, - v: 3, - weight: 15_f64, + (*(*graph.borrow()).edges.borrow()) + .as_ref() + .unwrap() + .borrow_mut()[(1_usize) as usize] = Edge { + u: Rc::new(RefCell::new(1)), + v: Rc::new(RefCell::new(3)), + weight: Rc::new(RefCell::new(15_f64)), }; - (*(*graph.borrow()).edges.as_ref().unwrap().borrow_mut())[(2_usize) as usize] = Edge { - u: 2, - v: 3, - weight: 4_f64, + (*(*graph.borrow()).edges.borrow()) + .as_ref() + .unwrap() + .borrow_mut()[(2_usize) as usize] = Edge { + u: Rc::new(RefCell::new(2)), + v: Rc::new(RefCell::new(3)), + weight: Rc::new(RefCell::new(4_f64)), }; - (*(*graph.borrow()).edges.as_ref().unwrap().borrow_mut())[(3_usize) as usize] = Edge { - u: 2, - v: 0, - weight: 6_f64, + (*(*graph.borrow()).edges.borrow()) + .as_ref() + .unwrap() + .borrow_mut()[(3_usize) as usize] = Edge { + u: Rc::new(RefCell::new(2)), + v: Rc::new(RefCell::new(0)), + weight: Rc::new(RefCell::new(6_f64)), }; - (*(*graph.borrow()).edges.as_ref().unwrap().borrow_mut())[(4_usize) as usize] = Edge { - u: 0, - v: 3, - weight: 5_f64, + (*(*graph.borrow()).edges.borrow()) + .as_ref() + .unwrap() + .borrow_mut()[(4_usize) as usize] = Edge { + u: Rc::new(RefCell::new(0)), + v: Rc::new(RefCell::new(3)), + weight: Rc::new(RefCell::new(5_f64)), }; let total_weight: Value = Rc::new(RefCell::new(({ MSTKruskal_2(graph.as_pointer()) }))); return ((*total_weight.borrow()) as i32); diff --git a/tests/unit/out/refcount/libc_struct_without_default.rs b/tests/unit/out/refcount/libc_struct_without_default.rs index 9256ea9fd..15c703f6f 100644 --- a/tests/unit/out/refcount/libc_struct_without_default.rs +++ b/tests/unit/out/refcount/libc_struct_without_default.rs @@ -6,17 +6,16 @@ use std::io::prelude::*; use std::io::{Read, Seek, Write}; use std::os::fd::AsFd; use std::rc::{Rc, Weak}; -#[repr(C)] #[derive()] pub struct UserDefined { - pub a: Vec, - pub v: Vec, + pub a: Value>, + pub v: Value>, } impl Clone for UserDefined { fn clone(&self) -> Self { let mut this = Self { - a: (self.a).clone(), - v: (self.v).clone(), + a: Rc::new(RefCell::new((*self.a.borrow()).clone())), + v: Rc::new(RefCell::new((*self.v.borrow()).clone())), }; this } @@ -24,8 +23,10 @@ impl Clone for UserDefined { impl Default for UserDefined { fn default() -> Self { UserDefined { - a: std::array::from_fn::<_, 1, _>(|_| Default::default()).to_vec(), - v: Default::default(), + a: Rc::new(RefCell::new( + std::array::from_fn::<_, 1, _>(|_| Default::default()).to_vec(), + )), + v: Rc::new(RefCell::new(Default::default())), } } } @@ -34,25 +35,24 @@ impl ByteRepr for UserDefined { 32 } fn to_bytes(&self, buf: &mut [u8]) { - self.a.to_bytes(&mut buf[0..4]); - self.v.to_bytes(&mut buf[8..32]); + (*self.a.borrow()).to_bytes(&mut buf[0..4]); + (*self.v.borrow()).to_bytes(&mut buf[8..32]); } fn from_bytes(buf: &[u8]) -> Self { Self { - a: >::from_bytes(&buf[0..4]), - v: >::from_bytes(&buf[8..32]), + a: Rc::new(RefCell::new(>::from_bytes(&buf[0..4]))), + v: Rc::new(RefCell::new(>::from_bytes(&buf[8..32]))), } } } -#[repr(C)] #[derive()] pub struct FieldIsLibcType { - pub addr: libcc2rs::Sockaddr, + pub addr: Value, } impl Clone for FieldIsLibcType { fn clone(&self) -> Self { let mut this = Self { - addr: (self.addr).clone(), + addr: Rc::new(RefCell::new((*self.addr.borrow()).clone())), }; this } @@ -60,7 +60,7 @@ impl Clone for FieldIsLibcType { impl Default for FieldIsLibcType { fn default() -> Self { FieldIsLibcType { - addr: Default::default(), + addr: Rc::new(RefCell::new(Default::default())), } } } @@ -69,11 +69,11 @@ impl ByteRepr for FieldIsLibcType { 16 } fn to_bytes(&self, buf: &mut [u8]) { - self.addr.to_bytes(&mut buf[0..16]); + (*self.addr.borrow()).to_bytes(&mut buf[0..16]); } fn from_bytes(buf: &[u8]) -> Self { Self { - addr: ::from_bytes(&buf[0..16]), + addr: Rc::new(RefCell::new(::from_bytes(&buf[0..16]))), } } } @@ -82,38 +82,34 @@ pub fn main() { } fn main_0() -> i32 { let p: Value = Rc::new(RefCell::new(Default::default())); - (*p.borrow_mut()).fd = -1_i32; - (*p.borrow_mut()).events = 0_i16; - (*p.borrow_mut()).revents = 2_i16; - assert!(((*p.borrow()).fd == -1_i32)); - assert!((((*p.borrow()).events as i32) == 0)); - assert!((((*p.borrow()).revents as i32) == 2)); + (*(*p.borrow()).fd.borrow_mut()) = -1_i32; + (*(*p.borrow()).events.borrow_mut()) = 0_i16; + (*(*p.borrow()).revents.borrow_mut()) = 2_i16; + assert!(((*(*p.borrow()).fd.borrow()) == -1_i32)); + assert!((((*(*p.borrow()).events.borrow()) as i32) == 0)); + assert!((((*(*p.borrow()).revents.borrow()) as i32) == 2)); let ia: Value = Rc::new(RefCell::new(Default::default())); - (*ia.borrow_mut()).s_addr = 1_u32; - assert!(((*ia.borrow()).s_addr == 1_u32)); + (*(*ia.borrow()).s_addr.borrow_mut()) = 1_u32; + assert!(((*(*ia.borrow()).s_addr.borrow()) == 1_u32)); let t: Value = Rc::new(RefCell::new(Default::default())); - (*t.borrow_mut()).tm_year = 124; - (*t.borrow_mut()).tm_mon = 5; - (*t.borrow_mut()).tm_mday = 15; - assert!(((*t.borrow()).tm_year == 124)); - assert!(((*t.borrow()).tm_mon == 5)); - assert!(((*t.borrow()).tm_mday == 15)); + (*(*t.borrow()).tm_year.borrow_mut()) = 124; + (*(*t.borrow()).tm_mon.borrow_mut()) = 5; + (*(*t.borrow()).tm_mday.borrow_mut()) = 15; + assert!(((*(*t.borrow()).tm_year.borrow()) == 124)); + assert!(((*(*t.borrow()).tm_mon.borrow()) == 5)); + assert!(((*(*t.borrow()).tm_mday.borrow()) == 15)); let st: Value = Rc::new(RefCell::new(Default::default())); - (*st.borrow_mut()).st_size = 1024_i64; - assert!(((*st.borrow()).st_size == 1024_i64)); + (*(*st.borrow()).st_size.borrow_mut()) = 1024_i64; + assert!(((*(*st.borrow()).st_size.borrow()) == 1024_i64)); let ud: Value = Rc::new(RefCell::new(::default())); assert!( - (((ud.as_pointer().field_ptr( - 0, - |__v: &UserDefined| &__v.a[..], - |__v: &mut UserDefined| &mut __v.a[..] - ) as Ptr) + ((((*ud.borrow()).a.as_pointer() as Ptr) .offset(0_usize) .read()) == 0) ); - assert!(((*ud.borrow()).v.len() == 0_usize)); + assert!(((*(*ud.borrow()).v.borrow()).len() == 0_usize)); let filt: Value = Rc::new(RefCell::new(::default())); - assert!((((*filt.borrow()).addr.sa_family as i32) == 0)); + assert!((((*(*(*filt.borrow()).addr.borrow()).sa_family.borrow()) as i32) == 0)); return 0; } diff --git a/tests/unit/out/refcount/push_emplace_back.rs b/tests/unit/out/refcount/push_emplace_back.rs index 07e740019..953a075ce 100644 --- a/tests/unit/out/refcount/push_emplace_back.rs +++ b/tests/unit/out/refcount/push_emplace_back.rs @@ -84,7 +84,23 @@ impl Clone for JPEGData { this } } -impl ByteRepr for JPEGData {} +impl ByteRepr for JPEGData { + fn byte_size() -> usize { + 48 + } + fn to_bytes(&self, buf: &mut [u8]) { + (*self.com_data.borrow()).to_bytes(&mut buf[0..24]); + (*self.app_data.borrow()).to_bytes(&mut buf[24..48]); + } + fn from_bytes(buf: &[u8]) -> Self { + Self { + com_data: Rc::new(RefCell::new(>>>::from_bytes(&buf[0..24]))), + app_data: Rc::new(RefCell::new(>>>::from_bytes( + &buf[24..48], + ))), + } + } +} pub fn push_param_0(dest: Ptr>>>) { let dest: Value>>>> = Rc::new(RefCell::new(dest)); ((*dest.borrow()).to_strong().as_pointer() as Ptr>>>).with_mut( diff --git a/tests/unit/out/refcount/struct_default_ctor.rs b/tests/unit/out/refcount/struct_default_ctor.rs index e1493994e..62f7e73ac 100644 --- a/tests/unit/out/refcount/struct_default_ctor.rs +++ b/tests/unit/out/refcount/struct_default_ctor.rs @@ -6,22 +6,23 @@ use std::io::prelude::*; use std::io::{Read, Seek, Write}; use std::os::fd::AsFd; use std::rc::{Rc, Weak}; -#[repr(C)] #[derive()] pub struct WOFF2Params { - pub extended_metadata: Vec, - pub brotli_quality: i32, - pub allow_transforms: bool, + pub extended_metadata: Value>, + pub brotli_quality: Value, + pub allow_transforms: Value, } impl WOFF2Params { pub fn WOFF2Params() -> Self { let mut this = Self { - extended_metadata: Ptr::from_string_literal(b"") - .to_c_string_iterator() - .chain(std::iter::once(0)) - .collect::>(), - brotli_quality: 11, - allow_transforms: true, + extended_metadata: Rc::new(RefCell::new( + Ptr::from_string_literal(b"") + .to_c_string_iterator() + .chain(std::iter::once(0)) + .collect::>(), + )), + brotli_quality: Rc::new(RefCell::new(11)), + allow_transforms: Rc::new(RefCell::new(true)), }; this } @@ -29,9 +30,9 @@ impl WOFF2Params { impl Clone for WOFF2Params { fn clone(&self) -> Self { let mut this = Self { - extended_metadata: (self.extended_metadata).clone(), - brotli_quality: self.brotli_quality, - allow_transforms: self.allow_transforms, + extended_metadata: Rc::new(RefCell::new((*self.extended_metadata.borrow()).clone())), + brotli_quality: Rc::new(RefCell::new((*self.brotli_quality.borrow()))), + allow_transforms: Rc::new(RefCell::new((*self.allow_transforms.borrow()))), }; this } @@ -46,15 +47,15 @@ impl ByteRepr for WOFF2Params { 40 } fn to_bytes(&self, buf: &mut [u8]) { - self.extended_metadata.to_bytes(&mut buf[0..32]); - self.brotli_quality.to_bytes(&mut buf[32..36]); - self.allow_transforms.to_bytes(&mut buf[36..37]); + (*self.extended_metadata.borrow()).to_bytes(&mut buf[0..32]); + (*self.brotli_quality.borrow()).to_bytes(&mut buf[32..36]); + (*self.allow_transforms.borrow()).to_bytes(&mut buf[36..37]); } fn from_bytes(buf: &[u8]) -> Self { Self { - extended_metadata: >::from_bytes(&buf[0..32]), - brotli_quality: ::from_bytes(&buf[32..36]), - allow_transforms: ::from_bytes(&buf[36..37]), + extended_metadata: Rc::new(RefCell::new(>::from_bytes(&buf[0..32]))), + brotli_quality: Rc::new(RefCell::new(::from_bytes(&buf[32..36]))), + allow_transforms: Rc::new(RefCell::new(::from_bytes(&buf[36..37]))), } } } @@ -63,8 +64,8 @@ pub fn main() { } fn main_0() -> i32 { let params: Value = Rc::new(RefCell::new(WOFF2Params::WOFF2Params())); - assert!((((*params.borrow()).extended_metadata.len() - 1) == 0_usize)); - assert!(((*params.borrow()).brotli_quality == 11)); - assert!((((*params.borrow()).allow_transforms as i32) == (true as i32))); + assert!((((*(*params.borrow()).extended_metadata.borrow()).len() - 1) == 0_usize)); + assert!(((*(*params.borrow()).brotli_quality.borrow()) == 11)); + assert!((((*(*params.borrow()).allow_transforms.borrow()) as i32) == (true as i32))); return 0; } diff --git a/tests/unit/out/refcount/typedef-anon-struct.rs b/tests/unit/out/refcount/typedef-anon-struct.rs index c8a0d9dd6..42c27e379 100644 --- a/tests/unit/out/refcount/typedef-anon-struct.rs +++ b/tests/unit/out/refcount/typedef-anon-struct.rs @@ -6,17 +6,16 @@ use std::io::prelude::*; use std::io::{Read, Seek, Write}; use std::os::fd::AsFd; use std::rc::{Rc, Weak}; -#[repr(C)] #[derive(Default)] pub struct Outer_RunInfo { - pub block_idx: i32, - pub num_extra_zero_runs: i32, + pub block_idx: Value, + pub num_extra_zero_runs: Value, } impl Clone for Outer_RunInfo { fn clone(&self) -> Self { let mut this = Self { - block_idx: self.block_idx, - num_extra_zero_runs: self.num_extra_zero_runs, + block_idx: Rc::new(RefCell::new((*self.block_idx.borrow()))), + num_extra_zero_runs: Rc::new(RefCell::new((*self.num_extra_zero_runs.borrow()))), }; this } @@ -26,25 +25,24 @@ impl ByteRepr for Outer_RunInfo { 8 } fn to_bytes(&self, buf: &mut [u8]) { - self.block_idx.to_bytes(&mut buf[0..4]); - self.num_extra_zero_runs.to_bytes(&mut buf[4..8]); + (*self.block_idx.borrow()).to_bytes(&mut buf[0..4]); + (*self.num_extra_zero_runs.borrow()).to_bytes(&mut buf[4..8]); } fn from_bytes(buf: &[u8]) -> Self { Self { - block_idx: ::from_bytes(&buf[0..4]), - num_extra_zero_runs: ::from_bytes(&buf[4..8]), + block_idx: Rc::new(RefCell::new(::from_bytes(&buf[0..4]))), + num_extra_zero_runs: Rc::new(RefCell::new(::from_bytes(&buf[4..8]))), } } } -#[repr(C)] #[derive(Default)] pub struct Outer { - pub runs: Vec, + pub runs: Value>, } impl Clone for Outer { fn clone(&self) -> Self { let mut this = Self { - runs: (self.runs).clone(), + runs: Rc::new(RefCell::new((*self.runs.borrow()).clone())), }; this } @@ -54,11 +52,11 @@ impl ByteRepr for Outer { 24 } fn to_bytes(&self, buf: &mut [u8]) { - self.runs.to_bytes(&mut buf[0..24]); + (*self.runs.borrow()).to_bytes(&mut buf[0..24]); } fn from_bytes(buf: &[u8]) -> Self { Self { - runs: >::from_bytes(&buf[0..24]), + runs: Rc::new(RefCell::new(>::from_bytes(&buf[0..24]))), } } } @@ -68,31 +66,29 @@ pub fn main() { fn main_0() -> i32 { let o: Value = Rc::new(RefCell::new(::default())); let info: Value = Rc::new(RefCell::new(::default())); - (*info.borrow_mut()).block_idx = 1; - (*info.borrow_mut()).num_extra_zero_runs = 2; + (*(*info.borrow()).block_idx.borrow_mut()) = 1; + (*(*info.borrow()).num_extra_zero_runs.borrow_mut()) = 2; { let a0_clone = (*info.borrow()).clone(); - (*o.borrow_mut()).runs.push(a0_clone) + (*(*o.borrow()).runs.borrow_mut()).push(a0_clone) }; - assert!(((*o.borrow()).runs.len() == 1_usize)); + assert!(((*(*o.borrow()).runs.borrow()).len() == 1_usize)); assert!( - ((o.as_pointer().field_ptr( - 0, - |__v: &Outer| &__v.runs[..], - |__v: &mut Outer| &mut __v.runs[..] - ) as Ptr) + ((*(*((*o.borrow()).runs.as_pointer() as Ptr) .offset(0_usize) - .with(|__v| (*__v).block_idx) + .upgrade() + .deref()) + .block_idx + .borrow()) == 1) ); assert!( - ((o.as_pointer().field_ptr( - 0, - |__v: &Outer| &__v.runs[..], - |__v: &mut Outer| &mut __v.runs[..] - ) as Ptr) + ((*(*((*o.borrow()).runs.as_pointer() as Ptr) .offset(0_usize) - .with(|__v| (*__v).num_extra_zero_runs) + .upgrade() + .deref()) + .num_extra_zero_runs + .borrow()) == 2) ); return 0; diff --git a/tests/unit/out/refcount/unique_ptr.rs b/tests/unit/out/refcount/unique_ptr.rs index e991a59f1..9d4eb0eb5 100644 --- a/tests/unit/out/refcount/unique_ptr.rs +++ b/tests/unit/out/refcount/unique_ptr.rs @@ -6,22 +6,13 @@ use std::io::prelude::*; use std::io::{Read, Seek, Write}; use std::os::fd::AsFd; use std::rc::{Rc, Weak}; -#[repr(C)] #[derive(Default)] pub struct SafePointer { - pub ptr: Option>, + pub ptr: Value>>, } -pub trait SafePointerMethods { - fn inc(&self); -} -impl SafePointerMethods for Ptr { - fn inc(&self) { - (*self - .with(|__v| (*__v).ptr.clone()) - .as_ref() - .unwrap() - .borrow_mut()) - .prefix_inc(); +impl SafePointer { + pub fn inc(&self) { + (*(*self.ptr.borrow_mut()).as_ref().unwrap().borrow_mut()).prefix_inc(); } } impl ByteRepr for SafePointer { @@ -29,28 +20,24 @@ impl ByteRepr for SafePointer { 8 } fn to_bytes(&self, buf: &mut [u8]) { - self.ptr.to_bytes(&mut buf[0..8]); + (*self.ptr.borrow()).to_bytes(&mut buf[0..8]); } fn from_bytes(buf: &[u8]) -> Self { Self { - ptr: >>::from_bytes(&buf[0..8]), + ptr: Rc::new(RefCell::new(>>::from_bytes(&buf[0..8]))), } } } -#[repr(C)] #[derive(Default)] pub struct Pair { - pub x: i32, - pub y: i32, -} -pub trait PairMethods { - fn inc(&self, k: i32); + pub x: Value, + pub y: Value, } impl Clone for Pair { fn clone(&self) -> Self { let mut this = Self { - x: self.x, - y: self.y, + x: Rc::new(RefCell::new((*self.x.borrow()))), + y: Rc::new(RefCell::new((*self.y.borrow()))), }; this } @@ -60,21 +47,21 @@ impl ByteRepr for Pair { 8 } fn to_bytes(&self, buf: &mut [u8]) { - self.x.to_bytes(&mut buf[0..4]); - self.y.to_bytes(&mut buf[4..8]); + (*self.x.borrow()).to_bytes(&mut buf[0..4]); + (*self.y.borrow()).to_bytes(&mut buf[4..8]); } fn from_bytes(buf: &[u8]) -> Self { Self { - x: ::from_bytes(&buf[0..4]), - y: ::from_bytes(&buf[4..8]), + x: Rc::new(RefCell::new(::from_bytes(&buf[0..4]))), + y: Rc::new(RefCell::new(::from_bytes(&buf[4..8]))), } } } -impl PairMethods for Ptr { - fn inc(&self, k: i32) { +impl Pair { + pub fn inc(&self, k: i32) { let k: Value = Rc::new(RefCell::new(k)); - self.with_mut(|__v| __v.x += (*k.borrow())); - self.with_mut(|__v| __v.y += (*k.borrow())); + (*self.x.borrow_mut()) += (*k.borrow()); + (*self.y.borrow_mut()) += (*k.borrow()); } } pub fn DoStuffWithSafePointer_0(safe_ptr: Ptr>>) { @@ -84,9 +71,11 @@ pub fn DoStuffWithSafePointer_0(safe_ptr: Ptr>>) { (*x1.borrow_mut()) = (*x2.borrow_mut()).take(); let raw_ptr1: Value> = Rc::new(RefCell::new(((*x1.borrow()).as_pointer()))); (*raw_ptr1.borrow()).with_mut(|__v| __v.prefix_inc()); - (*(safe_ptr.read()).as_ref().unwrap().borrow_mut()).ptr = (*x1.borrow_mut()).take(); - ({ ((safe_ptr.read()).as_pointer()).inc() }); - ({ ((safe_ptr.read()).as_pointer()).inc() }); + (*(*(*safe_ptr.upgrade().deref()).as_ref().unwrap().borrow()) + .ptr + .borrow_mut()) = (*x1.borrow_mut()).take(); + ({ (*(*safe_ptr.upgrade().deref()).as_ref().unwrap().borrow()).inc() }); + ({ (*(*safe_ptr.upgrade().deref()).as_ref().unwrap().borrow()).inc() }); let x3: Value>> = Rc::new(RefCell::new(Some(Rc::new(RefCell::new(10))))); let x4: Value>> = Rc::new(RefCell::new(Some(Rc::new(RefCell::new(20))))); let __rhs = ((*(*x3.borrow()).as_ref().unwrap().borrow()) @@ -96,30 +85,32 @@ pub fn DoStuffWithSafePointer_0(safe_ptr: Ptr>>) { let raw_ptr2: Value> = Rc::new(RefCell::new(((*x4.borrow()).as_pointer()))); { let _ptr = (*raw_ptr2.borrow()).clone(); - _ptr.write((_ptr.read()) + 1) + _ptr.write(_ptr.read() + 1) }; let pair: Value>> = Rc::new(RefCell::new(Some(Rc::new(RefCell::new(Pair { - x: ((*raw_ptr2.borrow()).read()), - y: 5, + x: Rc::new(RefCell::new(((*raw_ptr2.borrow()).read()))), + y: Rc::new(RefCell::new(5)), }))))); - ({ ((*pair.borrow()).as_pointer()).inc(10) }); + ({ (*(*pair.borrow()).as_ref().unwrap().borrow()).inc(10) }); let __rhs = { let _lhs = { - let _lhs = (*(*(safe_ptr.read()).as_ref().unwrap().borrow()) + let _lhs = (*(*(*(*safe_ptr.upgrade().deref()).as_ref().unwrap().borrow()) .ptr - .as_ref() - .unwrap() - .borrow()); - _lhs + (*(*pair.borrow()).as_ref().unwrap().borrow()).x + .borrow()) + .as_ref() + .unwrap() + .borrow()); + _lhs + (*(*(*pair.borrow()).as_ref().unwrap().borrow()).x.borrow()) }; - _lhs + (*(*pair.borrow()).as_ref().unwrap().borrow()).y + _lhs + (*(*(*pair.borrow()).as_ref().unwrap().borrow()).y.borrow()) }; - (*(*(safe_ptr.read()).as_ref().unwrap().borrow_mut()) + (*(*(*(*safe_ptr.upgrade().deref()).as_ref().unwrap().borrow()) .ptr - .as_ref() - .unwrap() - .borrow_mut()) = __rhs; + .borrow_mut()) + .as_ref() + .unwrap() + .borrow_mut()) = __rhs; } pub fn Consume_1(safe_ptr: Option>) -> i32 { let safe_ptr: Value>> = Rc::new(RefCell::new(safe_ptr)); @@ -127,12 +118,11 @@ pub fn Consume_1(safe_ptr: Option>) -> i32 { Rc::new(RefCell::new((*safe_ptr.borrow_mut()).take())); let p: Value>> = Rc::new(RefCell::new(Ptr::alloc(::default()).to_owned_opt())); - return ((*(*(*x.borrow()).as_ref().unwrap().borrow()) - .ptr + return ((*(*(*(*x.borrow()).as_ref().unwrap().borrow()).ptr.borrow()) .as_ref() .unwrap() .borrow()) - + (*(*p.borrow()).as_ref().unwrap().borrow()).x); + + (*(*(*p.borrow()).as_ref().unwrap().borrow()).x.borrow())); } pub fn RndStuff_2() { let x1: Value>>> = Rc::new(RefCell::new(None)); @@ -146,7 +136,7 @@ pub fn RndStuff_2() { )); let i: Value = Rc::new(RefCell::new(0)); 'loop_: while ((*i.borrow()) < 100) { - (*(*x2.borrow()).as_ref().unwrap().borrow_mut())[((*i.borrow()) as usize) as usize] = 1; + (*x2.borrow()).as_ref().unwrap().borrow_mut()[((*i.borrow()) as usize) as usize] = 1; (*i.borrow_mut()).prefix_inc(); } (*x2.borrow_mut()) = Ptr::alloc_array( @@ -157,13 +147,13 @@ pub fn RndStuff_2() { .to_owned_opt(); let i: Value = Rc::new(RefCell::new(0)); 'loop_: while ((*i.borrow()) < 200) { - (*(*x2.borrow()).as_ref().unwrap().borrow_mut())[((*i.borrow()) as usize) as usize] = 2; + (*x2.borrow()).as_ref().unwrap().borrow_mut()[((*i.borrow()) as usize) as usize] = 2; (*i.borrow_mut()).prefix_inc(); } let p2: Value> = Rc::new(RefCell::new((*x2.borrow()).as_pointer())); let i: Value = Rc::new(RefCell::new(0)); 'loop_: while ((*i.borrow()) < 200) { - assert!((((*p2.borrow()).offset(((*i.borrow()) as isize)).read()) == 2)); + assert!((((*p2.borrow()).offset((*i.borrow()) as isize).read()) == 2)); (*i.borrow_mut()).prefix_inc(); } let x3: Value>>> = Rc::new(RefCell::new(Some(Rc::new(RefCell::new( @@ -173,40 +163,50 @@ pub fn RndStuff_2() { ))))); let i: Value = Rc::new(RefCell::new(0)); 'loop_: while ((*i.borrow()) < 10) { - (*(*x3.borrow()).as_ref().unwrap().borrow_mut())[((*i.borrow()) as usize) as usize] = - Pair { x: 1, y: 2 }; + (*x3.borrow()).as_ref().unwrap().borrow_mut()[((*i.borrow()) as usize) as usize] = Pair { + x: Rc::new(RefCell::new(1)), + y: Rc::new(RefCell::new(2)), + }; (*i.borrow_mut()).prefix_inc(); } let p3_0: Value> = Rc::new(RefCell::new((*x3.borrow()).as_pointer())); let i: Value = Rc::new(RefCell::new(0)); 'loop_: while ((*i.borrow()) < 10) { assert!( - ((*p3_0.borrow()) - .offset(((*i.borrow()) as isize)) - .with(|__v| (*__v).x) + ((*(*(*p3_0.borrow()) + .offset((*i.borrow()) as isize) + .upgrade() + .deref()) + .x + .borrow()) == 1) ); assert!( - ((*p3_0.borrow()) - .offset(((*i.borrow()) as isize)) - .with(|__v| (*__v).y) + ((*(*(*p3_0.borrow()) + .offset((*i.borrow()) as isize) + .upgrade() + .deref()) + .y + .borrow()) == 2) ); - ({ - ((*x3.borrow()).as_ref().unwrap().as_pointer() as Ptr) - .offset(((*i.borrow()) as usize)) - .inc(10) - }); + ({ (*x3.borrow()).as_ref().unwrap().borrow()[((*i.borrow()) as usize) as usize].inc(10) }); assert!( - ((*p3_0.borrow()) - .offset(((*i.borrow()) as isize)) - .with(|__v| (*__v).x) + ((*(*(*p3_0.borrow()) + .offset((*i.borrow()) as isize) + .upgrade() + .deref()) + .x + .borrow()) == 11) ); assert!( - ((*p3_0.borrow()) - .offset(((*i.borrow()) as isize)) - .with(|__v| (*__v).y) + ((*(*(*p3_0.borrow()) + .offset((*i.borrow()) as isize) + .upgrade() + .deref()) + .y + .borrow()) == 12) ); (*i.borrow_mut()).prefix_inc(); @@ -219,11 +219,10 @@ pub fn RndStuff_2() { .to_owned_opt(); let i: Value = Rc::new(RefCell::new(0)); 'loop_: while ((*i.borrow()) < 50) { - (*(*x3.borrow()).as_ref().unwrap().borrow_mut())[((*i.borrow()) as usize) as usize] = - Pair { - x: -1_i32, - y: -2_i32, - }; + (*x3.borrow()).as_ref().unwrap().borrow_mut()[((*i.borrow()) as usize) as usize] = Pair { + x: Rc::new(RefCell::new(-1_i32)), + y: Rc::new(RefCell::new(-2_i32)), + }; (*i.borrow_mut()).prefix_inc(); } let p3_1: Value> = Rc::new(RefCell::new((*x3.borrow()).as_pointer())); @@ -234,32 +233,43 @@ pub fn RndStuff_2() { let i: Value = Rc::new(RefCell::new(0)); 'loop_: while ((*i.borrow()) < 50) { assert!( - ((*p3_1.borrow()) - .offset(((*i.borrow()) as isize)) - .with(|__v| (*__v).x) + ((*(*(*p3_1.borrow()) + .offset((*i.borrow()) as isize) + .upgrade() + .deref()) + .x + .borrow()) == -1_i32) ); assert!( - ((*p3_1.borrow()) - .offset(((*i.borrow()) as isize)) - .with(|__v| (*__v).y) + ((*(*(*p3_1.borrow()) + .offset((*i.borrow()) as isize) + .upgrade() + .deref()) + .y + .borrow()) == -2_i32) ); ({ - ((*x3.borrow()).as_ref().unwrap().as_pointer() as Ptr) - .offset(((*i.borrow()) as usize)) + (*x3.borrow()).as_ref().unwrap().borrow()[((*i.borrow()) as usize) as usize] .inc(-10_i32) }); assert!( - ((*p3_1.borrow()) - .offset(((*i.borrow()) as isize)) - .with(|__v| (*__v).x) + ((*(*(*p3_1.borrow()) + .offset((*i.borrow()) as isize) + .upgrade() + .deref()) + .x + .borrow()) == -11_i32) ); assert!( - ((*p3_1.borrow()) - .offset(((*i.borrow()) as isize)) - .with(|__v| (*__v).y) + ((*(*(*p3_1.borrow()) + .offset((*i.borrow()) as isize) + .upgrade() + .deref()) + .y + .borrow()) == -12_i32) ); (*i.borrow_mut()).prefix_inc(); @@ -272,7 +282,7 @@ fn main_0() -> i32 { let x: Value>> = Rc::new(RefCell::new(Some(Rc::new(RefCell::new(0))))); let safe_ptr: Value>> = Rc::new(RefCell::new(Some(Rc::new(RefCell::new(SafePointer { - ptr: (*x.borrow_mut()).take(), + ptr: Rc::new(RefCell::new((*x.borrow_mut()).take())), }))))); ({ DoStuffWithSafePointer_0(safe_ptr.as_pointer()) }); return ({ Consume_1((*safe_ptr.borrow_mut()).take()) }); diff --git a/tests/unit/out/refcount/unique_ptr_const_deref.rs b/tests/unit/out/refcount/unique_ptr_const_deref.rs index f83da2901..8763aa177 100644 --- a/tests/unit/out/refcount/unique_ptr_const_deref.rs +++ b/tests/unit/out/refcount/unique_ptr_const_deref.rs @@ -6,28 +6,26 @@ use std::io::prelude::*; use std::io::{Read, Seek, Write}; use std::os::fd::AsFd; use std::rc::{Rc, Weak}; -#[repr(C)] #[derive(Default)] pub struct Holder { - pub val: Option>, + pub val: Value>>, } impl ByteRepr for Holder { fn byte_size() -> usize { 8 } fn to_bytes(&self, buf: &mut [u8]) { - self.val.to_bytes(&mut buf[0..8]); + (*self.val.borrow()).to_bytes(&mut buf[0..8]); } fn from_bytes(buf: &[u8]) -> Self { Self { - val: >>::from_bytes(&buf[0..8]), + val: Rc::new(RefCell::new(>>::from_bytes(&buf[0..8]))), } } } pub fn read_val_0(h: Ptr) -> i32 { let h: Value> = Rc::new(RefCell::new(h)); - return (*(*h.borrow()) - .with(|__v| (*__v).val.clone()) + return (*(*(*(*h.borrow()).upgrade().deref()).val.borrow()) .as_ref() .unwrap() .borrow()); @@ -35,8 +33,7 @@ pub fn read_val_0(h: Ptr) -> i32 { pub fn write_val_1(h: Ptr, v: i32) { let h: Value> = Rc::new(RefCell::new(h)); let v: Value = Rc::new(RefCell::new(v)); - (*(*h.borrow()) - .with(|__v| (*__v).val.clone()) + (*(*(*(*h.borrow()).upgrade().deref()).val.borrow_mut()) .as_ref() .unwrap() .borrow_mut()) = (*v.borrow()); @@ -46,7 +43,7 @@ pub fn main() { } fn main_0() -> i32 { let h: Value = Rc::new(RefCell::new(::default())); - (*h.borrow_mut()).val = Some(Rc::new(RefCell::new(10))); + (*(*h.borrow()).val.borrow_mut()) = Some(Rc::new(RefCell::new(10))); ({ write_val_1((h.as_pointer()), 42) }); return ({ read_val_0((h.as_pointer())) }); } diff --git a/tests/unit/out/refcount/unique_ptr_nested.rs b/tests/unit/out/refcount/unique_ptr_nested.rs index 20a8f380a..73a076821 100644 --- a/tests/unit/out/refcount/unique_ptr_nested.rs +++ b/tests/unit/out/refcount/unique_ptr_nested.rs @@ -6,17 +6,16 @@ use std::io::prelude::*; use std::io::{Read, Seek, Write}; use std::os::fd::AsFd; use std::rc::{Rc, Weak}; -#[repr(C)] #[derive(Default)] pub struct Inner { - pub x: i32, - pub y: i32, + pub x: Value, + pub y: Value, } impl Clone for Inner { fn clone(&self) -> Self { let mut this = Self { - x: self.x, - y: self.y, + x: Rc::new(RefCell::new((*self.x.borrow()))), + y: Rc::new(RefCell::new((*self.y.borrow()))), }; this } @@ -26,31 +25,30 @@ impl ByteRepr for Inner { 8 } fn to_bytes(&self, buf: &mut [u8]) { - self.x.to_bytes(&mut buf[0..4]); - self.y.to_bytes(&mut buf[4..8]); + (*self.x.borrow()).to_bytes(&mut buf[0..4]); + (*self.y.borrow()).to_bytes(&mut buf[4..8]); } fn from_bytes(buf: &[u8]) -> Self { Self { - x: ::from_bytes(&buf[0..4]), - y: ::from_bytes(&buf[4..8]), + x: Rc::new(RefCell::new(::from_bytes(&buf[0..4]))), + y: Rc::new(RefCell::new(::from_bytes(&buf[4..8]))), } } } -#[repr(C)] #[derive(Default)] pub struct Outer { - pub inner: Option>, + pub inner: Value>>, } impl ByteRepr for Outer { fn byte_size() -> usize { 8 } fn to_bytes(&self, buf: &mut [u8]) { - self.inner.to_bytes(&mut buf[0..8]); + (*self.inner.borrow()).to_bytes(&mut buf[0..8]); } fn from_bytes(buf: &[u8]) -> Self { Self { - inner: >>::from_bytes(&buf[0..8]), + inner: Rc::new(RefCell::new(>>::from_bytes(&buf[0..8]))), } } } @@ -60,26 +58,30 @@ pub fn main() { fn main_0() -> i32 { let o: Value>> = Rc::new(RefCell::new(Some(Rc::new(RefCell::new(Outer { - inner: Some(Rc::new(RefCell::new(Inner { x: 10, y: 20 }))), + inner: Rc::new(RefCell::new(Some(Rc::new(RefCell::new(Inner { + x: Rc::new(RefCell::new(10)), + y: Rc::new(RefCell::new(20)), + }))))), }))))); - (*(*(*o.borrow_mut()).as_ref().unwrap().borrow_mut()) - .inner + (*(*(*(*(*o.borrow()).as_ref().unwrap().borrow()).inner.borrow()) .as_ref() .unwrap() - .borrow_mut()) - .x += 5; + .borrow()) + .x + .borrow_mut()) += 5; let sum: Value = Rc::new(RefCell::new( - ((*(*(*o.borrow()).as_ref().unwrap().borrow()) - .inner + ((*(*(*(*(*o.borrow()).as_ref().unwrap().borrow()).inner.borrow()) .as_ref() .unwrap() .borrow()) - .x + (*(*(*o.borrow()).as_ref().unwrap().borrow()) - .inner - .as_ref() - .unwrap() - .borrow()) - .y), + .x + .borrow()) + + (*(*(*(*(*o.borrow()).as_ref().unwrap().borrow()).inner.borrow()) + .as_ref() + .unwrap() + .borrow()) + .y + .borrow())), )); let a: Value>> = Rc::new(RefCell::new(Some(Rc::new(RefCell::new(100))))); let b: Value>> = Rc::new(RefCell::new(Some(Rc::new(RefCell::new(0))))); diff --git a/tests/unit/out/refcount/void_cast.rs b/tests/unit/out/refcount/void_cast.rs index 1f44d414a..f8b0af116 100644 --- a/tests/unit/out/refcount/void_cast.rs +++ b/tests/unit/out/refcount/void_cast.rs @@ -10,15 +10,14 @@ pub fn unused_param_0(x: i32) { let x: Value = Rc::new(RefCell::new(x)); (*x.borrow_mut()); } -#[repr(C)] #[derive(Default)] pub struct NonTrivial { - pub data: Vec, + pub data: Value>, } impl Clone for NonTrivial { fn clone(&self) -> Self { let mut this = Self { - data: (self.data).clone(), + data: Rc::new(RefCell::new((*self.data.borrow()).clone())), }; this } @@ -28,20 +27,20 @@ impl ByteRepr for NonTrivial { 24 } fn to_bytes(&self, buf: &mut [u8]) { - self.data.to_bytes(&mut buf[0..24]); + (*self.data.borrow()).to_bytes(&mut buf[0..24]); } fn from_bytes(buf: &[u8]) -> Self { Self { - data: >::from_bytes(&buf[0..24]), + data: Rc::new(RefCell::new(>::from_bytes(&buf[0..24]))), } } } pub fn unused_ref_param_1(x: Ptr) { - (x.read()).clone(); + (*x.upgrade().deref()).clone(); } pub fn unused_ptr_param_2(p: Ptr) { let p: Value> = Rc::new(RefCell::new(p)); - ((*p.borrow()).read()).clone(); + (*(*p.borrow()).upgrade().deref()).clone(); } thread_local!( pub static side_effect_counter_3: Value = Rc::new(RefCell::new(0)); @@ -50,14 +49,15 @@ pub fn bump_and_return_4() -> i32 { (*side_effect_counter_3.with(Value::clone).borrow_mut()).prefix_inc(); return (*side_effect_counter_3.with(Value::clone).borrow()); } -#[repr(C)] #[derive(Default)] pub struct Holder { - pub field: i32, + pub field: Value, } impl Clone for Holder { fn clone(&self) -> Self { - let mut this = Self { field: self.field }; + let mut this = Self { + field: Rc::new(RefCell::new((*self.field.borrow()))), + }; this } } @@ -66,11 +66,11 @@ impl ByteRepr for Holder { 4 } fn to_bytes(&self, buf: &mut [u8]) { - self.field.to_bytes(&mut buf[0..4]); + (*self.field.borrow()).to_bytes(&mut buf[0..4]); } fn from_bytes(buf: &[u8]) -> Self { Self { - field: ::from_bytes(&buf[0..4]), + field: Rc::new(RefCell::new(::from_bytes(&buf[0..4]))), } } } @@ -128,10 +128,12 @@ fn main_0() -> i32 { (*p.borrow_mut()).clone(); let arr: Value> = Rc::new(RefCell::new(Box::new([1, 2, 3]))); ((*arr.borrow_mut())[(1) as usize]); - let h: Value = Rc::new(RefCell::new(Holder { field: 17 })); - ((*h.borrow()).field); + let h: Value = Rc::new(RefCell::new(Holder { + field: Rc::new(RefCell::new(17)), + })); + (*(*h.borrow()).field.borrow_mut()); let hp: Value> = Rc::new(RefCell::new((h.as_pointer()))); - ((*hp.borrow()).with(|__v| (*__v).field)); + (*(*(*hp.borrow()).upgrade().deref()).field.borrow_mut()); let nt: Value = Rc::new(RefCell::new(::default())); ({ unused_ref_param_1(nt.as_pointer()) }); ({ unused_ptr_param_2((nt.as_pointer())) });