(&mut self, size: ArchitectureSize, align: Alignment)
| 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; |
nothing calls this directly
no test coverage detected