Skip to content

Commit cae738d

Browse files
authored
Use stack when the list is smaller than a given value (#1144)
Signed-off-by: James Sturtevant <jsturtevant@gmail.com>
1 parent b19ef10 commit cae738d

File tree

1 file changed

+17
-3
lines changed

1 file changed

+17
-3
lines changed

crates/csharp/src/function.rs

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -853,13 +853,27 @@ impl Bindgen for FunctionBindgen<'_, '_> {
853853
//TODO: wasm64
854854
let align = self.interface_gen.csharp_gen.sizes.align(element).align_wasm32();
855855

856+
let (array_size, element_type) = crate::world_generator::dotnet_aligned_array(
857+
size,
858+
align,
859+
);
860+
let ret_area = self.locals.tmp("retArea");
861+
856862
self.needs_cleanup = true;
857863
uwrite!(
858864
self.src,
859865
"
860-
var {buffer_size} = {size} * (nuint){list}.Count;
861-
var {address} = NativeMemory.AlignedAlloc({buffer_size}, {align});
862-
cleanups.Add(()=> NativeMemory.AlignedFree({address}));
866+
void* {address};
867+
if (({size} * {list}.Count) < 1024) {{
868+
var {ret_area} = stackalloc {element_type}[({array_size}*{list}.Count)+1];
869+
{address} = (void*)(((int){ret_area}) + ({align} - 1) & -{align});
870+
}}
871+
else
872+
{{
873+
var {buffer_size} = {size} * (nuint){list}.Count;
874+
{address} = NativeMemory.AlignedAlloc({buffer_size}, {align});
875+
cleanups.Add(()=> NativeMemory.AlignedFree({address}));
876+
}}
863877
864878
for (int {index} = 0; {index} < {list}.Count; ++{index}) {{
865879
{ty} {block_element} = {list}[{index}];

0 commit comments

Comments
 (0)