@@ -3102,12 +3102,15 @@ export function allocPtrArray(ptrs: usize[] | null): usize {
31023102function 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