Skip to content

Commit a676434

Browse files
committed
Hoist _ptr to save one clone
1 parent 204f3bb commit a676434

12 files changed

Lines changed: 126 additions & 100 deletions

File tree

cpp2rust/converter/models/converter_refcount.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1798,8 +1798,11 @@ void ConverterRefCount::ConvertAssignment(clang::Expr *lhs, clang::Expr *rhs,
17981798
auto ptr = pending_deref_.take();
17991799
auto op = assign_operator;
18001800
op.remove_suffix(1); // remove '='
1801-
StrCat(std::format("{}.write({}.read() {} {})", ptr, ptr, op,
1802-
rhs_as_string));
1801+
{
1802+
PushBrace brace(*this);
1803+
StrCat(std::format("let _ptr = {}.clone();", ptr));
1804+
StrCat(std::format("_ptr.write(_ptr.read() {} {})", op, rhs_as_string));
1805+
}
18031806
} else {
18041807
StrCat(lhs_str, assign_operator, rhs_as_string);
18051808
}

tests/unit/out/refcount/borrow_mut_opt.rs

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -67,23 +67,41 @@ pub fn convert_with_rhs_1() {
6767
let __rhs = ((*p.borrow()).read());
6868
(*arr.borrow_mut())[(0) as usize] = __rhs;
6969
let __rhs = (*x.borrow());
70-
z.write(z.read() + __rhs);
70+
{
71+
let _ptr = z.clone();
72+
_ptr.write(_ptr.read() + __rhs)
73+
};
7174
let __rhs = (*y.borrow());
72-
z.write(z.read() + __rhs);
75+
{
76+
let _ptr = z.clone();
77+
_ptr.write(_ptr.read() + __rhs)
78+
};
7379
let __rhs = ((*p.borrow()).read());
74-
z.write(z.read() + __rhs);
80+
{
81+
let _ptr = z.clone();
82+
_ptr.write(_ptr.read() + __rhs)
83+
};
7584
let __rhs = ((*y.borrow()) + (*x.borrow()));
76-
(*p.borrow()).write((*p.borrow()).read() + __rhs);
85+
{
86+
let _ptr = (*p.borrow()).clone();
87+
_ptr.write(_ptr.read() + __rhs)
88+
};
7789
let __rhs = {
7890
let _lhs = (*x.borrow());
7991
_lhs + (z.read())
8092
};
81-
(*p.borrow()).write((*p.borrow()).read() + __rhs);
93+
{
94+
let _ptr = (*p.borrow()).clone();
95+
_ptr.write(_ptr.read() + __rhs)
96+
};
8297
let __rhs = {
8398
let _lhs = (*y.borrow());
8499
_lhs + (z.read())
85100
};
86-
(*p.borrow()).write((*p.borrow()).read() + __rhs);
101+
{
102+
let _ptr = (*p.borrow()).clone();
103+
_ptr.write(_ptr.read() + __rhs)
104+
};
87105
}
88106
pub fn main() {
89107
std::process::exit(main_0());

tests/unit/out/refcount/complex_function.rs

Lines changed: 33 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -139,9 +139,15 @@ fn main_0() -> i32 {
139139
bar_2(_x)
140140
});
141141
let __rhs = (*x1.borrow());
142-
r2.write(r2.read() + __rhs);
142+
{
143+
let _ptr = r2.clone();
144+
_ptr.write(_ptr.read() + __rhs)
145+
};
143146
let __rhs = (r1.read());
144-
r3.write(r3.read() + __rhs);
147+
{
148+
let _ptr = r3.clone();
149+
_ptr.write(_ptr.read() + __rhs)
150+
};
145151
let x4: Value<i32> = Rc::new(RefCell::new(
146152
((({
147153
let _x: i32 = (*x3.borrow());
@@ -222,18 +228,14 @@ fn main_0() -> i32 {
222228
.v
223229
.borrow()),
224230
));
225-
({
226-
let _x: Ptr<i32> = x1.as_pointer();
227-
bar_2(_x)
228-
})
229-
.write(
230-
({
231+
{
232+
let _ptr = ({
231233
let _x: Ptr<i32> = x1.as_pointer();
232234
bar_2(_x)
233235
})
234-
.read()
235-
+ 10,
236-
);
236+
.clone();
237+
_ptr.write(_ptr.read() + 10)
238+
};
237239
({
238240
let _x: Ptr<i32> = x1.as_pointer();
239241
bar_2(_x)
@@ -277,21 +279,8 @@ fn main_0() -> i32 {
277279
foo_0(_x)
278280
}))
279281
+ 1);
280-
({
281-
let _x: Ptr<i32> = (*({
282-
(*({ (*({ (*d.borrow()).get() }).upgrade().deref()).get() })
283-
.upgrade()
284-
.deref())
285-
.get()
286-
})
287-
.upgrade()
288-
.deref())
289-
.v
290-
.as_pointer();
291-
bar_2(_x)
292-
})
293-
.write(
294-
({
282+
{
283+
let _ptr = ({
295284
let _x: Ptr<i32> = (*({
296285
(*({ (*({ (*d.borrow()).get() }).upgrade().deref()).get() })
297286
.upgrade()
@@ -304,9 +293,9 @@ fn main_0() -> i32 {
304293
.as_pointer();
305294
bar_2(_x)
306295
})
307-
.read()
308-
+ 10,
309-
);
296+
.clone();
297+
_ptr.write(_ptr.read() + 10)
298+
};
310299
({
311300
let _x: Ptr<i32> = (*({
312301
(*({ (*({ (*d.borrow()).get() }).upgrade().deref()).get() })
@@ -356,18 +345,14 @@ fn main_0() -> i32 {
356345
ptr_1(_x)
357346
})
358347
.with_mut(|__v| __v.prefix_inc());
359-
({
360-
let _x: Ptr<i32> = (x1.as_pointer());
361-
ptr_1(_x)
362-
})
363-
.write(
364-
({
348+
{
349+
let _ptr = ({
365350
let _x: Ptr<i32> = (x1.as_pointer());
366351
ptr_1(_x)
367352
})
368-
.read()
369-
+ 1,
370-
);
353+
.clone();
354+
_ptr.write(_ptr.read() + 1)
355+
};
371356
({
372357
let _x: Ptr<i32> = ((*({
373358
(*({ (*({ (*d.borrow()).get() }).upgrade().deref()).get() })
@@ -382,21 +367,8 @@ fn main_0() -> i32 {
382367
ptr_1(_x)
383368
})
384369
.with_mut(|__v| __v.prefix_inc());
385-
({
386-
let _x: Ptr<i32> = ((*({
387-
(*({ (*({ (*d.borrow()).get() }).upgrade().deref()).get() })
388-
.upgrade()
389-
.deref())
390-
.get()
391-
})
392-
.upgrade()
393-
.deref())
394-
.v
395-
.as_pointer());
396-
ptr_1(_x)
397-
})
398-
.write(
399-
({
370+
{
371+
let _ptr = ({
400372
let _x: Ptr<i32> = ((*({
401373
(*({ (*({ (*d.borrow()).get() }).upgrade().deref()).get() })
402374
.upgrade()
@@ -409,24 +381,11 @@ fn main_0() -> i32 {
409381
.as_pointer());
410382
ptr_1(_x)
411383
})
412-
.read()
413-
+ 1,
414-
);
415-
({
416-
let _x: Ptr<i32> = ((*({
417-
(*({ (*({ (*d.borrow()).get() }).upgrade().deref()).get() })
418-
.upgrade()
419-
.deref())
420-
.get()
421-
})
422-
.upgrade()
423-
.deref())
424-
.v
425-
.as_pointer());
426-
ptr_1(_x)
427-
})
428-
.write(
429-
({
384+
.clone();
385+
_ptr.write(_ptr.read() + 1)
386+
};
387+
{
388+
let _ptr = ({
430389
let _x: Ptr<i32> = ((*({
431390
(*({ (*({ (*d.borrow()).get() }).upgrade().deref()).get() })
432391
.upgrade()
@@ -439,9 +398,9 @@ fn main_0() -> i32 {
439398
.as_pointer());
440399
ptr_1(_x)
441400
})
442-
.read()
443-
+ 1,
444-
);
401+
.clone();
402+
_ptr.write(_ptr.read() + 1)
403+
};
445404
let ptr1: Value<i32> = Rc::new(RefCell::new(
446405
({
447406
let _x: Ptr<i32> = ((*({

tests/unit/out/refcount/fatorial.rs

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,10 @@ pub fn fatorial_0(n: i32) -> i32 {
1919
}
2020
pub fn fatorial_by_ref_1(n: Ptr<i32>) {
2121
if ((n.read()) == 1) {
22-
n.write(n.read() * 1);
22+
{
23+
let _ptr = n.clone();
24+
_ptr.write(_ptr.read() * 1)
25+
};
2326
return;
2427
}
2528
let n_1: Value<i32> = Rc::new(RefCell::new(((n.read()) - 1)));
@@ -28,12 +31,18 @@ pub fn fatorial_by_ref_1(n: Ptr<i32>) {
2831
fatorial_by_ref_1(_n)
2932
});
3033
let __rhs = (*n_1.borrow());
31-
n.write(n.read() * __rhs);
34+
{
35+
let _ptr = n.clone();
36+
_ptr.write(_ptr.read() * __rhs)
37+
};
3238
}
3339
pub fn fatorial_by_ptr_2(n: Ptr<i32>) {
3440
let n: Value<Ptr<i32>> = Rc::new(RefCell::new(n));
3541
if (((*n.borrow()).read()) == 1) {
36-
(*n.borrow()).write((*n.borrow()).read() * 1);
42+
{
43+
let _ptr = (*n.borrow()).clone();
44+
_ptr.write(_ptr.read() * 1)
45+
};
3746
return;
3847
}
3948
let n_1: Value<i32> = Rc::new(RefCell::new((((*n.borrow()).read()) - 1)));
@@ -42,7 +51,10 @@ pub fn fatorial_by_ptr_2(n: Ptr<i32>) {
4251
fatorial_by_ptr_2(_n)
4352
});
4453
let __rhs = (*n_1.borrow());
45-
(*n.borrow()).write((*n.borrow()).read() * __rhs);
54+
{
55+
let _ptr = (*n.borrow()).clone();
56+
_ptr.write(_ptr.read() * __rhs)
57+
};
4658
}
4759
pub fn main() {
4860
std::process::exit(main_0());

tests/unit/out/refcount/fn_ptr_as_condition.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,10 @@ use std::os::fd::AsFd;
88
use std::rc::{Rc, Weak};
99
pub fn double_it_0(x: Ptr<i32>) {
1010
let x: Value<Ptr<i32>> = Rc::new(RefCell::new(x));
11-
(*x.borrow()).write((*x.borrow()).read() * 2);
11+
{
12+
let _ptr = (*x.borrow()).clone();
13+
_ptr.write(_ptr.read() * 2)
14+
};
1215
}
1316
pub fn maybe_call_1(cb: FnPtr<fn(Ptr<i32>)>, x: Ptr<i32>) {
1417
let cb: Value<FnPtr<fn(Ptr<i32>)>> = Rc::new(RefCell::new(cb));

tests/unit/out/refcount/foreach_mut.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,10 @@ fn main_0() -> i32 {
3737
(*v2.borrow_mut()).push(((v1.as_pointer() as Ptr<i32>).offset(2_u64 as isize)));
3838
'loop_: for mut p in v2.as_pointer() as Ptr<Ptr<i32>> {
3939
let p: Value<Ptr<i32>> = Rc::new(RefCell::new(p.read().clone()));
40-
(*p.borrow()).write((*p.borrow()).read() + 5);
40+
{
41+
let _ptr = (*p.borrow()).clone();
42+
_ptr.write(_ptr.read() + 5)
43+
};
4144
}
4245
'loop_: for p in v2.as_pointer() as Ptr<Ptr<i32>> {
4346
let p: Value<Ptr<i32>> = Rc::new(RefCell::new(p.read().clone()));

tests/unit/out/refcount/pointer_arithmetic.rs

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,20 +12,35 @@ pub fn main() {
1212
fn main_0() -> i32 {
1313
let x: Value<i32> = Rc::new(RefCell::new(1));
1414
let p: Value<Ptr<i32>> = Rc::new(RefCell::new((x.as_pointer())));
15-
(*p.borrow()).write((*p.borrow()).read() + 1);
15+
{
16+
let _ptr = (*p.borrow()).clone();
17+
_ptr.write(_ptr.read() + 1)
18+
};
1619
if ((*x.borrow()) == 2) {
1720
let a: Value<Box<[i32]>> = Rc::new(RefCell::new(Box::new([1, 2])));
1821
(*p.borrow_mut()) = ((a.as_pointer() as Ptr<i32>).offset(1 as isize));
19-
(*p.borrow()).write((*p.borrow()).read() + 1);
22+
{
23+
let _ptr = (*p.borrow()).clone();
24+
_ptr.write(_ptr.read() + 1)
25+
};
2026
if ((*a.borrow())[(0) as usize] == 1) && ((*a.borrow())[(1) as usize] == 3) {
2127
(*p.borrow_mut()).prefix_dec();
22-
(*p.borrow()).write((*p.borrow()).read() + 1);
28+
{
29+
let _ptr = (*p.borrow()).clone();
30+
_ptr.write(_ptr.read() + 1)
31+
};
2332
if ((*a.borrow())[(0) as usize] == 2) && ((*a.borrow())[(1) as usize] == 3) {
2433
(*p.borrow_mut()) = (x.as_pointer());
25-
(*p.borrow()).write((*p.borrow()).read() + 1);
34+
{
35+
let _ptr = (*p.borrow()).clone();
36+
_ptr.write(_ptr.read() + 1)
37+
};
2638
if ((*x.borrow()) == 3) {
2739
let p2: Value<Ptr<i32>> = Rc::new(RefCell::new((*p.borrow()).clone()));
28-
(*p2.borrow()).write((*p2.borrow()).read() + 1);
40+
{
41+
let _ptr = (*p2.borrow()).clone();
42+
_ptr.write(_ptr.read() + 1)
43+
};
2944
return (((*x.borrow()) == 4) as i32);
3045
}
3146
}

tests/unit/out/refcount/pointer_array.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,10 @@ impl ByteRepr for StackArray {}
3333
pub fn IncrementAll_0(s: Ptr<StackArray>) {
3434
let i: Value<i32> = Rc::new(RefCell::new(0));
3535
'loop_: while ((*i.borrow()) < 3) {
36-
(*(*s.upgrade().deref()).arr.borrow())[(*i.borrow()) as usize]
37-
.write((*(*s.upgrade().deref()).arr.borrow())[(*i.borrow()) as usize].read() + 1);
36+
{
37+
let _ptr = (*(*s.upgrade().deref()).arr.borrow())[(*i.borrow()) as usize].clone();
38+
_ptr.write(_ptr.read() + 1)
39+
};
3840
(*i.borrow_mut()).prefix_inc();
3941
}
4042
}

tests/unit/out/refcount/pointers.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,10 @@ fn main_0() -> i32 {
7070
let t3: Value<Ptr<Test>> = Rc::new(RefCell::new(Ptr::<Test>::null()));
7171
(*t3.borrow_mut()) = (*t2.borrow()).clone();
7272
(*(*(*t3.borrow()).upgrade().deref()).x.borrow_mut()) = 15;
73-
({ (*(*t3.borrow()).upgrade().deref()).as_ptr() })
74-
.write(({ (*(*t3.borrow()).upgrade().deref()).as_ptr() }).read() + 10);
73+
{
74+
let _ptr = ({ (*(*t3.borrow()).upgrade().deref()).as_ptr() }).clone();
75+
_ptr.write(_ptr.read() + 10)
76+
};
7577
return {
7678
let _lhs = {
7779
let _lhs = (*(*(*t3.borrow()).upgrade().deref()).x.borrow());

tests/unit/out/refcount/refs_as_args.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,10 @@ pub fn more_refs_0(x1: i32, x2: i32, r1: Ptr<i32>, r2: Ptr<i32>) {
3535
};
3636
_lhs + (r.read())
3737
};
38-
rx2.write(rx2.read() + __rhs);
38+
{
39+
let _ptr = rx2.clone();
40+
_ptr.write(_ptr.read() + __rhs)
41+
};
3942
let __rhs = (rx2.read());
4043
r1.write(__rhs);
4144
}

0 commit comments

Comments
 (0)