@@ -2826,16 +2826,13 @@ of component-level values with types `ts`.
28262826def lift_flat_values (cx , max_flat , vi , ts ):
28272827 flat_types = flatten_types(ts)
28282828 if len (flat_types) > max_flat:
2829- return lift_heap_values(cx, vi, ts)
2829+ ptr = vi.next(' i32' )
2830+ tuple_type = TupleType(ts)
2831+ trap_if(ptr != align_to(ptr, alignment(tuple_type)))
2832+ trap_if(ptr + elem_size(tuple_type) > len (cx.opts.memory))
2833+ return list (load(cx, ptr, tuple_type).values())
28302834 else :
28312835 return [ lift_flat(cx, vi, t) for t in ts ]
2832-
2833- def lift_heap_values (cx , vi , ts ):
2834- ptr = vi.next(' i32' )
2835- tuple_type = TupleType(ts)
2836- trap_if(ptr != align_to(ptr, alignment(tuple_type)))
2837- trap_if(ptr + elem_size(tuple_type) > len (cx.opts.memory))
2838- return list (load(cx, ptr, tuple_type).values())
28392836```
28402837
28412838Symmetrically, the ` lower_flat_values ` function defines how to lower a
@@ -2849,27 +2846,23 @@ def lower_flat_values(cx, max_flat, vs, ts, out_param = None):
28492846 cx.inst.may_leave = False
28502847 flat_types = flatten_types(ts)
28512848 if len (flat_types) > max_flat:
2852- flat_vals = lower_heap_values(cx, vs, ts, out_param)
2849+ tuple_type = TupleType(ts)
2850+ tuple_value = {str (i): v for i,v in enumerate (vs)}
2851+ if out_param is None :
2852+ ptr = cx.opts.realloc(0 , 0 , alignment(tuple_type), elem_size(tuple_type))
2853+ flat_vals = [ptr]
2854+ else :
2855+ ptr = out_param.next(' i32' )
2856+ flat_vals = []
2857+ trap_if(ptr != align_to(ptr, alignment(tuple_type)))
2858+ trap_if(ptr + elem_size(tuple_type) > len (cx.opts.memory))
2859+ store(cx, tuple_value, tuple_type, ptr)
28532860 else :
28542861 flat_vals = []
28552862 for i in range (len (vs)):
28562863 flat_vals += lower_flat(cx, vs[i], ts[i])
28572864 cx.inst.may_leave = True
28582865 return flat_vals
2859-
2860- def lower_heap_values (cx , vs , ts , out_param ):
2861- tuple_type = TupleType(ts)
2862- tuple_value = {str (i): v for i,v in enumerate (vs)}
2863- if out_param is None :
2864- ptr = cx.opts.realloc(0 , 0 , alignment(tuple_type), elem_size(tuple_type))
2865- flat_vals = [ptr]
2866- else :
2867- ptr = out_param.next(' i32' )
2868- flat_vals = []
2869- trap_if(ptr != align_to(ptr, alignment(tuple_type)))
2870- trap_if(ptr + elem_size(tuple_type) > len (cx.opts.memory))
2871- store(cx, tuple_value, tuple_type, ptr)
2872- return flat_vals
28732866```
28742867The ` may_leave ` flag is guarded by ` canon_lower ` below to prevent a component
28752868from calling out of the component while in the middle of lowering, ensuring
0 commit comments