@@ -457,12 +457,13 @@ impl<'a> FnCompiler<'a> {
457457 ) )
458458 }
459459
460- fn compile_string_slice (
460+ // Can be used for raw untyped slice and string slice
461+ fn compile_slice (
461462 & mut self ,
462463 context : & mut Context ,
463464 span_md_idx : Option < MetadataIndex > ,
464- string_data : Value ,
465- string_len : u64 ,
465+ slice_ptr : Value ,
466+ slice_len : u64 ,
466467 ) -> Result < TerminatorValue , CompileError > {
467468 let int_ty = Type :: get_uint64 ( context) ;
468469 let ptr_ty = Type :: get_ptr ( context) ;
@@ -471,9 +472,9 @@ impl<'a> FnCompiler<'a> {
471472 let ptr_val = self
472473 . current_block
473474 . append ( context)
474- . cast_ptr ( string_data , ptr_ty)
475+ . cast_ptr ( slice_ptr , ptr_ty)
475476 . add_metadatum ( context, span_md_idx) ;
476- let len_val = ConstantContent :: get_uint ( context, 64 , string_len ) ;
477+ let len_val = ConstantContent :: get_uint ( context, 64 , slice_len ) ;
477478
478479 // a slice is a pointer and a length
479480 let field_types = vec ! [ ptr_ty, int_ty] ;
@@ -569,7 +570,24 @@ impl<'a> FnCompiler<'a> {
569570 . append ( context)
570571 . get_global ( string_data_ptr) ;
571572 let string_len = s. as_str ( ) . len ( ) as u64 ;
572- self . compile_string_slice ( context, span_md_idx, string_ptr, string_len)
573+ self . compile_slice ( context, span_md_idx, string_ptr, string_len)
574+ }
575+ ty:: TyExpressionVariant :: Literal ( Literal :: Binary ( bytes) ) => {
576+ let data = ConstantContent :: get_untyped_slice ( context, bytes. clone ( ) )
577+ . get_constant ( context)
578+ . unwrap ( ) ;
579+ let data_ptr = self . module . new_unique_global_var (
580+ context,
581+ "__const_global" . into ( ) ,
582+ data. get_content ( context) . ty ,
583+ Some ( * data) ,
584+ false ,
585+ ) ;
586+
587+ let slice_ptr = self . current_block . append ( context) . get_global ( data_ptr) ;
588+ let slice_len = bytes. len ( ) as u64 ;
589+
590+ self . compile_slice ( context, span_md_idx, slice_ptr, slice_len)
573591 }
574592 ty:: TyExpressionVariant :: Literal ( Literal :: Numeric ( n) ) => {
575593 let implied_lit = match & * self . engines . te ( ) . get ( ast_expr. return_type ) {
0 commit comments