Skip to content

Commit a7c386c

Browse files
committed
integrate changes from symmetric branch
1 parent 1340c98 commit a7c386c

9 files changed

Lines changed: 210 additions & 30 deletions

File tree

Cargo.lock

Lines changed: 25 additions & 10 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/core/src/abi.rs

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -325,7 +325,7 @@ def_instruction! {
325325
} : [1] => [*size as usize],
326326

327327
/// Pops an array and an address off the stack, passes each element to a block storing it
328-
FixedSizeListLowerBlock {
328+
FixedSizeListLowerMemory {
329329
element: &'a Type,
330330
size: u32,
331331
id: TypeId,
@@ -862,7 +862,7 @@ fn needs_deallocate(resolve: &Resolve, ty: &Type, what: Deallocate) -> bool {
862862
TypeDefKind::Flags(_) | TypeDefKind::Enum(_) => false,
863863
TypeDefKind::Future(_) | TypeDefKind::Stream(_) => what.handles(),
864864
TypeDefKind::Unknown => unreachable!(),
865-
TypeDefKind::FixedSizeList(..) => todo!(),
865+
TypeDefKind::FixedSizeList(t, _) => needs_deallocate(resolve, t, what),
866866
},
867867

868868
Type::Bool
@@ -1772,16 +1772,15 @@ impl<'a, B: Bindgen> Generator<'a, B> {
17721772
}
17731773
TypeDefKind::Unknown => unreachable!(),
17741774
TypeDefKind::FixedSizeList(ty, size) => {
1775-
let mut temp = Vec::new();
1776-
self.resolve.push_flat(&Type::Id(id), &mut temp);
1777-
let mut args = self
1775+
let temp = flat_types(self.resolve, ty).unwrap();
1776+
let flat_per_elem = temp.to_vec().len();
1777+
let flatsize = flat_per_elem * (*size as usize);
1778+
let mut lowered_args = self
17781779
.stack
1779-
.drain(self.stack.len() - temp.len()..)
1780+
.drain(self.stack.len() - flatsize..)
17801781
.collect::<Vec<_>>();
17811782
for _ in 0..*size {
1782-
temp.truncate(0);
1783-
self.resolve.push_flat(ty, &mut temp);
1784-
self.stack.extend(args.drain(..temp.len()));
1783+
self.stack.extend(lowered_args.drain(..flat_per_elem));
17851784
self.lift(ty);
17861785
}
17871786
self.emit(&FixedSizeListLift {
@@ -1977,10 +1976,10 @@ impl<'a, B: Bindgen> Generator<'a, B> {
19771976
self.emit(&IterElem { element });
19781977
self.emit(&IterBasePointer);
19791978
let elem_addr = self.stack.pop().unwrap();
1980-
self.write_to_memory(element, elem_addr, Default::default());
1979+
self.write_to_memory(element, elem_addr, offset);
19811980
self.finish_block(0);
19821981
self.stack.push(addr);
1983-
self.emit(&FixedSizeListLowerBlock {
1982+
self.emit(&FixedSizeListLowerMemory {
19841983
element,
19851984
size: *size,
19861985
id,

crates/cpp/src/lib.rs

Lines changed: 63 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ struct Includes {
7474
// needs wit types
7575
needs_wit: bool,
7676
needs_memory: bool,
77+
needs_array: bool,
7778
}
7879

7980
#[derive(Default)]
@@ -415,6 +416,9 @@ impl Cpp {
415416
if self.dependencies.needs_memory {
416417
self.include("<memory>");
417418
}
419+
if self.dependencies.needs_array {
420+
self.include("<array>");
421+
}
418422
if self.dependencies.needs_bit {
419423
self.include("<bit>");
420424
}
@@ -1667,7 +1671,13 @@ impl CppInterfaceGenerator<'_> {
16671671
TypeDefKind::Future(_) => todo!(),
16681672
TypeDefKind::Stream(_) => todo!(),
16691673
TypeDefKind::Type(ty) => self.type_name(ty, from_namespace, flavor),
1670-
TypeDefKind::FixedSizeList(_, _) => todo!(),
1674+
TypeDefKind::FixedSizeList(ty, size) => {
1675+
self.r#gen.dependencies.needs_array = true;
1676+
format!(
1677+
"std::array<{}, {size}>",
1678+
self.type_name(ty, from_namespace, flavor)
1679+
)
1680+
}
16711681
TypeDefKind::Unknown => todo!(),
16721682
},
16731683
Type::ErrorContext => todo!(),
@@ -2616,7 +2626,57 @@ impl<'a, 'b> Bindgen for FunctionBindgen<'a, 'b> {
26162626
results.push(move_if_necessary(&result));
26172627
}
26182628
}
2619-
abi::Instruction::IterElem { .. } => results.push("IterElem".to_string()),
2629+
abi::Instruction::FixedSizeListLift {
2630+
element,
2631+
size,
2632+
id: _,
2633+
} => {
2634+
let tmp = self.tmp();
2635+
let result = format!("result{tmp}");
2636+
let typename = self
2637+
.r#gen
2638+
.type_name(element, &self.namespace, Flavor::InStruct);
2639+
self.push_str(&format!("std::array<{typename}, {size}> {result} = {{",));
2640+
for a in operands.drain(0..(*size as usize)) {
2641+
self.push_str(&a);
2642+
self.push_str(", ");
2643+
}
2644+
self.push_str("};\n");
2645+
results.push(result);
2646+
}
2647+
abi::Instruction::FixedSizeListLower { .. } => todo!(),
2648+
abi::Instruction::FixedSizeListLowerMemory {
2649+
element,
2650+
size: elemsize,
2651+
id: _,
2652+
} => {
2653+
let body = self.blocks.pop().unwrap();
2654+
let vec = operands[0].clone();
2655+
let target = operands[1].clone();
2656+
let size = self.r#gen.sizes.size(element);
2657+
let size_str = size.format(POINTER_SIZE_EXPRESSION);
2658+
let typename = self
2659+
.r#gen
2660+
.type_name(element, &self.namespace, Flavor::InStruct);
2661+
let ptr_type = self.r#gen.r#gen.opts.ptr_type();
2662+
self.push_str(&format!(
2663+
"{{
2664+
{ptr_type} outer_base = {target};\n"
2665+
));
2666+
let target: String = "outer_base".into();
2667+
self.push_str(&format!(
2668+
"std::array<{typename}, {elemsize}>& outer_vec = {vec};\n"
2669+
));
2670+
let vec: String = "outer_vec".into();
2671+
self.push_str(&format!("for (unsigned i = 0; i<{vec}.size(); ++i) {{\n",));
2672+
self.push_str(&format!(
2673+
"{ptr_type} base = {target} + i * {size_str};
2674+
{typename}& iter_elem = {vec}[i];\n"
2675+
));
2676+
self.push_str(&body.0);
2677+
self.push_str("\n}\n}\n");
2678+
}
2679+
abi::Instruction::IterElem { .. } => results.push("iter_elem".to_string()),
26202680
abi::Instruction::IterBasePointer => results.push("base".to_string()),
26212681
abi::Instruction::RecordLower { record, .. } => {
26222682
let op = &operands[0];
@@ -3222,7 +3282,7 @@ impl<'a, 'b> Bindgen for FunctionBindgen<'a, 'b> {
32223282
self.src.push_str(">(");
32233283
}
32243284
if *amt == 1 {
3225-
if operands[0].starts_with("std::move(") {
3285+
if operands[0].starts_with("std::move(") && !operands[0].contains('.') {
32263286
// remove the std::move due to return value optimization (and complex rules about when std::move harms)
32273287
self.src.push_str(&operands[0][9..]);
32283288
} else {

crates/moonbit/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2698,7 +2698,7 @@ impl Bindgen for FunctionBindgen<'_, '_> {
26982698
| Instruction::DropHandle { .. } => todo!(),
26992699
Instruction::FixedSizeListLift { .. } => todo!(),
27002700
Instruction::FixedSizeListLower { .. } => todo!(),
2701-
Instruction::FixedSizeListLowerBlock { .. } => todo!(),
2701+
Instruction::FixedSizeListLowerMemory { .. } => todo!(),
27022702
}
27032703
}
27042704

crates/rust/src/bindgen.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -784,7 +784,7 @@ impl Bindgen for FunctionBindgen<'_, '_> {
784784
results.push(len);
785785
}
786786

787-
Instruction::FixedSizeListLowerBlock {
787+
Instruction::FixedSizeListLowerMemory {
788788
element,
789789
size: _,
790790
id: _,

tests/runtime/fixed-size-list/runner.rs

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,12 @@ fn main() {
1313
assert_eq!(result, [b'0', b'1', b'A', b'B', b'a', b'b', 128, 255]);
1414
}
1515
{
16-
let _result = list_minmax16([0, 1024, 32768, 65535], [1, 2048, -32767, -2]);
17-
// assert_eq!(result, ([0, 1024, 32768, 65535], [1, 2048, -32767, -2]));
16+
let result = list_minmax16([0, 1024, 32768, 65535], [1, 2048, -32767, -2]);
17+
assert_eq!(result, ([0, 1024, 32768, 65535], [1, 2048, -32767, -2]));
1818
}
1919
{
20-
let _result = list_minmax_float([2.0, -42.0], [0.25, -0.125]);
21-
// assert_eq!(result, ([2.0, -42.0], [0.25, -0.125]));
20+
let result = list_minmax_float([2.0, -42.0], [0.25, -0.125]);
21+
assert_eq!(result, ([2.0, -42.0], [0.25, -0.125]));
2222
}
2323
{
2424
let result = list_roundtrip([b'a', b'b', b'c', b'd', 0, 1, 2, 3, b'A', b'B', b'Y', b'Z']);
@@ -27,4 +27,39 @@ fn main() {
2727
[b'a', b'b', b'c', b'd', 0, 1, 2, 3, b'A', b'B', b'Y', b'Z']
2828
);
2929
}
30+
{
31+
let result = nested_roundtrip([[1, 5], [42, 1_000_000]], [[-1, 3], [-2_000_000, 4711]]);
32+
assert_eq!(
33+
result,
34+
([[1, 5], [42, 1_000_000]], [[-1, 3], [-2_000_000, 4711]])
35+
);
36+
}
37+
{
38+
let result = large_roundtrip(
39+
[[1, 5], [42, 1_000_000]],
40+
[
41+
[-1, 3, -2, 4],
42+
[-2_000_000, 4711, 99_999, -5],
43+
[-6, 7, 8, -9],
44+
[50, -5, 500, -5000],
45+
],
46+
);
47+
assert_eq!(
48+
result,
49+
(
50+
[[1, 5], [42, 1_000_000]],
51+
[
52+
[-1, 3, -2, 4],
53+
[-2_000_000, 4711, 99_999, -5],
54+
[-6, 7, 8, -9],
55+
[50, -5, 500, -5000]
56+
]
57+
)
58+
);
59+
}
60+
{
61+
let result = nightmare_on_cpp([Nested { l: [1, -1] }, Nested { l: [2, -2] }]);
62+
assert_eq!(result[0].l, [1, -1]);
63+
assert_eq!(result[1].l, [2, -2]);
64+
}
3065
}

0 commit comments

Comments
 (0)