Skip to content

Commit 204f3bb

Browse files
committed
Rewrite compound assignment in a single expression
1 parent f560745 commit 204f3bb

12 files changed

Lines changed: 100 additions & 155 deletions

File tree

cpp2rust/converter/models/converter_refcount.cpp

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1796,13 +1796,10 @@ void ConverterRefCount::ConvertAssignment(clang::Expr *lhs, clang::Expr *rhs,
17961796
auto lhs_str = ConvertLValue(lhs);
17971797
if (!pending_deref_.empty()) {
17981798
auto ptr = pending_deref_.take();
1799-
// *ptr += val => { let __ptr = ptr.clone(); let __tmp = __ptr.read() +
1800-
// val;
1801-
// __ptr.write(__tmp) }
18021799
auto op = assign_operator;
18031800
op.remove_suffix(1); // remove '='
1804-
StrCat("{ let __ptr = ", ptr, ".clone(); let __tmp = __ptr.read() ", op,
1805-
" ", rhs_as_string, "; __ptr.write(__tmp) }");
1801+
StrCat(std::format("{}.write({}.read() {} {})", ptr, ptr, op,
1802+
rhs_as_string));
18061803
} else {
18071804
StrCat(lhs_str, assign_operator, rhs_as_string);
18081805
}

tests/unit/out/refcount/borrow_mut_opt.rs

Lines changed: 6 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -67,47 +67,23 @@ 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-
{
71-
let __ptr = z.clone();
72-
let __tmp = __ptr.read() + __rhs;
73-
__ptr.write(__tmp)
74-
};
70+
z.write(z.read() + __rhs);
7571
let __rhs = (*y.borrow());
76-
{
77-
let __ptr = z.clone();
78-
let __tmp = __ptr.read() + __rhs;
79-
__ptr.write(__tmp)
80-
};
72+
z.write(z.read() + __rhs);
8173
let __rhs = ((*p.borrow()).read());
82-
{
83-
let __ptr = z.clone();
84-
let __tmp = __ptr.read() + __rhs;
85-
__ptr.write(__tmp)
86-
};
74+
z.write(z.read() + __rhs);
8775
let __rhs = ((*y.borrow()) + (*x.borrow()));
88-
{
89-
let __ptr = (*p.borrow()).clone();
90-
let __tmp = __ptr.read() + __rhs;
91-
__ptr.write(__tmp)
92-
};
76+
(*p.borrow()).write((*p.borrow()).read() + __rhs);
9377
let __rhs = {
9478
let _lhs = (*x.borrow());
9579
_lhs + (z.read())
9680
};
97-
{
98-
let __ptr = (*p.borrow()).clone();
99-
let __tmp = __ptr.read() + __rhs;
100-
__ptr.write(__tmp)
101-
};
81+
(*p.borrow()).write((*p.borrow()).read() + __rhs);
10282
let __rhs = {
10383
let _lhs = (*y.borrow());
10484
_lhs + (z.read())
10585
};
106-
{
107-
let __ptr = (*p.borrow()).clone();
108-
let __tmp = __ptr.read() + __rhs;
109-
__ptr.write(__tmp)
110-
};
86+
(*p.borrow()).write((*p.borrow()).read() + __rhs);
11187
}
11288
pub fn main() {
11389
std::process::exit(main_0());

tests/unit/out/refcount/complex_function.rs

Lines changed: 74 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -139,17 +139,9 @@ fn main_0() -> i32 {
139139
bar_2(_x)
140140
});
141141
let __rhs = (*x1.borrow());
142-
{
143-
let __ptr = r2.clone();
144-
let __tmp = __ptr.read() + __rhs;
145-
__ptr.write(__tmp)
146-
};
142+
r2.write(r2.read() + __rhs);
147143
let __rhs = (r1.read());
148-
{
149-
let __ptr = r3.clone();
150-
let __tmp = __ptr.read() + __rhs;
151-
__ptr.write(__tmp)
152-
};
144+
r3.write(r3.read() + __rhs);
153145
let x4: Value<i32> = Rc::new(RefCell::new(
154146
((({
155147
let _x: i32 = (*x3.borrow());
@@ -230,15 +222,18 @@ fn main_0() -> i32 {
230222
.v
231223
.borrow()),
232224
));
233-
{
234-
let __ptr = ({
225+
({
226+
let _x: Ptr<i32> = x1.as_pointer();
227+
bar_2(_x)
228+
})
229+
.write(
230+
({
235231
let _x: Ptr<i32> = x1.as_pointer();
236232
bar_2(_x)
237233
})
238-
.clone();
239-
let __tmp = __ptr.read() + 10;
240-
__ptr.write(__tmp)
241-
};
234+
.read()
235+
+ 10,
236+
);
242237
({
243238
let _x: Ptr<i32> = x1.as_pointer();
244239
bar_2(_x)
@@ -282,8 +277,21 @@ fn main_0() -> i32 {
282277
foo_0(_x)
283278
}))
284279
+ 1);
285-
{
286-
let __ptr = ({
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+
({
287295
let _x: Ptr<i32> = (*({
288296
(*({ (*({ (*d.borrow()).get() }).upgrade().deref()).get() })
289297
.upgrade()
@@ -296,10 +304,9 @@ fn main_0() -> i32 {
296304
.as_pointer();
297305
bar_2(_x)
298306
})
299-
.clone();
300-
let __tmp = __ptr.read() + 10;
301-
__ptr.write(__tmp)
302-
};
307+
.read()
308+
+ 10,
309+
);
303310
({
304311
let _x: Ptr<i32> = (*({
305312
(*({ (*({ (*d.borrow()).get() }).upgrade().deref()).get() })
@@ -349,15 +356,18 @@ fn main_0() -> i32 {
349356
ptr_1(_x)
350357
})
351358
.with_mut(|__v| __v.prefix_inc());
352-
{
353-
let __ptr = ({
359+
({
360+
let _x: Ptr<i32> = (x1.as_pointer());
361+
ptr_1(_x)
362+
})
363+
.write(
364+
({
354365
let _x: Ptr<i32> = (x1.as_pointer());
355366
ptr_1(_x)
356367
})
357-
.clone();
358-
let __tmp = __ptr.read() + 1;
359-
__ptr.write(__tmp)
360-
};
368+
.read()
369+
+ 1,
370+
);
361371
({
362372
let _x: Ptr<i32> = ((*({
363373
(*({ (*({ (*d.borrow()).get() }).upgrade().deref()).get() })
@@ -372,8 +382,21 @@ fn main_0() -> i32 {
372382
ptr_1(_x)
373383
})
374384
.with_mut(|__v| __v.prefix_inc());
375-
{
376-
let __ptr = ({
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+
({
377400
let _x: Ptr<i32> = ((*({
378401
(*({ (*({ (*d.borrow()).get() }).upgrade().deref()).get() })
379402
.upgrade()
@@ -386,12 +409,24 @@ fn main_0() -> i32 {
386409
.as_pointer());
387410
ptr_1(_x)
388411
})
389-
.clone();
390-
let __tmp = __ptr.read() + 1;
391-
__ptr.write(__tmp)
392-
};
393-
{
394-
let __ptr = ({
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+
({
395430
let _x: Ptr<i32> = ((*({
396431
(*({ (*({ (*d.borrow()).get() }).upgrade().deref()).get() })
397432
.upgrade()
@@ -404,10 +439,9 @@ fn main_0() -> i32 {
404439
.as_pointer());
405440
ptr_1(_x)
406441
})
407-
.clone();
408-
let __tmp = __ptr.read() + 1;
409-
__ptr.write(__tmp)
410-
};
442+
.read()
443+
+ 1,
444+
);
411445
let ptr1: Value<i32> = Rc::new(RefCell::new(
412446
({
413447
let _x: Ptr<i32> = ((*({

tests/unit/out/refcount/fatorial.rs

Lines changed: 4 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,7 @@ pub fn fatorial_0(n: i32) -> i32 {
1919
}
2020
pub fn fatorial_by_ref_1(n: Ptr<i32>) {
2121
if ((n.read()) == 1) {
22-
{
23-
let __ptr = n.clone();
24-
let __tmp = __ptr.read() * 1;
25-
__ptr.write(__tmp)
26-
};
22+
n.write(n.read() * 1);
2723
return;
2824
}
2925
let n_1: Value<i32> = Rc::new(RefCell::new(((n.read()) - 1)));
@@ -32,20 +28,12 @@ pub fn fatorial_by_ref_1(n: Ptr<i32>) {
3228
fatorial_by_ref_1(_n)
3329
});
3430
let __rhs = (*n_1.borrow());
35-
{
36-
let __ptr = n.clone();
37-
let __tmp = __ptr.read() * __rhs;
38-
__ptr.write(__tmp)
39-
};
31+
n.write(n.read() * __rhs);
4032
}
4133
pub fn fatorial_by_ptr_2(n: Ptr<i32>) {
4234
let n: Value<Ptr<i32>> = Rc::new(RefCell::new(n));
4335
if (((*n.borrow()).read()) == 1) {
44-
{
45-
let __ptr = (*n.borrow()).clone();
46-
let __tmp = __ptr.read() * 1;
47-
__ptr.write(__tmp)
48-
};
36+
(*n.borrow()).write((*n.borrow()).read() * 1);
4937
return;
5038
}
5139
let n_1: Value<i32> = Rc::new(RefCell::new((((*n.borrow()).read()) - 1)));
@@ -54,11 +42,7 @@ pub fn fatorial_by_ptr_2(n: Ptr<i32>) {
5442
fatorial_by_ptr_2(_n)
5543
});
5644
let __rhs = (*n_1.borrow());
57-
{
58-
let __ptr = (*n.borrow()).clone();
59-
let __tmp = __ptr.read() * __rhs;
60-
__ptr.write(__tmp)
61-
};
45+
(*n.borrow()).write((*n.borrow()).read() * __rhs);
6246
}
6347
pub fn main() {
6448
std::process::exit(main_0());

tests/unit/out/refcount/fn_ptr_as_condition.rs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,7 @@ 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-
{
12-
let __ptr = (*x.borrow()).clone();
13-
let __tmp = __ptr.read() * 2;
14-
__ptr.write(__tmp)
15-
};
11+
(*x.borrow()).write((*x.borrow()).read() * 2);
1612
}
1713
pub fn maybe_call_1(cb: FnPtr<fn(Ptr<i32>)>, x: Ptr<i32>) {
1814
let cb: Value<FnPtr<fn(Ptr<i32>)>> = Rc::new(RefCell::new(cb));

tests/unit/out/refcount/foreach_mut.rs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,7 @@ 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-
{
41-
let __ptr = (*p.borrow()).clone();
42-
let __tmp = __ptr.read() + 5;
43-
__ptr.write(__tmp)
44-
};
40+
(*p.borrow()).write((*p.borrow()).read() + 5);
4541
}
4642
'loop_: for p in v2.as_pointer() as Ptr<Ptr<i32>> {
4743
let p: Value<Ptr<i32>> = Rc::new(RefCell::new(p.read().clone()));

tests/unit/out/refcount/pointer_arithmetic.rs

Lines changed: 5 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -12,40 +12,20 @@ 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-
{
16-
let __ptr = (*p.borrow()).clone();
17-
let __tmp = __ptr.read() + 1;
18-
__ptr.write(__tmp)
19-
};
15+
(*p.borrow()).write((*p.borrow()).read() + 1);
2016
if ((*x.borrow()) == 2) {
2117
let a: Value<Box<[i32]>> = Rc::new(RefCell::new(Box::new([1, 2])));
2218
(*p.borrow_mut()) = ((a.as_pointer() as Ptr<i32>).offset(1 as isize));
23-
{
24-
let __ptr = (*p.borrow()).clone();
25-
let __tmp = __ptr.read() + 1;
26-
__ptr.write(__tmp)
27-
};
19+
(*p.borrow()).write((*p.borrow()).read() + 1);
2820
if ((*a.borrow())[(0) as usize] == 1) && ((*a.borrow())[(1) as usize] == 3) {
2921
(*p.borrow_mut()).prefix_dec();
30-
{
31-
let __ptr = (*p.borrow()).clone();
32-
let __tmp = __ptr.read() + 1;
33-
__ptr.write(__tmp)
34-
};
22+
(*p.borrow()).write((*p.borrow()).read() + 1);
3523
if ((*a.borrow())[(0) as usize] == 2) && ((*a.borrow())[(1) as usize] == 3) {
3624
(*p.borrow_mut()) = (x.as_pointer());
37-
{
38-
let __ptr = (*p.borrow()).clone();
39-
let __tmp = __ptr.read() + 1;
40-
__ptr.write(__tmp)
41-
};
25+
(*p.borrow()).write((*p.borrow()).read() + 1);
4226
if ((*x.borrow()) == 3) {
4327
let p2: Value<Ptr<i32>> = Rc::new(RefCell::new((*p.borrow()).clone()));
44-
{
45-
let __ptr = (*p2.borrow()).clone();
46-
let __tmp = __ptr.read() + 1;
47-
__ptr.write(__tmp)
48-
};
28+
(*p2.borrow()).write((*p2.borrow()).read() + 1);
4929
return (((*x.borrow()) == 4) as i32);
5030
}
5131
}

tests/unit/out/refcount/pointer_array.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,8 @@ 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-
{
37-
let __ptr = (*(*s.upgrade().deref()).arr.borrow())[(*i.borrow()) as usize].clone();
38-
let __tmp = __ptr.read() + 1;
39-
__ptr.write(__tmp)
40-
};
36+
(*(*s.upgrade().deref()).arr.borrow())[(*i.borrow()) as usize]
37+
.write((*(*s.upgrade().deref()).arr.borrow())[(*i.borrow()) as usize].read() + 1);
4138
(*i.borrow_mut()).prefix_inc();
4239
}
4340
}

tests/unit/out/refcount/pointers.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -70,11 +70,8 @@ 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-
{
74-
let __ptr = ({ (*(*t3.borrow()).upgrade().deref()).as_ptr() }).clone();
75-
let __tmp = __ptr.read() + 10;
76-
__ptr.write(__tmp)
77-
};
73+
({ (*(*t3.borrow()).upgrade().deref()).as_ptr() })
74+
.write(({ (*(*t3.borrow()).upgrade().deref()).as_ptr() }).read() + 10);
7875
return {
7976
let _lhs = {
8077
let _lhs = (*(*(*t3.borrow()).upgrade().deref()).x.borrow());

0 commit comments

Comments
 (0)