File tree 2 files changed +31
-2
lines changed
2 files changed +31
-2
lines changed Original file line number Diff line number Diff line change @@ -577,8 +577,11 @@ function commonPrefix(strings) {
577
577
578
578
Interface . prototype . _wordLeft = function ( ) {
579
579
if ( this . cursor > 0 ) {
580
+ // Reverse the string and match a word near beginning
581
+ // to avoid quadratic time complexity
580
582
var leading = this . line . slice ( 0 , this . cursor ) ;
581
- var match = leading . match ( / (?: [ ^ \w \s ] + | \w + | ) \s * $ / ) ;
583
+ var reversed = leading . split ( '' ) . reverse ( ) . join ( '' ) ;
584
+ var match = reversed . match ( / ^ \s * (?: [ ^ \w \s ] + | \w + ) ? / ) ;
582
585
this . _moveCursor ( - match [ 0 ] . length ) ;
583
586
}
584
587
} ;
@@ -634,8 +637,11 @@ Interface.prototype._deleteRight = function() {
634
637
635
638
Interface . prototype . _deleteWordLeft = function ( ) {
636
639
if ( this . cursor > 0 ) {
640
+ // Reverse the string and match a word near beginning
641
+ // to avoid quadratic time complexity
637
642
var leading = this . line . slice ( 0 , this . cursor ) ;
638
- var match = leading . match ( / (?: [ ^ \w \s ] + | \w + | ) \s * $ / ) ;
643
+ var reversed = leading . split ( '' ) . reverse ( ) . join ( '' ) ;
644
+ var match = reversed . match ( / ^ \s * (?: [ ^ \w \s ] + | \w + ) ? / ) ;
639
645
leading = leading . slice ( 0 , leading . length - match [ 0 ] . length ) ;
640
646
this . line = leading + this . line . slice ( this . cursor , this . line . length ) ;
641
647
this . cursor = leading . length ;
Original file line number Diff line number Diff line change @@ -1272,3 +1272,26 @@ const crlfDelay = Infinity;
1272
1272
} ) , delay ) ;
1273
1273
}
1274
1274
} ) ;
1275
+
1276
+ // Ensure that the _wordLeft method works even for large input
1277
+ {
1278
+ const input = new Readable ( {
1279
+ read ( ) {
1280
+ this . push ( '\x1B[1;5D' ) ; // CTRL + Left
1281
+ this . push ( null ) ;
1282
+ } ,
1283
+ } ) ;
1284
+ const output = new Writable ( {
1285
+ write : common . mustCall ( ( data , encoding , cb ) => {
1286
+ assert . strictEqual ( rl . cursor , rl . line . length - 1 ) ;
1287
+ cb ( ) ;
1288
+ } ) ,
1289
+ } ) ;
1290
+ const rl = new readline . createInterface ( {
1291
+ input : input ,
1292
+ output : output ,
1293
+ terminal : true ,
1294
+ } ) ;
1295
+ rl . line = `a${ ' ' . repeat ( 1e6 ) } a` ;
1296
+ rl . cursor = rl . line . length ;
1297
+ }
You can’t perform that action at this time.
0 commit comments