@@ -3102,12 +3102,15 @@ export function allocPtrArray(ptrs: usize[] | null): usize {
3102
3102
function stringLengthUTF8 ( str : string ) : usize {
3103
3103
var len = 0 ;
3104
3104
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 ) {
3107
3107
len += 1 ;
3108
- } else if ( u <= 0x7FF ) {
3108
+ } else if ( c1 <= 0x7FF ) {
3109
3109
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
+ ) {
3111
3114
i ++ ;
3112
3115
len += 4 ;
3113
3116
} else {
@@ -3135,29 +3138,27 @@ function allocString(str: string | null): usize {
3135
3138
}
3136
3139
}
3137
3140
} else {
3138
- // the following is based on Emscripten's stringToUTF8Array
3139
3141
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 ) ;
3161
3162
}
3162
3163
}
3163
3164
}
0 commit comments