File tree 2 files changed +15
-3
lines changed
2 files changed +15
-3
lines changed Original file line number Diff line number Diff line change @@ -69,8 +69,16 @@ const experimentalWarnings = new SafeSet();
69
69
70
70
const colorRegExp = / \u001b \[ \d \d ? m / g; // eslint-disable-line no-control-regex
71
71
72
+ const unpairedSurrogateRe =
73
+ / (?: [ ^ \uD800 - \uDBFF ] | ^ ) [ \uDC00 - \uDFFF ] | [ \uD800 - \uDBFF ] (? ! [ \uDC00 - \uDFFF ] ) / ;
72
74
function toUSVString ( val ) {
73
- return _toUSVString ( `${ val } ` ) ;
75
+ const str = `${ val } ` ;
76
+ // As of V8 5.5, `str.search()` (and `unpairedSurrogateRe[@@search]()`) are
77
+ // slower than `unpairedSurrogateRe.exec()`.
78
+ const match = RegExpPrototypeExec ( unpairedSurrogateRe , str ) ;
79
+ if ( ! match )
80
+ return str ;
81
+ return _toUSVString ( str , match . index ) ;
74
82
}
75
83
76
84
let uvBinding ;
Original file line number Diff line number Diff line change @@ -319,12 +319,16 @@ static void GuessHandleType(const FunctionCallbackInfo<Value>& args) {
319
319
320
320
static void ToUSVString (const FunctionCallbackInfo<Value>& args) {
321
321
Environment* env = Environment::GetCurrent (args);
322
- CHECK_GE (args.Length (), 1 );
322
+ CHECK_GE (args.Length (), 2 );
323
323
CHECK (args[0 ]->IsString ());
324
+ CHECK (args[1 ]->IsNumber ());
324
325
325
326
TwoByteValue value (env->isolate (), args[0 ]);
326
327
327
- for (size_t i = 0 ; i < value.length (); i++) {
328
+ int64_t start = args[1 ]->IntegerValue (env->context ()).FromJust ();
329
+ CHECK_GE (start, 0 );
330
+
331
+ for (size_t i = start; i < value.length (); i++) {
328
332
char16_t c = value[i];
329
333
if (!IsUnicodeSurrogate (c)) {
330
334
continue ;
You can’t perform that action at this time.
0 commit comments