@@ -2135,19 +2135,7 @@ where
21352135 ty : InterfaceType ,
21362136 dst : & mut MaybeUninit < [ ValRaw ; 2 ] > ,
21372137 ) -> Result < ( ) > {
2138- let ( key_ty, value_ty) = match ty {
2139- InterfaceType :: Map ( i) => {
2140- let m = & cx. types [ i] ;
2141- ( m. key , m. value )
2142- }
2143- _ => bad_type_info ( ) ,
2144- } ;
2145- let ( ptr, len) = lower_map_iter ( cx, key_ty, value_ty, self . len ( ) , self . iter ( ) ) ?;
2146- // See "WRITEPTR64" above for why this is always storing a 64-bit
2147- // integer.
2148- map_maybe_uninit ! ( dst[ 0 ] ) . write ( ValRaw :: i64 ( ptr as i64 ) ) ;
2149- map_maybe_uninit ! ( dst[ 1 ] ) . write ( ValRaw :: i64 ( len as i64 ) ) ;
2150- Ok ( ( ) )
2138+ linear_lower_map_to_flat ( cx, ty, self . len ( ) , self . iter ( ) , dst)
21512139 }
21522140
21532141 fn linear_lower_to_memory < U > (
@@ -2156,18 +2144,7 @@ where
21562144 ty : InterfaceType ,
21572145 offset : usize ,
21582146 ) -> Result < ( ) > {
2159- let ( key_ty, value_ty) = match ty {
2160- InterfaceType :: Map ( i) => {
2161- let m = & cx. types [ i] ;
2162- ( m. key , m. value )
2163- }
2164- _ => bad_type_info ( ) ,
2165- } ;
2166- debug_assert ! ( offset % ( Self :: ALIGN32 as usize ) == 0 ) ;
2167- let ( ptr, len) = lower_map_iter ( cx, key_ty, value_ty, self . len ( ) , self . iter ( ) ) ?;
2168- * cx. get ( offset + 0 ) = u32:: try_from ( ptr) . unwrap ( ) . to_le_bytes ( ) ;
2169- * cx. get ( offset + 4 ) = u32:: try_from ( len) . unwrap ( ) . to_le_bytes ( ) ;
2170- Ok ( ( ) )
2147+ linear_lower_map_to_memory ( cx, ty, self . len ( ) , self . iter ( ) , offset)
21712148 }
21722149}
21732150
@@ -2207,6 +2184,56 @@ where
22072184 Ok ( ( ptr, len) )
22082185}
22092186
2187+ fn linear_lower_map_to_flat < ' a , K , V , U > (
2188+ cx : & mut LowerContext < ' _ , U > ,
2189+ ty : InterfaceType ,
2190+ len : usize ,
2191+ iter : impl Iterator < Item = ( & ' a K , & ' a V ) > ,
2192+ dst : & mut MaybeUninit < [ ValRaw ; 2 ] > ,
2193+ ) -> Result < ( ) >
2194+ where
2195+ K : Lower + ' a ,
2196+ V : Lower + ' a ,
2197+ {
2198+ let ( key_ty, value_ty) = match ty {
2199+ InterfaceType :: Map ( i) => {
2200+ let m = & cx. types [ i] ;
2201+ ( m. key , m. value )
2202+ }
2203+ _ => bad_type_info ( ) ,
2204+ } ;
2205+ let ( ptr, len) = lower_map_iter ( cx, key_ty, value_ty, len, iter) ?;
2206+ // See "WRITEPTR64" above for why this is always storing a 64-bit integer.
2207+ map_maybe_uninit ! ( dst[ 0 ] ) . write ( ValRaw :: i64 ( ptr as i64 ) ) ;
2208+ map_maybe_uninit ! ( dst[ 1 ] ) . write ( ValRaw :: i64 ( len as i64 ) ) ;
2209+ Ok ( ( ) )
2210+ }
2211+
2212+ fn linear_lower_map_to_memory < ' a , K , V , U > (
2213+ cx : & mut LowerContext < ' _ , U > ,
2214+ ty : InterfaceType ,
2215+ len : usize ,
2216+ iter : impl Iterator < Item = ( & ' a K , & ' a V ) > ,
2217+ offset : usize ,
2218+ ) -> Result < ( ) >
2219+ where
2220+ K : Lower + ' a ,
2221+ V : Lower + ' a ,
2222+ {
2223+ let ( key_ty, value_ty) = match ty {
2224+ InterfaceType :: Map ( i) => {
2225+ let m = & cx. types [ i] ;
2226+ ( m. key , m. value )
2227+ }
2228+ _ => bad_type_info ( ) ,
2229+ } ;
2230+ debug_assert ! ( offset % ( CanonicalAbiInfo :: POINTER_PAIR . align32 as usize ) == 0 ) ;
2231+ let ( ptr, len) = lower_map_iter ( cx, key_ty, value_ty, len, iter) ?;
2232+ * cx. get ( offset + 0 ) = u32:: try_from ( ptr) . unwrap ( ) . to_le_bytes ( ) ;
2233+ * cx. get ( offset + 4 ) = u32:: try_from ( len) . unwrap ( ) . to_le_bytes ( ) ;
2234+ Ok ( ( ) )
2235+ }
2236+
22102237#[ cfg( not( feature = "std" ) ) ]
22112238unsafe impl < K , V > Lift for HashMap < K , V >
22122239where
@@ -2350,19 +2377,7 @@ where
23502377 ty : InterfaceType ,
23512378 dst : & mut MaybeUninit < [ ValRaw ; 2 ] > ,
23522379 ) -> Result < ( ) > {
2353- let ( key_ty, value_ty) = match ty {
2354- InterfaceType :: Map ( i) => {
2355- let m = & cx. types [ i] ;
2356- ( m. key , m. value )
2357- }
2358- _ => bad_type_info ( ) ,
2359- } ;
2360- let ( ptr, len) = lower_map_iter ( cx, key_ty, value_ty, self . len ( ) , self . iter ( ) ) ?;
2361- // See "WRITEPTR64" above for why this is always storing a 64-bit
2362- // integer.
2363- map_maybe_uninit ! ( dst[ 0 ] ) . write ( ValRaw :: i64 ( ptr as i64 ) ) ;
2364- map_maybe_uninit ! ( dst[ 1 ] ) . write ( ValRaw :: i64 ( len as i64 ) ) ;
2365- Ok ( ( ) )
2380+ linear_lower_map_to_flat ( cx, ty, self . len ( ) , self . iter ( ) , dst)
23662381 }
23672382
23682383 fn linear_lower_to_memory < U > (
@@ -2371,18 +2386,7 @@ where
23712386 ty : InterfaceType ,
23722387 offset : usize ,
23732388 ) -> Result < ( ) > {
2374- let ( key_ty, value_ty) = match ty {
2375- InterfaceType :: Map ( i) => {
2376- let m = & cx. types [ i] ;
2377- ( m. key , m. value )
2378- }
2379- _ => bad_type_info ( ) ,
2380- } ;
2381- debug_assert ! ( offset % ( Self :: ALIGN32 as usize ) == 0 ) ;
2382- let ( ptr, len) = lower_map_iter ( cx, key_ty, value_ty, self . len ( ) , self . iter ( ) ) ?;
2383- * cx. get ( offset + 0 ) = u32:: try_from ( ptr) . unwrap ( ) . to_le_bytes ( ) ;
2384- * cx. get ( offset + 4 ) = u32:: try_from ( len) . unwrap ( ) . to_le_bytes ( ) ;
2385- Ok ( ( ) )
2389+ linear_lower_map_to_memory ( cx, ty, self . len ( ) , self . iter ( ) , offset)
23862390 }
23872391}
23882392
0 commit comments