@@ -576,7 +576,16 @@ protected static JsonPointer _parseTail(String input) {
576
576
++i ;
577
577
// quoting is different; offline this case
578
578
if (c == '~' && i < end ) { // possibly, quote
579
- return _parseQuotedTail (input , i );
579
+ // 04-Oct-2022, tatu: Let's decode escaped segment
580
+ // instead of recursive call
581
+ StringBuilder sb = new StringBuilder (32 );
582
+ i = _extractEscapedSegment (input , i , sb );
583
+ final String segment = sb .toString ();
584
+ if (i < 0 ) { // end!
585
+ return new JsonPointer (input , segment , EMPTY );
586
+ }
587
+ return new JsonPointer (input , segment ,
588
+ _parseTail (input .substring (i )));
580
589
}
581
590
// otherwise, loop on
582
591
}
@@ -585,26 +594,29 @@ protected static JsonPointer _parseTail(String input) {
585
594
}
586
595
587
596
/**
588
- * Method called to parse tail of pointer path, when a potentially
589
- * escaped character has been seen.
597
+ * Method called to extract the next segment of the path, in case
598
+ * where we seem to have encountered a (tilde-)escaped character
599
+ * within segment.
590
600
*
591
601
* @param input Full input for the tail being parsed
592
602
* @param i Offset to character after tilde
603
+ * @param sb StringBuilder into which unquoted segment is added
593
604
*
594
- * @return Pointer instance constructed
605
+ * @return Offset at which slash was encountered, if any, or -1
606
+ * if expression ended without seeing unescaped slash
595
607
*/
596
- protected static JsonPointer _parseQuotedTail (String input , int i ) {
608
+ protected static int _extractEscapedSegment (String input , int i ,
609
+ StringBuilder sb )
610
+ {
597
611
final int end = input .length ();
598
- StringBuilder sb = new StringBuilder (Math .max (16 , end ));
599
612
if (i > 2 ) {
600
613
sb .append (input , 1 , i -1 );
601
614
}
602
615
_appendEscape (sb , input .charAt (i ++));
603
616
while (i < end ) {
604
617
char c = input .charAt (i );
605
618
if (c == '/' ) { // end is nigh!
606
- return new JsonPointer (input , sb .toString (),
607
- _parseTail (input .substring (i )));
619
+ return i ;
608
620
}
609
621
++i ;
610
622
if (c == '~' && i < end ) {
@@ -614,7 +626,18 @@ protected static JsonPointer _parseQuotedTail(String input, int i) {
614
626
sb .append (c );
615
627
}
616
628
// end of the road, last segment
617
- return new JsonPointer (input , sb .toString (), EMPTY );
629
+ return -1 ;
630
+ }
631
+
632
+ private static void _appendEscape (StringBuilder sb , char c ) {
633
+ if (c == '0' ) {
634
+ c = '~' ;
635
+ } else if (c == '1' ) {
636
+ c = '/' ;
637
+ } else {
638
+ sb .append ('~' );
639
+ }
640
+ sb .append (c );
618
641
}
619
642
620
643
protected JsonPointer _constructHead ()
@@ -642,17 +665,6 @@ protected JsonPointer _constructHead(int suffixLength, JsonPointer last)
642
665
_matchingElementIndex , next ._constructHead (suffixLength , last ));
643
666
}
644
667
645
- private static void _appendEscape (StringBuilder sb , char c ) {
646
- if (c == '0' ) {
647
- c = '~' ;
648
- } else if (c == '1' ) {
649
- c = '/' ;
650
- } else {
651
- sb .append ('~' );
652
- }
653
- sb .append (c );
654
- }
655
-
656
668
/*
657
669
/**********************************************************
658
670
/* Support for JDK serialization (2.14+)
0 commit comments