@@ -1301,7 +1301,9 @@ fn ssa_trace_supported(ssa: &SsaTrace) -> bool {
13011301 | SsaInstKind :: StringConcat { .. }
13021302 | SsaInstKind :: BytesConcat { .. }
13031303 | SsaInstKind :: BytesFromArrayU8 { .. }
1304+ | SsaInstKind :: BytesToUtf8Ascii { .. }
13041305 | SsaInstKind :: BytesToArrayU8 { .. }
1306+ | SsaInstKind :: ArrayNew
13051307 | SsaInstKind :: ArrayLen { .. }
13061308 | SsaInstKind :: ArrayGet { .. }
13071309 | SsaInstKind :: ArrayHas { .. }
@@ -1644,7 +1646,9 @@ fn ssa_inst_requires_owned_value_slot(kind: &SsaInstKind) -> bool {
16441646 | SsaInstKind :: ToString { .. }
16451647 | SsaInstKind :: StringSplitLiteral { .. }
16461648 | SsaInstKind :: BytesFromArrayU8 { .. }
1649+ | SsaInstKind :: BytesToUtf8Ascii { .. }
16471650 | SsaInstKind :: BytesToArrayU8 { .. }
1651+ | SsaInstKind :: ArrayNew
16481652 | SsaInstKind :: StringConcat { .. }
16491653 | SsaInstKind :: BytesConcat { .. }
16501654 | SsaInstKind :: HostCall { .. }
@@ -2980,6 +2984,92 @@ fn lower_ssa_inst(
29802984 b. switch_to_block ( cont) ;
29812985 out
29822986 }
2987+ SsaInstKind :: BytesToUtf8Ascii { bytes } => {
2988+ let bytes = values[ bytes] ;
2989+ let bytes_data = ssa_load_heap_data_ptr ( b, layout. value , bytes) ;
2990+ let bytes_ptr = b. ins ( ) . load (
2991+ pointer_type,
2992+ MemFlags :: new ( ) ,
2993+ bytes_data,
2994+ layout. stack_vec . ptr_offset ,
2995+ ) ;
2996+ let bytes_len = b. ins ( ) . load (
2997+ pointer_type,
2998+ MemFlags :: new ( ) ,
2999+ bytes_data,
3000+ layout. stack_vec . len_offset ,
3001+ ) ;
3002+ let out = owned_value_temp_slot_addr (
3003+ b,
3004+ pointer_type,
3005+ owned_value_temps,
3006+ SsaTempValueSlotKey :: Output ( output. id ) ,
3007+ ) ?;
3008+ let validate_loop = b. create_block ( ) ;
3009+ let validate_step = b. create_block ( ) ;
3010+ let finish = b. create_block ( ) ;
3011+ let fail = b. create_block ( ) ;
3012+ let cont = b. create_block ( ) ;
3013+ b. append_block_param ( validate_loop, pointer_type) ;
3014+
3015+ let zero = b. ins ( ) . iconst ( pointer_type, 0 ) ;
3016+ b. ins ( ) . jump ( validate_loop, & [ BlockArg :: Value ( zero) ] ) ;
3017+
3018+ b. switch_to_block ( validate_loop) ;
3019+ let index = b. block_params ( validate_loop) [ 0 ] ;
3020+ let done = b
3021+ . ins ( )
3022+ . icmp ( IntCC :: UnsignedGreaterThanOrEqual , index, bytes_len) ;
3023+ b. ins ( ) . brif ( done, finish, & [ ] , validate_step, & [ ] ) ;
3024+
3025+ b. switch_to_block ( validate_step) ;
3026+ let byte_addr = b. ins ( ) . iadd ( bytes_ptr, index) ;
3027+ let byte = b. ins ( ) . load ( types:: I8 , MemFlags :: new ( ) , byte_addr, 0 ) ;
3028+ let is_ascii = b. ins ( ) . icmp_imm ( IntCC :: UnsignedLessThan , byte, 128 ) ;
3029+ let validate_next = b. create_block ( ) ;
3030+ b. ins ( ) . brif ( is_ascii, validate_next, & [ ] , fail, & [ ] ) ;
3031+
3032+ b. switch_to_block ( validate_next) ;
3033+ let next_index = b. ins ( ) . iadd_imm ( index, 1 ) ;
3034+ b. ins ( ) . jump ( validate_loop, & [ BlockArg :: Value ( next_index) ] ) ;
3035+
3036+ b. switch_to_block ( finish) ;
3037+ let out_ptr = ssa_call_alloc_buffer (
3038+ b,
3039+ pointer_type,
3040+ heap_refs,
3041+ heap_addrs,
3042+ heap_addrs. alloc_byte_buffer ,
3043+ bytes_len,
3044+ ) ?;
3045+ ssa_call_copy_bytes (
3046+ b,
3047+ pointer_type,
3048+ heap_refs,
3049+ heap_addrs,
3050+ out_ptr,
3051+ bytes_ptr,
3052+ bytes_len,
3053+ ) ?;
3054+ let out_raw = ssa_call_pack_shared (
3055+ b,
3056+ pointer_type,
3057+ heap_refs,
3058+ heap_addrs. pack_string ,
3059+ out_ptr,
3060+ bytes_len,
3061+ bytes_len,
3062+ ) ?;
3063+ clear_owned_value_temp_slot ( b, pointer_type, helper_refs, helper_addrs, out) ?;
3064+ ssa_store_heap_ptr_in_value ( b, layout. value , out, layout. value . string_tag , out_raw) ;
3065+ b. ins ( ) . jump ( cont, & [ ] ) ;
3066+
3067+ b. switch_to_block ( fail) ;
3068+ ssa_emit_trace_exit_status ( b, vm_ptr, exit_block, pointer_type, offsets, inst. ip ) ?;
3069+
3070+ b. switch_to_block ( cont) ;
3071+ out
3072+ }
29833073 SsaInstKind :: BytesToArrayU8 { bytes } => {
29843074 let bytes = values[ bytes] ;
29853075 let bytes_data = ssa_load_heap_data_ptr ( b, layout. value , bytes) ;
@@ -3067,6 +3157,35 @@ fn lower_ssa_inst(
30673157 b. switch_to_block ( cont) ;
30683158 out
30693159 }
3160+ SsaInstKind :: ArrayNew => {
3161+ let out = owned_value_temp_slot_addr (
3162+ b,
3163+ pointer_type,
3164+ owned_value_temps,
3165+ SsaTempValueSlotKey :: Output ( output. id ) ,
3166+ ) ?;
3167+ let zero = b. ins ( ) . iconst ( pointer_type, 0 ) ;
3168+ let out_ptr = ssa_call_alloc_buffer (
3169+ b,
3170+ pointer_type,
3171+ heap_refs,
3172+ heap_addrs,
3173+ heap_addrs. alloc_value_buffer ,
3174+ zero,
3175+ ) ?;
3176+ let out_raw = ssa_call_pack_shared (
3177+ b,
3178+ pointer_type,
3179+ heap_refs,
3180+ heap_addrs. pack_array ,
3181+ out_ptr,
3182+ zero,
3183+ zero,
3184+ ) ?;
3185+ clear_owned_value_temp_slot ( b, pointer_type, helper_refs, helper_addrs, out) ?;
3186+ ssa_store_heap_ptr_in_value ( b, layout. value , out, layout. value . array_tag , out_raw) ;
3187+ out
3188+ }
30703189 SsaInstKind :: ArrayLen { array } => {
30713190 let array = values[ array] ;
30723191 let vec_ptr = ssa_load_heap_data_ptr ( b, layout. value , array) ;
@@ -4507,7 +4626,7 @@ fn lower_ssa_exit_block(
45074626 . contains_key ( & SsaTempValueSlotKey :: Output ( * value) )
45084627 && moved_owned_values. insert ( * value)
45094628 }
4510- SsaMaterialization :: BoxHeapPtr { .. } => true ,
4629+ SsaMaterialization :: BoxHeapPtr { .. } => false ,
45114630 }
45124631 } ) ;
45134632 if inline_owned_restore {
0 commit comments