Skip to content

Commit 9eda882

Browse files
committed
Tweak CABI string conversion to match what impls want to do
1 parent 736660c commit 9eda882

File tree

2 files changed

+28
-24
lines changed

2 files changed

+28
-24
lines changed

design/mvp/CanonicalABI.md

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -905,18 +905,20 @@ def store_string_to_utf8(cx, src, src_code_units, worst_case_size):
905905
assert(src_code_units <= MAX_STRING_BYTE_LENGTH)
906906
ptr = cx.opts.realloc(0, 0, 1, src_code_units)
907907
trap_if(ptr + src_code_units > len(cx.opts.memory))
908-
encoded = src.encode('utf-8')
909-
assert(src_code_units <= len(encoded))
910-
cx.opts.memory[ptr : ptr+src_code_units] = encoded[0 : src_code_units]
911-
if src_code_units < len(encoded):
912-
trap_if(worst_case_size > MAX_STRING_BYTE_LENGTH)
913-
ptr = cx.opts.realloc(ptr, src_code_units, 1, worst_case_size)
914-
trap_if(ptr + worst_case_size > len(cx.opts.memory))
915-
cx.opts.memory[ptr+src_code_units : ptr+len(encoded)] = encoded[src_code_units : ]
916-
if worst_case_size > len(encoded):
917-
ptr = cx.opts.realloc(ptr, worst_case_size, 1, len(encoded))
918-
trap_if(ptr + len(encoded) > len(cx.opts.memory))
919-
return (ptr, len(encoded))
908+
for i,code_point in enumerate(src):
909+
if ord(code_point) < 2**7:
910+
cx.opts.memory[ptr + i] = ord(code_point)
911+
else:
912+
trap_if(worst_case_size > MAX_STRING_BYTE_LENGTH)
913+
ptr = cx.opts.realloc(ptr, src_code_units, 1, worst_case_size)
914+
trap_if(ptr + worst_case_size > len(cx.opts.memory))
915+
encoded = src.encode('utf-8')
916+
cx.opts.memory[ptr+i : ptr+len(encoded)] = encoded[i : ]
917+
if worst_case_size > len(encoded):
918+
ptr = cx.opts.realloc(ptr, worst_case_size, 1, len(encoded))
919+
trap_if(ptr + len(encoded) > len(cx.opts.memory))
920+
return (ptr, len(encoded))
921+
return (ptr, src_code_units)
920922
```
921923

922924
Converting from UTF-8 to UTF-16 performs an initial worst-case size allocation

design/mvp/canonical-abi/definitions.py

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -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

720722
def store_utf8_to_utf16(cx, src, src_code_units):
721723
worst_case_size = 2 * src_code_units

0 commit comments

Comments
 (0)