Skip to content

Commit 3b3fe60

Browse files
authored
fix: Fix Binaryen glue string encoding (#2129)
1 parent 6a3e848 commit 3b3fe60

File tree

1 file changed

+27
-26
lines changed

1 file changed

+27
-26
lines changed

src/module.ts

Lines changed: 27 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -3102,12 +3102,15 @@ export function allocPtrArray(ptrs: usize[] | null): usize {
31023102
function stringLengthUTF8(str: string): usize {
31033103
var len = 0;
31043104
for (let i = 0, k = str.length; i < k; ++i) {
3105-
let u = str.charCodeAt(i) >>> 0;
3106-
if (u <= 0x7F) {
3105+
let c1 = str.charCodeAt(i) >>> 0;
3106+
if (c1 <= 0x7F) {
31073107
len += 1;
3108-
} else if (u <= 0x7FF) {
3108+
} else if (c1 <= 0x7FF) {
31093109
len += 2;
3110-
} else if (u >= 0xD800 && u <= 0xDFFF && i + 1 < k) {
3110+
} else if (
3111+
(c1 & 0xFC00) === 0xD800 && i + 1 < k &&
3112+
(str.charCodeAt(i + 1) & 0xFC00) === 0xDC00
3113+
) {
31113114
i++;
31123115
len += 4;
31133116
} else {
@@ -3135,29 +3138,27 @@ function allocString(str: string | null): usize {
31353138
}
31363139
}
31373140
} else {
3138-
// the following is based on Emscripten's stringToUTF8Array
31393141
for (let i = 0, k = str.length; i < k; ++i) {
3140-
let u = str.charCodeAt(i) >>> 0;
3141-
if (u <= 0x7F) {
3142-
binaryen.__i32_store8(idx++, u as u8);
3143-
} else if (u <= 0x7FF) {
3144-
binaryen.__i32_store8(idx++, (0xC0 | (u >>> 6) ) as u8);
3145-
binaryen.__i32_store8(idx++, (0x80 | ( u & 63)) as u8);
3146-
} else if (u >= 0xD800 && u <= 0xDFFF) {
3147-
if (i + 1 < k) {
3148-
u = 0x10000 + ((u & 0x3FF) << 10) | (str.charCodeAt(++i) & 0x3FF);
3149-
}
3150-
if (u <= 0xFFFF) {
3151-
binaryen.__i32_store8(idx++, (0xE0 | (u >>> 12) ) as u8);
3152-
binaryen.__i32_store8(idx++, (0x80 | ((u >>> 6) & 63)) as u8);
3153-
binaryen.__i32_store8(idx++, (0x80 | ( u & 63)) as u8);
3154-
} else {
3155-
assert(u <= 0x10FFFF, "Invalid Unicode code point during allocString");
3156-
binaryen.__i32_store8(idx++, (0xF0 | (u >>> 18) ) as u8);
3157-
binaryen.__i32_store8(idx++, (0x80 | ((u >>> 12) & 63)) as u8);
3158-
binaryen.__i32_store8(idx++, (0x80 | ((u >>> 6) & 63)) as u8);
3159-
binaryen.__i32_store8(idx++, (0x80 | ( u & 63)) as u8);
3160-
}
3142+
let c1 = str.charCodeAt(i) >>> 0, c2: i32;
3143+
if (c1 <= 0x7F) {
3144+
binaryen.__i32_store8(idx++, c1 as u8);
3145+
} else if (c1 <= 0x7FF) {
3146+
binaryen.__i32_store8(idx++, (0xC0 | (c1 >>> 6) ) as u8);
3147+
binaryen.__i32_store8(idx++, (0x80 | ( c1 & 63)) as u8);
3148+
} else if (
3149+
(c1 & 0xFC00) === 0xD800 && i + 1 < k &&
3150+
((c2 = str.charCodeAt(i + 1)) & 0xFC00) === 0xDC00
3151+
) {
3152+
c1 = 0x10000 + ((c1 & 0x3FF) << 10) | (c2 & 0x3FF);
3153+
++i;
3154+
binaryen.__i32_store8(idx++, (0xF0 | (c1 >>> 18) ) as u8);
3155+
binaryen.__i32_store8(idx++, (0x80 | ((c1 >>> 12) & 63)) as u8);
3156+
binaryen.__i32_store8(idx++, (0x80 | ((c1 >>> 6) & 63)) as u8);
3157+
binaryen.__i32_store8(idx++, (0x80 | ( c1 & 63)) as u8);
3158+
} else {
3159+
binaryen.__i32_store8(idx++, (0xE0 | (c1 >>> 12) ) as u8);
3160+
binaryen.__i32_store8(idx++, (0x80 | ((c1 >>> 6) & 63)) as u8);
3161+
binaryen.__i32_store8(idx++, (0x80 | ( c1 & 63)) as u8);
31613162
}
31623163
}
31633164
}

0 commit comments

Comments
 (0)