Skip to content

Commit c6f2683

Browse files
committed
Cache ASCII characters
1 parent 0ae26d8 commit c6f2683

File tree

2 files changed

+275
-6
lines changed

2 files changed

+275
-6
lines changed

pkgs/html/lib/src/constants.dart

Lines changed: 259 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3094,3 +3094,262 @@ const Map<String, String> encodings = {
30943094
'windows936': 'gbk',
30953095
'x-x-big5': 'big5'
30963096
};
3097+
3098+
const asciiCharacters = [
3099+
'\u0000',
3100+
'\u0001',
3101+
'\u0002',
3102+
'\u0003',
3103+
'\u0004',
3104+
'\u0005',
3105+
'\u0006',
3106+
'\u0007',
3107+
'\u0008',
3108+
'\u0009',
3109+
'\u000a',
3110+
'\u000b',
3111+
'\u000c',
3112+
'\u000d',
3113+
'\u000e',
3114+
'\u000f',
3115+
'\u0010',
3116+
'\u0011',
3117+
'\u0012',
3118+
'\u0013',
3119+
'\u0014',
3120+
'\u0015',
3121+
'\u0016',
3122+
'\u0017',
3123+
'\u0018',
3124+
'\u0019',
3125+
'\u001a',
3126+
'\u001b',
3127+
'\u001c',
3128+
'\u001d',
3129+
'\u001e',
3130+
'\u001f',
3131+
'\u0020',
3132+
'\u0021',
3133+
'\u0022',
3134+
'\u0023',
3135+
'\u0024',
3136+
'\u0025',
3137+
'\u0026',
3138+
'\u0027',
3139+
'\u0028',
3140+
'\u0029',
3141+
'\u002a',
3142+
'\u002b',
3143+
'\u002c',
3144+
'\u002d',
3145+
'\u002e',
3146+
'\u002f',
3147+
'\u0030',
3148+
'\u0031',
3149+
'\u0032',
3150+
'\u0033',
3151+
'\u0034',
3152+
'\u0035',
3153+
'\u0036',
3154+
'\u0037',
3155+
'\u0038',
3156+
'\u0039',
3157+
'\u003a',
3158+
'\u003b',
3159+
'\u003c',
3160+
'\u003d',
3161+
'\u003e',
3162+
'\u003f',
3163+
'\u0040',
3164+
'\u0041',
3165+
'\u0042',
3166+
'\u0043',
3167+
'\u0044',
3168+
'\u0045',
3169+
'\u0046',
3170+
'\u0047',
3171+
'\u0048',
3172+
'\u0049',
3173+
'\u004a',
3174+
'\u004b',
3175+
'\u004c',
3176+
'\u004d',
3177+
'\u004e',
3178+
'\u004f',
3179+
'\u0050',
3180+
'\u0051',
3181+
'\u0052',
3182+
'\u0053',
3183+
'\u0054',
3184+
'\u0055',
3185+
'\u0056',
3186+
'\u0057',
3187+
'\u0058',
3188+
'\u0059',
3189+
'\u005a',
3190+
'\u005b',
3191+
'\u005c',
3192+
'\u005d',
3193+
'\u005e',
3194+
'\u005f',
3195+
'\u0060',
3196+
'\u0061',
3197+
'\u0062',
3198+
'\u0063',
3199+
'\u0064',
3200+
'\u0065',
3201+
'\u0066',
3202+
'\u0067',
3203+
'\u0068',
3204+
'\u0069',
3205+
'\u006a',
3206+
'\u006b',
3207+
'\u006c',
3208+
'\u006d',
3209+
'\u006e',
3210+
'\u006f',
3211+
'\u0070',
3212+
'\u0071',
3213+
'\u0072',
3214+
'\u0073',
3215+
'\u0074',
3216+
'\u0075',
3217+
'\u0076',
3218+
'\u0077',
3219+
'\u0078',
3220+
'\u0079',
3221+
'\u007a',
3222+
'\u007b',
3223+
'\u007c',
3224+
'\u007d',
3225+
'\u007e',
3226+
'\u007f',
3227+
'\u0080',
3228+
'\u0081',
3229+
'\u0082',
3230+
'\u0083',
3231+
'\u0084',
3232+
'\u0085',
3233+
'\u0086',
3234+
'\u0087',
3235+
'\u0088',
3236+
'\u0089',
3237+
'\u008a',
3238+
'\u008b',
3239+
'\u008c',
3240+
'\u008d',
3241+
'\u008e',
3242+
'\u008f',
3243+
'\u0090',
3244+
'\u0091',
3245+
'\u0092',
3246+
'\u0093',
3247+
'\u0094',
3248+
'\u0095',
3249+
'\u0096',
3250+
'\u0097',
3251+
'\u0098',
3252+
'\u0099',
3253+
'\u009a',
3254+
'\u009b',
3255+
'\u009c',
3256+
'\u009d',
3257+
'\u009e',
3258+
'\u009f',
3259+
'\u00a0',
3260+
'\u00a1',
3261+
'\u00a2',
3262+
'\u00a3',
3263+
'\u00a4',
3264+
'\u00a5',
3265+
'\u00a6',
3266+
'\u00a7',
3267+
'\u00a8',
3268+
'\u00a9',
3269+
'\u00aa',
3270+
'\u00ab',
3271+
'\u00ac',
3272+
'\u00ad',
3273+
'\u00ae',
3274+
'\u00af',
3275+
'\u00b0',
3276+
'\u00b1',
3277+
'\u00b2',
3278+
'\u00b3',
3279+
'\u00b4',
3280+
'\u00b5',
3281+
'\u00b6',
3282+
'\u00b7',
3283+
'\u00b8',
3284+
'\u00b9',
3285+
'\u00ba',
3286+
'\u00bb',
3287+
'\u00bc',
3288+
'\u00bd',
3289+
'\u00be',
3290+
'\u00bf',
3291+
'\u00c0',
3292+
'\u00c1',
3293+
'\u00c2',
3294+
'\u00c3',
3295+
'\u00c4',
3296+
'\u00c5',
3297+
'\u00c6',
3298+
'\u00c7',
3299+
'\u00c8',
3300+
'\u00c9',
3301+
'\u00ca',
3302+
'\u00cb',
3303+
'\u00cc',
3304+
'\u00cd',
3305+
'\u00ce',
3306+
'\u00cf',
3307+
'\u00d0',
3308+
'\u00d1',
3309+
'\u00d2',
3310+
'\u00d3',
3311+
'\u00d4',
3312+
'\u00d5',
3313+
'\u00d6',
3314+
'\u00d7',
3315+
'\u00d8',
3316+
'\u00d9',
3317+
'\u00da',
3318+
'\u00db',
3319+
'\u00dc',
3320+
'\u00dd',
3321+
'\u00de',
3322+
'\u00df',
3323+
'\u00e0',
3324+
'\u00e1',
3325+
'\u00e2',
3326+
'\u00e3',
3327+
'\u00e4',
3328+
'\u00e5',
3329+
'\u00e6',
3330+
'\u00e7',
3331+
'\u00e8',
3332+
'\u00e9',
3333+
'\u00ea',
3334+
'\u00eb',
3335+
'\u00ec',
3336+
'\u00ed',
3337+
'\u00ee',
3338+
'\u00ef',
3339+
'\u00f0',
3340+
'\u00f1',
3341+
'\u00f2',
3342+
'\u00f3',
3343+
'\u00f4',
3344+
'\u00f5',
3345+
'\u00f6',
3346+
'\u00f7',
3347+
'\u00f8',
3348+
'\u00f9',
3349+
'\u00fa',
3350+
'\u00fb',
3351+
'\u00fc',
3352+
'\u00fd',
3353+
'\u00fe',
3354+
'\u00ff'
3355+
];

pkgs/html/lib/src/html_input_stream.dart

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -221,9 +221,14 @@ class HtmlInputStream {
221221
/// EOF when EOF is reached.
222222
String? char() {
223223
if (_offset >= _chars.length) return eof;
224-
return _isSurrogatePair(_chars, _offset)
225-
? String.fromCharCodes([_chars[_offset++], _chars[_offset++]])
226-
: String.fromCharCode(_chars[_offset++]);
224+
final firstCharCode = _chars[_offset++];
225+
if (firstCharCode < 256) {
226+
return asciiCharacters[firstCharCode];
227+
}
228+
if (_isSurrogatePair(_chars, _offset - 1)) {
229+
return String.fromCharCodes([firstCharCode, _chars[_offset++]]);
230+
}
231+
return String.fromCharCode(firstCharCode);
227232
}
228233

229234
int? peekCodeUnit() {
@@ -233,9 +238,14 @@ class HtmlInputStream {
233238

234239
String? peekChar() {
235240
if (_offset >= _chars.length) return eof;
236-
return _isSurrogatePair(_chars, _offset)
237-
? String.fromCharCodes([_chars[_offset], _chars[_offset + 1]])
238-
: String.fromCharCode(_chars[_offset]);
241+
final charCode = _chars[_offset];
242+
if (charCode < 256) {
243+
return asciiCharacters[charCode];
244+
}
245+
if (_isSurrogatePair(_chars, _offset)) {
246+
return String.fromCharCodes([charCode, _chars[_offset + 1]]);
247+
}
248+
return String.fromCharCode(charCode);
239249
}
240250

241251
// Whether the current and next chars indicate a surrogate pair.

0 commit comments

Comments
 (0)