Skip to content

Commit a4e4253

Browse files
authored
fix #1514 variant 3 (#1605)
* fix #1514 variant 3 * fix glitches in the patch * fix temporary variable naming in deallocation
1 parent 61243cf commit a4e4253

2 files changed

Lines changed: 46 additions & 37 deletions

File tree

crates/cpp/src/lib.rs

Lines changed: 41 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -2446,7 +2446,7 @@ impl<'a, 'b> FunctionBindgen<'a, 'b> {
24462446

24472447
fn move_if_necessary(arg: &str) -> String {
24482448
// if it is a name of a variable move it
2449-
if !arg.is_empty() && arg.chars().all(char::is_alphanumeric) {
2449+
if !arg.is_empty() && arg.chars().all(|c| char::is_alphanumeric(c) || c == '_') {
24502450
format!("std::move({arg})")
24512451
} else {
24522452
arg.into()
@@ -2557,9 +2557,9 @@ impl<'a, 'b> Bindgen for FunctionBindgen<'a, 'b> {
25572557
abi::Instruction::BoolFromI32 => top_as("bool"),
25582558
abi::Instruction::ListCanonLower { realloc, .. } => {
25592559
let tmp = self.tmp();
2560-
let val = format!("vec{tmp}");
2561-
let ptr = format!("ptr{tmp}");
2562-
let len = format!("len{tmp}");
2560+
let val = format!("_vec{tmp}");
2561+
let ptr = format!("_ptr{tmp}");
2562+
let len = format!("_len{tmp}");
25632563
self.push_str(&format!("auto&& {} = {};\n", val, operands[0]));
25642564
self.push_str(&format!(
25652565
"auto {} = ({})({}.data());\n",
@@ -2578,9 +2578,9 @@ impl<'a, 'b> Bindgen for FunctionBindgen<'a, 'b> {
25782578
}
25792579
abi::Instruction::StringLower { realloc } => {
25802580
let tmp = self.tmp();
2581-
let val = format!("vec{tmp}");
2582-
let ptr = format!("ptr{tmp}");
2583-
let len = format!("len{tmp}");
2581+
let val = format!("_vec{tmp}");
2582+
let ptr = format!("_ptr{tmp}");
2583+
let len = format!("_len{tmp}");
25842584
self.push_str(&format!("auto&& {} = {};\n", val, operands[0]));
25852585
self.push_str(&format!(
25862586
"auto {} = ({})({}.data());\n",
@@ -2600,9 +2600,9 @@ impl<'a, 'b> Bindgen for FunctionBindgen<'a, 'b> {
26002600
abi::Instruction::ListLower { element, realloc } => {
26012601
let tmp = self.tmp();
26022602
let body = self.blocks.pop().unwrap();
2603-
let val = format!("vec{tmp}");
2604-
let ptr = format!("ptr{tmp}");
2605-
let len = format!("len{tmp}");
2603+
let val = format!("_vec{tmp}");
2604+
let ptr = format!("_ptr{tmp}");
2605+
let len = format!("_len{tmp}");
26062606
let size = self.r#gen.sizes.size(element);
26072607
self.push_str(&format!("auto&& {} = {};\n", val, operands[0]));
26082608
self.push_str(&format!(
@@ -2614,10 +2614,10 @@ impl<'a, 'b> Bindgen for FunctionBindgen<'a, 'b> {
26142614
self.push_str(&format!("auto {len} = (size_t)({val}.size());\n"));
26152615
self.push_str(&format!("for (size_t i = 0; i < {len}; ++i) {{\n"));
26162616
self.push_str(&format!(
2617-
"auto base = {ptr} + i * {size};\n",
2617+
"auto _base = {ptr} + i * {size};\n",
26182618
size = size.format(POINTER_SIZE_EXPRESSION)
26192619
));
2620-
self.push_str(&format!("auto&& iter_elem = {val}[i];\n"));
2620+
self.push_str(&format!("auto&& _iter_elem = {val}[i];\n"));
26212621
self.push_str(&format!("{}\n", body.0));
26222622
self.push_str("}\n");
26232623
if realloc.is_none() {
@@ -2630,7 +2630,7 @@ impl<'a, 'b> Bindgen for FunctionBindgen<'a, 'b> {
26302630
}
26312631
abi::Instruction::ListCanonLift { element, .. } => {
26322632
let tmp = self.tmp();
2633-
let len = format!("len{tmp}");
2633+
let len = format!("_len{tmp}");
26342634
let inner = self
26352635
.r#gen
26362636
.type_name(element, &self.namespace, Flavor::InStruct);
@@ -2649,7 +2649,7 @@ impl<'a, 'b> Bindgen for FunctionBindgen<'a, 'b> {
26492649
}
26502650
abi::Instruction::StringLift => {
26512651
let tmp = self.tmp();
2652-
let len = format!("len{tmp}");
2652+
let len = format!("_len{tmp}");
26532653
uwriteln!(self.src, "auto {} = {};\n", len, operands[1]);
26542654
let result = if self.r#gen.r#gen.opts.api_style == APIStyle::Symmetric
26552655
&& matches!(self.variant, AbiVariant::GuestExport)
@@ -2679,9 +2679,9 @@ impl<'a, 'b> Bindgen for FunctionBindgen<'a, 'b> {
26792679
Flavor::InStruct
26802680
};
26812681
let vtype = self.r#gen.type_name(element, &self.namespace, flavor);
2682-
let len = format!("len{tmp}");
2683-
let base = format!("base{tmp}");
2684-
let result = format!("result{tmp}");
2682+
let len = format!("_len{tmp}");
2683+
let base = format!("_base{tmp}");
2684+
let result = format!("_result{tmp}");
26852685
self.push_str(&format!(
26862686
"auto {base} = {operand0};\n",
26872687
operand0 = operands[0]
@@ -2705,17 +2705,21 @@ impl<'a, 'b> Bindgen for FunctionBindgen<'a, 'b> {
27052705
uwriteln!(self.src, "for (unsigned i=0; i<{len}; ++i) {{");
27062706
uwriteln!(
27072707
self.src,
2708-
"auto base = {base} + i * {size};",
2708+
"auto _base = {base} + i * {size};",
27092709
size = size.format(POINTER_SIZE_EXPRESSION)
27102710
);
27112711
uwrite!(self.src, "{}", body.0);
2712-
uwriteln!(self.src, "auto e{tmp} = {};", move_if_necessary(&body.1[0]));
2712+
uwriteln!(
2713+
self.src,
2714+
"auto _e{tmp} = {};",
2715+
move_if_necessary(&body.1[0])
2716+
);
27132717
if let Some(code) = self.leak_on_insertion.take() {
27142718
assert!(self.needs_dealloc);
27152719
uwriteln!(self.src, "{code}");
27162720
}
27172721
// inplace construct
2718-
uwriteln!(self.src, "{result}.initialize(i, std::move(e{tmp}));");
2722+
uwriteln!(self.src, "{result}.initialize(i, std::move(_e{tmp}));");
27192723
uwriteln!(self.src, "}}");
27202724

27212725
if self.r#gen.r#gen.opts.api_style == APIStyle::Symmetric
@@ -2739,7 +2743,7 @@ impl<'a, 'b> Bindgen for FunctionBindgen<'a, 'b> {
27392743
id: _,
27402744
} => {
27412745
let tmp = self.tmp();
2742-
let result = format!("result{tmp}");
2746+
let result = format!("_result{tmp}");
27432747
let typename = self
27442748
.r#gen
27452749
.type_name(element, &self.namespace, Flavor::InStruct);
@@ -2758,7 +2762,7 @@ impl<'a, 'b> Bindgen for FunctionBindgen<'a, 'b> {
27582762
} => {
27592763
let body = self.blocks.pop().unwrap();
27602764
let tmp = self.tmp();
2761-
let vec = format!("array{tmp}");
2765+
let vec = format!("_array{tmp}");
27622766
let source = operands[0].clone();
27632767
let size = self.r#gen.sizes.size(element);
27642768
let size_str = size.format(POINTER_SIZE_EXPRESSION);
@@ -2769,12 +2773,12 @@ impl<'a, 'b> Bindgen for FunctionBindgen<'a, 'b> {
27692773
self.push_str(&format!("std::array<{typename}, {elemsize}> {vec};\n"));
27702774
self.push_str(&format!(
27712775
"{{
2772-
{ptr_type} outer_base = {source};\n"
2776+
{ptr_type} _outer_base = {source};\n"
27732777
));
2774-
let source: String = "outer_base".into();
2778+
let source: String = "_outer_base".into();
27752779
// let vec: String = "outer_vec".into();
27762780
self.push_str(&format!("for (unsigned i = 0; i<{elemsize}; ++i) {{\n",));
2777-
self.push_str(&format!("{ptr_type} base = {source} + i * {size_str};\n"));
2781+
self.push_str(&format!("{ptr_type} _base = {source} + i * {size_str};\n"));
27782782
self.push_str(&body.0);
27792783
self.push_str(&format!("{vec}[i] = {};", body.1[0]));
27802784
self.push_str("\n}\n}\n");
@@ -2805,23 +2809,23 @@ impl<'a, 'b> Bindgen for FunctionBindgen<'a, 'b> {
28052809
let ptr_type = self.r#gen.r#gen.opts.ptr_type();
28062810
self.push_str(&format!(
28072811
"{{
2808-
{ptr_type} outer_base = {target};\n"
2812+
{ptr_type} _outer_base = {target};\n"
28092813
));
2810-
let target: String = "outer_base".into();
2814+
let target: String = "_outer_base".into();
28112815
self.push_str(&format!(
2812-
"std::array<{typename}, {elemsize}>& outer_vec = {vec};\n"
2816+
"std::array<{typename}, {elemsize}>& _outer_vec = {vec};\n"
28132817
));
2814-
let vec: String = "outer_vec".into();
2818+
let vec: String = "_outer_vec".into();
28152819
self.push_str(&format!("for (unsigned i = 0; i<{vec}.size(); ++i) {{\n",));
28162820
self.push_str(&format!(
2817-
"{ptr_type} base = {target} + i * {size_str};
2818-
{typename}& iter_elem = {vec}[i];\n"
2821+
"{ptr_type} _base = {target} + i * {size_str};
2822+
{typename}& _iter_elem = {vec}[i];\n"
28192823
));
28202824
self.push_str(&body.0);
28212825
self.push_str("\n}\n}\n");
28222826
}
2823-
abi::Instruction::IterElem { .. } => results.push("iter_elem".to_string()),
2824-
abi::Instruction::IterBasePointer => results.push("base".to_string()),
2827+
abi::Instruction::IterElem { .. } => results.push("_iter_elem".to_string()),
2828+
abi::Instruction::IterBasePointer => results.push("_base".to_string()),
28252829
abi::Instruction::RecordLower { record, .. } => {
28262830
let op = &operands[0];
28272831
for f in record.fields.iter() {
@@ -3478,19 +3482,19 @@ impl<'a, 'b> Bindgen for FunctionBindgen<'a, 'b> {
34783482
let (body, results) = self.blocks.pop().unwrap();
34793483
assert!(results.is_empty());
34803484
let tmp = self.tmp();
3481-
let ptr = self.tempname("ptr", tmp);
3482-
let len = self.tempname("len", tmp);
3485+
let ptr = self.tempname("_ptr", tmp);
3486+
let len = self.tempname("_len", tmp);
34833487
uwriteln!(self.src, "uint8_t* {ptr} = {};", operands[0]);
34843488
uwriteln!(self.src, "size_t {len} = {};", operands[1]);
34853489
let i = self.tempname("i", tmp);
34863490
uwriteln!(self.src, "for (size_t {i} = 0; {i} < {len}; {i}++) {{");
34873491
let size = self.r#gen.sizes.size(element);
34883492
uwriteln!(
34893493
self.src,
3490-
"uint8_t* base = {ptr} + {i} * {size};",
3494+
"uint8_t* _base = {ptr} + {i} * {size};",
34913495
size = size.format(POINTER_SIZE_EXPRESSION)
34923496
);
3493-
uwriteln!(self.src, "(void) base;");
3497+
uwriteln!(self.src, "(void) _base;");
34943498
uwrite!(self.src, "{body}");
34953499
uwriteln!(self.src, "}}");
34963500
uwriteln!(self.src, "if ({len} > 0) {{");

tests/codegen/issue1514-3.wit

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package demo:poc;
2+
3+
world w {
4+
import foo: func(ptr0: string) -> u32;
5+
}

0 commit comments

Comments
 (0)