@@ -18,9 +18,9 @@ use crate::hashmap::{IndexMap, IndexSet};
1818use crate :: ast:: Type ;
1919use crate :: cm_abi;
2020use crate :: component_model:: { CmVariantCase , WasiFunctionInfo , WasiRegistry } ;
21+ use crate :: name:: LocalMethodName ;
2122use crate :: name:: ModuleSource ;
2223use crate :: project:: Project ;
23- use crate :: name:: LocalMethodName ;
2424use crate :: tir:: {
2525 CallArg , FunctionRef , InlineHint , MonomorphInfo , TirBinaryOp , TirBlock , TirExpr , TirExprKind ,
2626 TirFunction , TirParam , TirStmt , TirStmtKind , TypeId , TypeTable ,
@@ -5421,7 +5421,7 @@ pub fn generate_adapters(mut project: Project) -> Result<Project, String> {
54215421 Ok ( project)
54225422}
54235423
5424- /// Generate binding functions for Stream<T>.read() where T is a non-u8 WASI record type.
5424+ /// Generate binding functions for Stream<T>.` read()` where T is a non-u8 WASI record type.
54255425///
54265426/// For each unique stream element type T found in stream-read calls, generates a
54275427/// TIR function `__cm_stream_read_<T>` that:
@@ -5574,22 +5574,22 @@ fn find_record_stream_reads_in_expr(
55745574 } ;
55755575 if cm_name. as_deref ( ) == Some ( "stream-read" ) && !is_u8_array_type ( expr. type_id , tt) {
55765576 // Extract element type from Array<T>
5577- if let Some ( type_args) = tt. generic_type_args ( expr. type_id ) {
5578- if let Some ( & elem_type_id) = type_args. first ( ) {
5579- let elem_name = tt . base_type_name ( elem_type_id ) ;
5580- results
5581- . entry ( elem_name )
5582- . or_insert ( ( elem_type_id , expr . type_id ) ) ;
5583- }
5577+ if let Some ( type_args) = tt. generic_type_args ( expr. type_id )
5578+ && let Some ( & elem_type_id) = type_args. first ( )
5579+ {
5580+ let elem_name = tt . base_type_name ( elem_type_id ) ;
5581+ results
5582+ . entry ( elem_name )
5583+ . or_insert ( ( elem_type_id , expr . type_id ) ) ;
55845584 }
55855585 }
55865586}
55875587
55885588/// Generate a TIR function for reading records from a stream.
55895589///
55905590/// Generates `__cm_stream_read_<T>(handle: i32, max: i32) -> Array<T>`:
5591- /// 1. Call cm_stream_read_raw to get raw buffer [ptr, count]
5592- /// 2. Loop: lift each record from buffer at ptr + i * elem_size
5591+ /// 1. Call ` cm_stream_read_raw` to get raw buffer [ptr, count]
5592+ /// 2. Loop: lift each record from buffer at ptr + i * ` elem_size`
55935593/// 3. Append to result array
55945594/// 4. Free buffer
55955595/// 5. Return array
@@ -5603,7 +5603,10 @@ fn synthesize_stream_read_func(
56035603 wasi_registry : & crate :: component_model:: WasiRegistry ,
56045604 type_table : & RefCell < TypeTable > ,
56055605) -> TirFunction {
5606- use crate :: synthesis:: common:: * ;
5606+ use crate :: synthesis:: common:: {
5607+ assign, binary, break_stmt, builtin_call, cm_raw_call, expr_stmt, i32_const, if_stmt,
5608+ internal_call, let_mut_stmt, let_stmt, local_ref, loop_stmt, return_stmt, synth_span,
5609+ } ;
56075610
56085611 let func_name = format ! ( "__cm_stream_read_{elem_name}" ) ;
56095612 let _tuple_type_id = type_table
@@ -5639,7 +5642,12 @@ fn synthesize_stream_read_func(
56395642 i32_const ( elem_size) ,
56405643 TypeTable :: I32 ,
56415644 ) ;
5642- stmts. push ( let_stmt ( "byte_count" , byte_count_idx, TypeTable :: I32 , byte_count) ) ;
5645+ stmts. push ( let_stmt (
5646+ "byte_count" ,
5647+ byte_count_idx,
5648+ TypeTable :: I32 ,
5649+ byte_count,
5650+ ) ) ;
56435651
56445652 // let ptr = realloc(0, 0, elem_align, byte_count)
56455653 let ptr_idx = next_local;
@@ -5670,7 +5678,12 @@ fn synthesize_stream_read_func(
56705678 ] ,
56715679 TypeTable :: I32 ,
56725680 ) ;
5673- stmts. push ( let_mut_stmt ( "result" , result_idx, TypeTable :: I32 , stream_read_call) ) ;
5681+ stmts. push ( let_mut_stmt (
5682+ "result" ,
5683+ result_idx,
5684+ TypeTable :: I32 ,
5685+ stream_read_call,
5686+ ) ) ;
56745687
56755688 // if result == -1 { result = wait_for_blocked(handle); }
56765689 let blocked_check = binary (
@@ -5785,10 +5798,7 @@ fn synthesize_stream_read_func(
57855798 i32_const ( elem_size) ,
57865799 TypeTable :: I32 ,
57875800 ) ;
5788- let addr = binary_add (
5789- local_ref ( ptr_idx, "ptr" , TypeTable :: I32 ) ,
5790- offset,
5791- ) ;
5801+ let addr = binary_add ( local_ref ( ptr_idx, "ptr" , TypeTable :: I32 ) , offset) ;
57925802 loop_body_stmts. push ( let_stmt ( "addr" , addr_idx, TypeTable :: I32 , addr) ) ;
57935803
57945804 // Lift each field from linear memory at addr + field_offset
@@ -5855,10 +5865,7 @@ fn synthesize_stream_read_func(
58555865 // i += 1
58565866 let increment = assign (
58575867 local_ref ( i_idx, "i" , TypeTable :: I32 ) ,
5858- binary_add (
5859- local_ref ( i_idx, "i" , TypeTable :: I32 ) ,
5860- i32_const ( 1 ) ,
5861- ) ,
5868+ binary_add ( local_ref ( i_idx, "i" , TypeTable :: I32 ) , i32_const ( 1 ) ) ,
58625869 ) ;
58635870 loop_body_stmts. push ( expr_stmt ( increment) ) ;
58645871
@@ -5883,11 +5890,7 @@ fn synthesize_stream_read_func(
58835890 local_types. push ( TypeTable :: I32 ) ;
58845891
58855892 // return arr
5886- stmts. push ( return_stmt ( Some ( local_ref (
5887- arr_idx,
5888- "arr" ,
5889- array_type_id,
5890- ) ) ) ) ;
5893+ stmts. push ( return_stmt ( Some ( local_ref ( arr_idx, "arr" , array_type_id) ) ) ) ;
58915894
58925895 TirFunction {
58935896 name : func_name,
@@ -5917,7 +5920,10 @@ fn synthesize_stream_read_func(
59175920 return_type : array_type_id,
59185921 effects : vec ! [ ] ,
59195922 stores : vec ! [ ] ,
5920- body : Some ( TirBlock { stmts, span : synth_span ( ) } ) ,
5923+ body : Some ( TirBlock {
5924+ stmts,
5925+ span : synth_span ( ) ,
5926+ } ) ,
59215927 span : synth_span ( ) ,
59225928 local_count : next_local,
59235929 local_types,
@@ -6147,13 +6153,13 @@ fn rewrite_cm_methods_in_expr(expr: &mut TirExpr, tt: &TypeTable) {
61476153 }
61486154 if cm_name == "stream-read" && !is_u8_array_type ( expr. type_id , tt) {
61496155 // Non-u8 stream reads use a generated binding function
6150- if let Some ( type_args) = tt. generic_type_args ( expr. type_id ) {
6151- if let Some ( & elem_type_id) = type_args. first ( ) {
6152- let elem_name = tt . base_type_name ( elem_type_id ) ;
6153- let func_name = format ! ( "__cm_stream_read_{elem_name}" ) ;
6154- rewrite_cm_instance_method ( expr , "entry" , & func_name ) ;
6155- return ;
6156- }
6156+ if let Some ( type_args) = tt. generic_type_args ( expr. type_id )
6157+ && let Some ( & elem_type_id) = type_args. first ( )
6158+ {
6159+ let elem_name = tt . base_type_name ( elem_type_id ) ;
6160+ let func_name = format ! ( "__cm_stream_read_{elem_name}" ) ;
6161+ rewrite_cm_instance_method ( expr , "entry" , & func_name ) ;
6162+ return ;
61576163 }
61586164 return ;
61596165 }
@@ -6267,28 +6273,26 @@ fn parameterize_stream_cm_name(cm_name: &str, expr: &TirExpr, tt: &TypeTable) ->
62676273 }
62686274 }
62696275 // Extract element type from Stream<T>
6270- if let Some ( type_args) = tt. generic_type_args ( type_id) {
6271- if let Some ( & elem) = type_args. first ( ) {
6272- let elem_name = tt. base_type_name ( elem) ;
6273- if elem_name != "u8" {
6274- // Convert PascalCase to kebab-case for the CM name
6275- let cm_elem = elem_name
6276- . chars ( )
6277- . fold ( String :: new ( ) , |mut s, c| {
6278- if c. is_uppercase ( ) && !s. is_empty ( ) {
6279- s. push ( '-' ) ;
6280- }
6281- s. push ( c. to_ascii_lowercase ( ) ) ;
6282- s
6283- } ) ;
6284- return format ! ( "{cm_name}:{cm_elem}" ) ;
6285- }
6276+ if let Some ( type_args) = tt. generic_type_args ( type_id)
6277+ && let Some ( & elem) = type_args. first ( )
6278+ {
6279+ let elem_name = tt. base_type_name ( elem) ;
6280+ if elem_name != "u8" {
6281+ // Convert PascalCase to kebab-case for the CM name
6282+ let cm_elem = elem_name. chars ( ) . fold ( String :: new ( ) , |mut s, c| {
6283+ if c. is_uppercase ( ) && !s. is_empty ( ) {
6284+ s. push ( '-' ) ;
6285+ }
6286+ s. push ( c. to_ascii_lowercase ( ) ) ;
6287+ s
6288+ } ) ;
6289+ return format ! ( "{cm_name}:{cm_elem}" ) ;
62866290 }
62876291 }
62886292 cm_name. to_string ( )
62896293}
62906294
6291- /// Check if a TypeId represents `Array<u8>`.
6295+ /// Check if a ` TypeId` represents `Array<u8>`.
62926296fn is_u8_array_type ( type_id : TypeId , tt : & TypeTable ) -> bool {
62936297 let name = tt. type_name ( type_id) ;
62946298 name == "Array<u8>"
0 commit comments