MCPcopy Create free account
hub / github.com/bytecodealliance/wit-bindgen / return_pointer

Method return_pointer

crates/csharp/src/function.rs:1954–2016  ·  view source on GitHub ↗
(&mut self, size: ArchitectureSize, align: Alignment)

Source from the content-addressed store, hash-verified

1952 }
1953
1954 fn return_pointer(&mut self, size: ArchitectureSize, align: Alignment) -> String {
1955 let ptr = self.locals.tmp("ptr");
1956
1957 match self.interface_gen.direction {
1958 Direction::Import => {
1959 self.import_return_pointer_area_size =
1960 self.import_return_pointer_area_size.max(size.size_wasm32());
1961 self.import_return_pointer_area_align = self
1962 .import_return_pointer_area_align
1963 .max(align.align_wasm32());
1964 let (array_size, element_type) = crate::world_generator::dotnet_aligned_array(
1965 self.import_return_pointer_area_size,
1966 self.import_return_pointer_area_align,
1967 );
1968 let ret_area = self.locals.tmp("retArea");
1969 // We can use the stack here to get a return pointer when importing.
1970 // We do need to do a slight over-allocation since C# doesn't provide a way
1971 // to align the allocation via the stackalloc command, unlike with a fixed array where the pointer will be aligned.
1972 // We get the final ptr to pass to the wasm runtime by shifting to the
1973 // correctly aligned pointer (sometimes it can be already aligned).
1974 let array_size = if self.import_return_pointer_area_align > 1 {
1975 // Add one additional element in case the starting address is not aligned
1976 array_size + 1
1977 } else {
1978 array_size
1979 };
1980
1981 self.interface_gen.csharp_gen.needs_align_stack_ptr = true;
1982 uwrite!(
1983 self.src,
1984 "
1985 var {ret_area} = stackalloc {element_type}[{array_size}];
1986 var {ptr} = (nint)MemoryHelper.AlignStackPtr({ret_area}, {align});
1987 ",
1988 align = align.align_wasm32()
1989 );
1990 ptr
1991 }
1992 Direction::Export => {
1993 // exports need their return area to be live until the post-return call.
1994 self.interface_gen.csharp_gen.return_area_size = self
1995 .interface_gen
1996 .csharp_gen
1997 .return_area_size
1998 .max(size.size_wasm32());
1999 self.interface_gen.csharp_gen.return_area_align = self
2000 .interface_gen
2001 .csharp_gen
2002 .return_area_align
2003 .max(align.align_wasm32());
2004
2005 uwrite!(
2006 self.src,
2007 "
2008 var {ptr} = InteropReturnArea.returnArea.AddressOfReturnArea();
2009 "
2010 );
2011 self.interface_gen.csharp_gen.needs_export_return_area = true;

Callers

nothing calls this directly

Calls 2

dotnet_aligned_arrayFunction · 0.85
tmpMethod · 0.45

Tested by

no test coverage detected