Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions cpp2rust/converter/models/converter_refcount.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1796,13 +1796,13 @@ void ConverterRefCount::ConvertAssignment(clang::Expr *lhs, clang::Expr *rhs,
auto lhs_str = ConvertLValue(lhs);
if (!pending_deref_.empty()) {
auto ptr = pending_deref_.take();
// *ptr += val => { let __ptr = ptr.clone(); let __tmp = __ptr.read() +
// val;
// __ptr.write(__tmp) }
auto op = assign_operator;
op.remove_suffix(1); // remove '='
StrCat("{ let __ptr = ", ptr, ".clone(); let __tmp = __ptr.read() ", op,
" ", rhs_as_string, "; __ptr.write(__tmp) }");
{
PushBrace brace(*this);
StrCat(std::format("let _ptr = {}.clone();", ptr));
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why doesn't this use the emitFreshPointer functionality instead of always doing a clone?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No good reason. I will replace with ConvertFreshPointer

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I took a closer look and it's not trivial to replace with ConvertFreshPointer. This path uses the pending_deref_ mechanism. pending_deref_ is generally used for rewriting mutable method receivers to use Ptr::with_mut. Or more generally, to convert pointer dereferences in AddrOf/LValue contexts.

pending_deref_ is triggered inside ConvertLValue, line 1796 above, so every user of ConvertLValue must also check pending_deref_.

StrCat(std::format("_ptr.write(_ptr.read() {} {})", op, rhs_as_string));
}
} else {
StrCat(lhs_str, assign_operator, rhs_as_string);
}
Expand Down
30 changes: 12 additions & 18 deletions tests/unit/out/refcount/borrow_mut_opt.rs
Original file line number Diff line number Diff line change
Expand Up @@ -68,45 +68,39 @@ pub fn convert_with_rhs_1() {
(*arr.borrow_mut())[(0) as usize] = __rhs;
let __rhs = (*x.borrow());
{
let __ptr = z.clone();
let __tmp = __ptr.read() + __rhs;
__ptr.write(__tmp)
let _ptr = z.clone();
_ptr.write(_ptr.read() + __rhs)
};
let __rhs = (*y.borrow());
{
let __ptr = z.clone();
let __tmp = __ptr.read() + __rhs;
__ptr.write(__tmp)
let _ptr = z.clone();
_ptr.write(_ptr.read() + __rhs)
};
let __rhs = ((*p.borrow()).read());
{
let __ptr = z.clone();
let __tmp = __ptr.read() + __rhs;
__ptr.write(__tmp)
let _ptr = z.clone();
_ptr.write(_ptr.read() + __rhs)
};
let __rhs = ((*y.borrow()) + (*x.borrow()));
{
let __ptr = (*p.borrow()).clone();
let __tmp = __ptr.read() + __rhs;
__ptr.write(__tmp)
let _ptr = (*p.borrow()).clone();
_ptr.write(_ptr.read() + __rhs)
};
let __rhs = {
let _lhs = (*x.borrow());
_lhs + (z.read())
};
{
let __ptr = (*p.borrow()).clone();
let __tmp = __ptr.read() + __rhs;
__ptr.write(__tmp)
let _ptr = (*p.borrow()).clone();
_ptr.write(_ptr.read() + __rhs)
};
let __rhs = {
let _lhs = (*y.borrow());
_lhs + (z.read())
};
{
let __ptr = (*p.borrow()).clone();
let __tmp = __ptr.read() + __rhs;
__ptr.write(__tmp)
let _ptr = (*p.borrow()).clone();
_ptr.write(_ptr.read() + __rhs)
};
}
pub fn main() {
Expand Down
35 changes: 14 additions & 21 deletions tests/unit/out/refcount/complex_function.rs
Original file line number Diff line number Diff line change
Expand Up @@ -140,15 +140,13 @@ fn main_0() -> i32 {
});
let __rhs = (*x1.borrow());
{
let __ptr = r2.clone();
let __tmp = __ptr.read() + __rhs;
__ptr.write(__tmp)
let _ptr = r2.clone();
_ptr.write(_ptr.read() + __rhs)
};
let __rhs = (r1.read());
{
let __ptr = r3.clone();
let __tmp = __ptr.read() + __rhs;
__ptr.write(__tmp)
let _ptr = r3.clone();
_ptr.write(_ptr.read() + __rhs)
};
let x4: Value<i32> = Rc::new(RefCell::new(
((({
Expand Down Expand Up @@ -231,13 +229,12 @@ fn main_0() -> i32 {
.borrow()),
));
{
let __ptr = ({
let _ptr = ({
let _x: Ptr<i32> = x1.as_pointer();
bar_2(_x)
})
.clone();
let __tmp = __ptr.read() + 10;
__ptr.write(__tmp)
_ptr.write(_ptr.read() + 10)
};
({
let _x: Ptr<i32> = x1.as_pointer();
Expand Down Expand Up @@ -283,7 +280,7 @@ fn main_0() -> i32 {
}))
+ 1);
{
let __ptr = ({
let _ptr = ({
let _x: Ptr<i32> = (*({
(*({ (*({ (*d.borrow()).get() }).upgrade().deref()).get() })
.upgrade()
Expand All @@ -297,8 +294,7 @@ fn main_0() -> i32 {
bar_2(_x)
})
.clone();
let __tmp = __ptr.read() + 10;
__ptr.write(__tmp)
_ptr.write(_ptr.read() + 10)
};
({
let _x: Ptr<i32> = (*({
Expand Down Expand Up @@ -350,13 +346,12 @@ fn main_0() -> i32 {
})
.with_mut(|__v| __v.prefix_inc());
{
let __ptr = ({
let _ptr = ({
let _x: Ptr<i32> = (x1.as_pointer());
ptr_1(_x)
})
.clone();
let __tmp = __ptr.read() + 1;
__ptr.write(__tmp)
_ptr.write(_ptr.read() + 1)
};
({
let _x: Ptr<i32> = ((*({
Expand All @@ -373,7 +368,7 @@ fn main_0() -> i32 {
})
.with_mut(|__v| __v.prefix_inc());
{
let __ptr = ({
let _ptr = ({
let _x: Ptr<i32> = ((*({
(*({ (*({ (*d.borrow()).get() }).upgrade().deref()).get() })
.upgrade()
Expand All @@ -387,11 +382,10 @@ fn main_0() -> i32 {
ptr_1(_x)
})
.clone();
let __tmp = __ptr.read() + 1;
__ptr.write(__tmp)
_ptr.write(_ptr.read() + 1)
};
{
let __ptr = ({
let _ptr = ({
let _x: Ptr<i32> = ((*({
(*({ (*({ (*d.borrow()).get() }).upgrade().deref()).get() })
.upgrade()
Expand All @@ -405,8 +399,7 @@ fn main_0() -> i32 {
ptr_1(_x)
})
.clone();
let __tmp = __ptr.read() + 1;
__ptr.write(__tmp)
_ptr.write(_ptr.read() + 1)
};
let ptr1: Value<i32> = Rc::new(RefCell::new(
({
Expand Down
20 changes: 8 additions & 12 deletions tests/unit/out/refcount/fatorial.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,8 @@ pub fn fatorial_0(n: i32) -> i32 {
pub fn fatorial_by_ref_1(n: Ptr<i32>) {
if ((n.read()) == 1) {
{
let __ptr = n.clone();
let __tmp = __ptr.read() * 1;
__ptr.write(__tmp)
let _ptr = n.clone();
_ptr.write(_ptr.read() * 1)
};
return;
}
Expand All @@ -33,18 +32,16 @@ pub fn fatorial_by_ref_1(n: Ptr<i32>) {
});
let __rhs = (*n_1.borrow());
{
let __ptr = n.clone();
let __tmp = __ptr.read() * __rhs;
__ptr.write(__tmp)
let _ptr = n.clone();
_ptr.write(_ptr.read() * __rhs)
};
}
pub fn fatorial_by_ptr_2(n: Ptr<i32>) {
let n: Value<Ptr<i32>> = Rc::new(RefCell::new(n));
if (((*n.borrow()).read()) == 1) {
{
let __ptr = (*n.borrow()).clone();
let __tmp = __ptr.read() * 1;
__ptr.write(__tmp)
let _ptr = (*n.borrow()).clone();
_ptr.write(_ptr.read() * 1)
};
return;
}
Expand All @@ -55,9 +52,8 @@ pub fn fatorial_by_ptr_2(n: Ptr<i32>) {
});
let __rhs = (*n_1.borrow());
{
let __ptr = (*n.borrow()).clone();
let __tmp = __ptr.read() * __rhs;
__ptr.write(__tmp)
let _ptr = (*n.borrow()).clone();
_ptr.write(_ptr.read() * __rhs)
};
}
pub fn main() {
Expand Down
5 changes: 2 additions & 3 deletions tests/unit/out/refcount/fn_ptr_as_condition.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,8 @@ use std::rc::{Rc, Weak};
pub fn double_it_0(x: Ptr<i32>) {
let x: Value<Ptr<i32>> = Rc::new(RefCell::new(x));
{
let __ptr = (*x.borrow()).clone();
let __tmp = __ptr.read() * 2;
__ptr.write(__tmp)
let _ptr = (*x.borrow()).clone();
_ptr.write(_ptr.read() * 2)
};
}
pub fn maybe_call_1(cb: FnPtr<fn(Ptr<i32>)>, x: Ptr<i32>) {
Expand Down
5 changes: 2 additions & 3 deletions tests/unit/out/refcount/foreach_mut.rs
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,8 @@ fn main_0() -> i32 {
'loop_: for mut p in v2.as_pointer() as Ptr<Ptr<i32>> {
let p: Value<Ptr<i32>> = Rc::new(RefCell::new(p.read().clone()));
{
let __ptr = (*p.borrow()).clone();
let __tmp = __ptr.read() + 5;
__ptr.write(__tmp)
let _ptr = (*p.borrow()).clone();
_ptr.write(_ptr.read() + 5)
};
}
'loop_: for p in v2.as_pointer() as Ptr<Ptr<i32>> {
Expand Down
25 changes: 10 additions & 15 deletions tests/unit/out/refcount/pointer_arithmetic.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,38 +13,33 @@ fn main_0() -> i32 {
let x: Value<i32> = Rc::new(RefCell::new(1));
let p: Value<Ptr<i32>> = Rc::new(RefCell::new((x.as_pointer())));
{
let __ptr = (*p.borrow()).clone();
let __tmp = __ptr.read() + 1;
__ptr.write(__tmp)
let _ptr = (*p.borrow()).clone();
_ptr.write(_ptr.read() + 1)
};
if ((*x.borrow()) == 2) {
let a: Value<Box<[i32]>> = Rc::new(RefCell::new(Box::new([1, 2])));
(*p.borrow_mut()) = ((a.as_pointer() as Ptr<i32>).offset(1 as isize));
{
let __ptr = (*p.borrow()).clone();
let __tmp = __ptr.read() + 1;
__ptr.write(__tmp)
let _ptr = (*p.borrow()).clone();
_ptr.write(_ptr.read() + 1)
};
if ((*a.borrow())[(0) as usize] == 1) && ((*a.borrow())[(1) as usize] == 3) {
(*p.borrow_mut()).prefix_dec();
{
let __ptr = (*p.borrow()).clone();
let __tmp = __ptr.read() + 1;
__ptr.write(__tmp)
let _ptr = (*p.borrow()).clone();
_ptr.write(_ptr.read() + 1)
};
if ((*a.borrow())[(0) as usize] == 2) && ((*a.borrow())[(1) as usize] == 3) {
(*p.borrow_mut()) = (x.as_pointer());
{
let __ptr = (*p.borrow()).clone();
let __tmp = __ptr.read() + 1;
__ptr.write(__tmp)
let _ptr = (*p.borrow()).clone();
_ptr.write(_ptr.read() + 1)
};
if ((*x.borrow()) == 3) {
let p2: Value<Ptr<i32>> = Rc::new(RefCell::new((*p.borrow()).clone()));
{
let __ptr = (*p2.borrow()).clone();
let __tmp = __ptr.read() + 1;
__ptr.write(__tmp)
let _ptr = (*p2.borrow()).clone();
_ptr.write(_ptr.read() + 1)
};
return (((*x.borrow()) == 4) as i32);
}
Expand Down
5 changes: 2 additions & 3 deletions tests/unit/out/refcount/pointer_array.rs
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,8 @@ pub fn IncrementAll_0(s: Ptr<StackArray>) {
let i: Value<i32> = Rc::new(RefCell::new(0));
'loop_: while ((*i.borrow()) < 3) {
{
let __ptr = (*(*s.upgrade().deref()).arr.borrow())[(*i.borrow()) as usize].clone();
let __tmp = __ptr.read() + 1;
__ptr.write(__tmp)
let _ptr = (*(*s.upgrade().deref()).arr.borrow())[(*i.borrow()) as usize].clone();
_ptr.write(_ptr.read() + 1)
};
(*i.borrow_mut()).prefix_inc();
}
Expand Down
5 changes: 2 additions & 3 deletions tests/unit/out/refcount/pointers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -71,9 +71,8 @@ fn main_0() -> i32 {
(*t3.borrow_mut()) = (*t2.borrow()).clone();
(*(*(*t3.borrow()).upgrade().deref()).x.borrow_mut()) = 15;
{
let __ptr = ({ (*(*t3.borrow()).upgrade().deref()).as_ptr() }).clone();
let __tmp = __ptr.read() + 10;
__ptr.write(__tmp)
let _ptr = ({ (*(*t3.borrow()).upgrade().deref()).as_ptr() }).clone();
_ptr.write(_ptr.read() + 10)
};
return {
let _lhs = {
Expand Down
5 changes: 2 additions & 3 deletions tests/unit/out/refcount/refs_as_args.rs
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,8 @@ pub fn more_refs_0(x1: i32, x2: i32, r1: Ptr<i32>, r2: Ptr<i32>) {
_lhs + (r.read())
};
{
let __ptr = rx2.clone();
let __tmp = __ptr.read() + __rhs;
__ptr.write(__tmp)
let _ptr = rx2.clone();
_ptr.write(_ptr.read() + __rhs)
};
let __rhs = (rx2.read());
r1.write(__rhs);
Expand Down
5 changes: 2 additions & 3 deletions tests/unit/out/refcount/unique_ptr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -58,9 +58,8 @@ pub fn DoStuffWithSafePointer_0(safe_ptr: Ptr<Option<Value<SafePointer>>>) {
(*x4.borrow_mut()) = (*x3.borrow_mut()).take();
let raw_ptr2: Value<Ptr<i32>> = Rc::new(RefCell::new(((*x4.borrow()).as_pointer())));
{
let __ptr = (*raw_ptr2.borrow()).clone();
let __tmp = __ptr.read() + 1;
__ptr.write(__tmp)
let _ptr = (*raw_ptr2.borrow()).clone();
_ptr.write(_ptr.read() + 1)
};
let pair: Value<Option<Value<Pair>>> =
Rc::new(RefCell::new(Some(Rc::new(RefCell::new(Pair {
Expand Down
5 changes: 2 additions & 3 deletions tests/unit/out/refcount/vector.rs
Original file line number Diff line number Diff line change
Expand Up @@ -211,9 +211,8 @@ fn main_0() -> i32 {
let ref1: Ptr<f64> =
(v6.as_pointer() as Ptr<f64>).offset((*s2.borrow()).wrapping_sub(1_u64) as isize);
{
let __ptr = ref1.clone();
let __tmp = __ptr.read() + 1.5E+0;
__ptr.write(__tmp)
let _ptr = ref1.clone();
_ptr.write(_ptr.read() + 1.5E+0)
};
assert!(
(((v6.as_pointer() as Ptr<f64>)
Expand Down
Loading