@@ -704,18 +704,20 @@ def store_string_to_utf8(cx, src, src_code_units, worst_case_size):
704704 assert (src_code_units <= MAX_STRING_BYTE_LENGTH )
705705 ptr = cx .opts .realloc (0 , 0 , 1 , src_code_units )
706706 trap_if (ptr + src_code_units > len (cx .opts .memory ))
707- encoded = src .encode ('utf-8' )
708- assert (src_code_units <= len (encoded ))
709- cx .opts .memory [ptr : ptr + src_code_units ] = encoded [0 : src_code_units ]
710- if src_code_units < len (encoded ):
711- trap_if (worst_case_size > MAX_STRING_BYTE_LENGTH )
712- ptr = cx .opts .realloc (ptr , src_code_units , 1 , worst_case_size )
713- trap_if (ptr + worst_case_size > len (cx .opts .memory ))
714- cx .opts .memory [ptr + src_code_units : ptr + len (encoded )] = encoded [src_code_units : ]
715- if worst_case_size > len (encoded ):
716- ptr = cx .opts .realloc (ptr , worst_case_size , 1 , len (encoded ))
717- trap_if (ptr + len (encoded ) > len (cx .opts .memory ))
718- return (ptr , len (encoded ))
707+ for i ,code_point in enumerate (src ):
708+ if ord (code_point ) < 2 ** 7 :
709+ cx .opts .memory [ptr + i ] = ord (code_point )
710+ else :
711+ trap_if (worst_case_size > MAX_STRING_BYTE_LENGTH )
712+ ptr = cx .opts .realloc (ptr , src_code_units , 1 , worst_case_size )
713+ trap_if (ptr + worst_case_size > len (cx .opts .memory ))
714+ encoded = src .encode ('utf-8' )
715+ cx .opts .memory [ptr + i : ptr + len (encoded )] = encoded [i : ]
716+ if worst_case_size > len (encoded ):
717+ ptr = cx .opts .realloc (ptr , worst_case_size , 1 , len (encoded ))
718+ trap_if (ptr + len (encoded ) > len (cx .opts .memory ))
719+ return (ptr , len (encoded ))
720+ return (ptr , src_code_units )
719721
720722def store_utf8_to_utf16 (cx , src , src_code_units ):
721723 worst_case_size = 2 * src_code_units
0 commit comments