@@ -489,15 +489,29 @@ role NQPCursorRole is export {
489
489
method ! BACKREF ($ name ) {
490
490
my $ cur := self . " !cursor_start_cur" ();
491
491
my int $ n := $ ! cstack ?? nqp :: elems ($ ! cstack ) - 1 !! -1 ;
492
- $ n -- while $ n >= 0 && (nqp ::isnull(nqp ::getattr($ ! cstack [$ n ], $ ? CLASS , ' $!name' )) ||
493
- nqp ::getattr($ ! cstack [$ n ], $ ? CLASS , ' $!name' ) ne $ name );
494
- if $ n >= 0 {
495
- my $ subcur := $ ! cstack [$ n ];
496
- my int $ litlen := $ subcur . pos - $ subcur . from ;
492
+ my $ last ;
493
+ my $ first ;
494
+ while $ n >= 0 {
495
+ my $ cs_cur := $ ! cstack [$ n ];
496
+ my $ cs_name := nqp ::getattr($ cs_cur , $ ? CLASS , ' $!name' );
497
+ if ! nqp ::isnull($ cs_name ) && $ cs_name eq $ name {
498
+ if nqp ::isconcrete($ last ) {
499
+ last unless $ cs_cur . pos == $ first . from ;
500
+ }
501
+ else {
502
+ $ last := $ cs_cur ;
503
+ }
504
+ $ first := $ cs_cur ;
505
+ }
506
+ $ n -- ;
507
+ }
508
+ if nqp ::isconcrete($ last ) {
509
+ my int $ from := $ first . from ;
510
+ my int $ litlen := $ last . pos - $ from ;
497
511
my str $ target := nqp ::getattr_s($ ! shared , ParseShared, ' $!target' );
498
512
$ cur . " !cursor_pass" ($ ! pos + $ litlen , ' ' )
499
513
if nqp :: substr ($ target , $ ! pos , $ litlen )
500
- eq nqp :: substr ($ target , $ subcur . from , $ litlen );
514
+ eq nqp :: substr ($ target , $ from , $ litlen );
501
515
}
502
516
$ cur ;
503
517
}
0 commit comments