File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -69,8 +69,16 @@ const experimentalWarnings = new SafeSet();
6969
7070const colorRegExp = / \u001b \[ \d \d ? m / g; // eslint-disable-line no-control-regex
7171
72+ const unpairedSurrogateRe =
73+ / (?: [ ^ \uD800 - \uDBFF ] | ^ ) [ \uDC00 - \uDFFF ] | [ \uD800 - \uDBFF ] (? ! [ \uDC00 - \uDFFF ] ) / ;
7274function 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 ) ;
7482}
7583
7684let uvBinding ;
Original file line number Diff line number Diff line change @@ -319,12 +319,16 @@ static void GuessHandleType(const FunctionCallbackInfo<Value>& args) {
319319
320320static void ToUSVString (const FunctionCallbackInfo<Value>& args) {
321321 Environment* env = Environment::GetCurrent (args);
322- CHECK_GE (args.Length (), 1 );
322+ CHECK_GE (args.Length (), 2 );
323323 CHECK (args[0 ]->IsString ());
324+ CHECK (args[1 ]->IsNumber ());
324325
325326 TwoByteValue value (env->isolate (), args[0 ]);
326327
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++) {
328332 char16_t c = value[i];
329333 if (!IsUnicodeSurrogate (c)) {
330334 continue ;
You can’t perform that action at this time.
0 commit comments