@@ -2507,7 +2507,7 @@ export class Module {
2507
2507
// avoid quite a bit of unnecessary garbage.
2508
2508
if ( ptr == 0 ) return null ;
2509
2509
var cached = this . cachedPointersToStrings ;
2510
- if ( cached . has ( ptr ) ) return changetype < string > ( this . cachedPointersToStrings . get ( ptr ) ) ;
2510
+ if ( cached . has ( ptr ) ) return changetype < string > ( cached . get ( ptr ) ) ;
2511
2511
var str = readString ( ptr ) ;
2512
2512
cached . set ( ptr , str ) ;
2513
2513
return str ;
@@ -3035,8 +3035,12 @@ function allocU8Array(u8s: Uint8Array | null): usize {
3035
3035
if ( ! u8s ) return 0 ;
3036
3036
var len = u8s . length ;
3037
3037
var ptr = binaryen . _malloc ( len ) ;
3038
- for ( let i = 0 ; i < len ; ++ i ) {
3039
- binaryen . __i32_store8 ( ptr + i , u8s [ i ] ) ;
3038
+ if ( ! ASC_TARGET ) {
3039
+ binaryen . HEAPU8 . set ( u8s , ptr ) ;
3040
+ } else {
3041
+ for ( let i = 0 ; i < len ; ++ i ) {
3042
+ binaryen . __i32_store8 ( ptr + i , u8s [ i ] ) ;
3043
+ }
3040
3044
}
3041
3045
return ptr ;
3042
3046
}
@@ -3045,11 +3049,15 @@ function allocI32Array(i32s: i32[] | null): usize {
3045
3049
if ( ! i32s ) return 0 ;
3046
3050
var len = i32s . length ;
3047
3051
var ptr = binaryen . _malloc ( len << 2 ) ;
3048
- var idx = ptr ;
3049
- for ( let i = 0 ; i < len ; ++ i ) {
3050
- let val = i32s [ i ] ;
3051
- binaryen . __i32_store ( idx , val ) ;
3052
- idx += 4 ;
3052
+ if ( ! ASC_TARGET ) {
3053
+ binaryen . HEAP32 . set ( i32s , ptr >>> 2 ) ;
3054
+ } else {
3055
+ var idx = ptr ;
3056
+ for ( let i = 0 ; i < len ; ++ i ) {
3057
+ let val = i32s [ i ] ;
3058
+ binaryen . __i32_store ( idx , val ) ;
3059
+ idx += 4 ;
3060
+ }
3053
3061
}
3054
3062
return ptr ;
3055
3063
}
@@ -3058,11 +3066,15 @@ function allocU32Array(u32s: u32[] | null): usize {
3058
3066
if ( ! u32s ) return 0 ;
3059
3067
var len = u32s . length ;
3060
3068
var ptr = binaryen . _malloc ( len << 2 ) ;
3061
- var idx = ptr ;
3062
- for ( let i = 0 ; i < len ; ++ i ) {
3063
- let val = u32s [ i ] ;
3064
- binaryen . __i32_store ( idx , val ) ;
3065
- idx += 4 ;
3069
+ if ( ! ASC_TARGET ) {
3070
+ binaryen . HEAPU32 . set ( u32s , ptr >>> 2 ) ;
3071
+ } else {
3072
+ var idx = ptr ;
3073
+ for ( let i = 0 ; i < len ; ++ i ) {
3074
+ let val = u32s [ i ] ;
3075
+ binaryen . __i32_store ( idx , val ) ;
3076
+ idx += 4 ;
3077
+ }
3066
3078
}
3067
3079
return ptr ;
3068
3080
}
@@ -3073,72 +3085,95 @@ export function allocPtrArray(ptrs: usize[] | null): usize {
3073
3085
assert ( ASC_TARGET != Target . WASM64 ) ;
3074
3086
var len = ptrs . length ;
3075
3087
var ptr = binaryen . _malloc ( len << 2 ) ;
3076
- var idx = ptr ;
3077
- for ( let i = 0 , k = len ; i < k ; ++ i ) {
3078
- let val = ptrs [ i ] ;
3079
- binaryen . __i32_store ( idx , < i32 > val ) ;
3080
- idx += 4 ;
3088
+ if ( ! ASC_TARGET ) {
3089
+ binaryen . HEAPU32 . set ( ptrs , ptr >>> 2 ) ;
3090
+ } else {
3091
+ var idx = ptr ;
3092
+ for ( let i = 0 , k = len ; i < k ; ++ i ) {
3093
+ let val = ptrs [ i ] ;
3094
+ binaryen . __i32_store ( idx , < i32 > val ) ;
3095
+ idx += 4 ;
3096
+ }
3081
3097
}
3082
3098
return ptr ;
3083
3099
}
3084
3100
3085
3101
function stringLengthUTF8 ( str : string ) : usize {
3086
3102
var len = 0 ;
3087
3103
for ( let i = 0 , k = str . length ; i < k ; ++ i ) {
3088
- let u = str . charCodeAt ( i ) ;
3089
- if ( u >= 0xD800 && u <= 0xDFFF && i + 1 < k ) {
3090
- u = 0x10000 + ( ( u & 0x3FF ) << 10 ) | ( str . charCodeAt ( ++ i ) & 0x3FF ) ;
3091
- }
3104
+ let u = str . charCodeAt ( i ) >>> 0 ;
3092
3105
if ( u <= 0x7F ) {
3093
3106
len += 1 ;
3094
3107
} else if ( u <= 0x7FF ) {
3095
3108
len += 2 ;
3096
- } else if ( u <= 0xFFFF ) {
3097
- len += 3 ;
3098
- } else {
3109
+ } else if ( u >= 0xD800 && u <= 0xDFFF && i + 1 < k ) {
3110
+ u = 0x10000 + ( ( u & 0x3FF ) << 10 ) | ( str . charCodeAt ( ++ i ) & 0x3FF ) ;
3099
3111
len += 4 ;
3112
+ } else {
3113
+ len += 3 ;
3100
3114
}
3101
3115
}
3102
3116
return len ;
3103
3117
}
3104
3118
3105
3119
function allocString ( str : string | null ) : usize {
3106
3120
if ( str === null ) return 0 ;
3107
- var ptr = binaryen . _malloc ( stringLengthUTF8 ( str ) + 1 ) >>> 0 ;
3108
- // the following is based on Emscripten's stringToUTF8Array
3121
+ var len = stringLengthUTF8 ( str ) ;
3122
+ var ptr = binaryen . _malloc ( len + 1 ) >>> 0 ;
3109
3123
var idx = ptr ;
3110
- for ( let i = 0 , k = str . length ; i < k ; ++ i ) {
3111
- let u = str . charCodeAt ( i ) ;
3112
- if ( u >= 0xD800 && u <= 0xDFFF && i + 1 < k ) {
3113
- u = 0x10000 + ( ( u & 0x3FF ) << 10 ) | ( str . charCodeAt ( ++ i ) & 0x3FF ) ;
3114
- }
3115
- if ( u <= 0x7F ) {
3116
- binaryen . __i32_store8 ( idx ++ , u as u8 ) ;
3117
- } else if ( u <= 0x7FF ) {
3118
- binaryen . __i32_store8 ( idx ++ , ( 0xC0 | ( u >>> 6 ) ) as u8 ) ;
3119
- binaryen . __i32_store8 ( idx ++ , ( 0x80 | ( u & 63 ) ) as u8 ) ;
3120
- } else if ( u <= 0xFFFF ) {
3121
- binaryen . __i32_store8 ( idx ++ , ( 0xE0 | ( u >>> 12 ) ) as u8 ) ;
3122
- binaryen . __i32_store8 ( idx ++ , ( 0x80 | ( ( u >>> 6 ) & 63 ) ) as u8 ) ;
3123
- binaryen . __i32_store8 ( idx ++ , ( 0x80 | ( u & 63 ) ) as u8 ) ;
3124
+ if ( len === str . length ) {
3125
+ // fast path when all chars are ascii
3126
+ if ( ! ASC_TARGET ) {
3127
+ for ( let i = 0 , k = str . length ; i < k ; ++ i ) {
3128
+ binaryen . HEAPU8 [ idx ++ ] = str . charCodeAt ( i ) ;
3129
+ }
3124
3130
} else {
3125
- assert ( u < 0x200000 , "Invalid Unicode code point during allocString" ) ;
3126
- binaryen . __i32_store8 ( idx ++ , ( 0xF0 | ( u >>> 18 ) ) as u8 ) ;
3127
- binaryen . __i32_store8 ( idx ++ , ( 0x80 | ( ( u >>> 12 ) & 63 ) ) as u8 ) ;
3128
- binaryen . __i32_store8 ( idx ++ , ( 0x80 | ( ( u >>> 6 ) & 63 ) ) as u8 ) ;
3129
- binaryen . __i32_store8 ( idx ++ , ( 0x80 | ( u & 63 ) ) as u8 ) ;
3131
+ for ( let i = 0 , k = str . length ; i < k ; ++ i ) {
3132
+ let u = str . charCodeAt ( i ) >>> 0 ;
3133
+ binaryen . __i32_store8 ( idx ++ , u as u8 ) ;
3134
+ }
3135
+ }
3136
+ } else {
3137
+ // the following is based on Emscripten's stringToUTF8Array
3138
+ for ( let i = 0 , k = str . length ; i < k ; ++ i ) {
3139
+ let u = str . charCodeAt ( i ) >>> 0 ;
3140
+ if ( u <= 0x7F ) {
3141
+ binaryen . __i32_store8 ( idx ++ , u as u8 ) ;
3142
+ } else if ( u <= 0x7FF ) {
3143
+ binaryen . __i32_store8 ( idx ++ , ( 0xC0 | ( u >>> 6 ) ) as u8 ) ;
3144
+ binaryen . __i32_store8 ( idx ++ , ( 0x80 | ( u & 63 ) ) as u8 ) ;
3145
+ } else if ( u >= 0xD800 && u <= 0xDFFF ) {
3146
+ if ( i + 1 < k ) {
3147
+ u = 0x10000 + ( ( u & 0x3FF ) << 10 ) | ( str . charCodeAt ( ++ i ) & 0x3FF ) ;
3148
+ }
3149
+ if ( u <= 0xFFFF ) {
3150
+ binaryen . __i32_store8 ( idx ++ , ( 0xE0 | ( u >>> 12 ) ) as u8 ) ;
3151
+ binaryen . __i32_store8 ( idx ++ , ( 0x80 | ( ( u >>> 6 ) & 63 ) ) as u8 ) ;
3152
+ binaryen . __i32_store8 ( idx ++ , ( 0x80 | ( u & 63 ) ) as u8 ) ;
3153
+ } else {
3154
+ assert ( u <= 0x10FFFF , "Invalid Unicode code point during allocString" ) ;
3155
+ binaryen . __i32_store8 ( idx ++ , ( 0xF0 | ( u >>> 18 ) ) as u8 ) ;
3156
+ binaryen . __i32_store8 ( idx ++ , ( 0x80 | ( ( u >>> 12 ) & 63 ) ) as u8 ) ;
3157
+ binaryen . __i32_store8 ( idx ++ , ( 0x80 | ( ( u >>> 6 ) & 63 ) ) as u8 ) ;
3158
+ binaryen . __i32_store8 ( idx ++ , ( 0x80 | ( u & 63 ) ) as u8 ) ;
3159
+ }
3160
+ }
3130
3161
}
3131
3162
}
3132
- binaryen . __i32_store8 ( idx , 0 ) ;
3163
+ binaryen . __i32_store8 ( idx , 0 ) ; // \0
3133
3164
return ptr ;
3134
3165
}
3135
3166
3136
3167
function readBuffer ( ptr : usize , len : i32 ) : Uint8Array {
3137
- var ret = new Uint8Array ( len ) ;
3138
- for ( let i = 0 ; i < len ; ++ i ) {
3139
- ret [ i ] = binaryen . __i32_load8_u ( ptr + < usize > i ) ;
3168
+ if ( ! ASC_TARGET ) {
3169
+ return binaryen . HEAPU8 . slice ( ptr , ptr + len ) ;
3170
+ } else {
3171
+ var ret = new Uint8Array ( len ) ;
3172
+ for ( let i = 0 ; i < len ; ++ i ) {
3173
+ ret [ i ] = binaryen . __i32_load8_u ( ptr + < usize > i ) ;
3174
+ }
3175
+ return ret ;
3140
3176
}
3141
- return ret ;
3142
3177
}
3143
3178
3144
3179
export function readString ( ptr : usize ) : string | null {
0 commit comments