@@ -594,8 +594,9 @@ extract_anchors_from_stmt(const char *segment_str, stmt_ty statement, Py_ssize_t
594
594
static int
595
595
extract_anchors_from_line (PyObject * filename , PyObject * line ,
596
596
Py_ssize_t start_offset , Py_ssize_t end_offset ,
597
- Py_ssize_t * left_anchor , Py_ssize_t * right_anchor ,
598
- char * * primary_error_char , char * * secondary_error_char )
597
+ Py_ssize_t start_difference , Py_ssize_t * left_anchor ,
598
+ Py_ssize_t * right_anchor , char * * primary_error_char ,
599
+ char * * secondary_error_char )
599
600
{
600
601
int res = -1 ;
601
602
PyArena * arena = NULL ;
@@ -638,11 +639,21 @@ extract_anchors_from_line(PyObject *filename, PyObject *line,
638
639
res = 0 ;
639
640
}
640
641
641
- done :
642
642
if (res > 0 ) {
643
- * left_anchor += start_offset ;
644
- * right_anchor += start_offset ;
643
+ Py_ssize_t left_difference , right_difference ;
644
+
645
+ * left_anchor = _PyPegen_byte_offset_to_character_offset (segment , * left_anchor , & left_difference );
646
+ * right_anchor = _PyPegen_byte_offset_to_character_offset (segment , * right_anchor , & right_difference );
647
+
648
+ if (* left_anchor < 0 || * right_anchor < 0 ) {
649
+ res = -1 ;
650
+ goto done ;
651
+ }
652
+
653
+ * left_anchor += start_offset + start_difference + left_difference ;
654
+ * right_anchor += start_offset + start_difference + right_difference ;
645
655
}
656
+ done :
646
657
Py_XDECREF (segment );
647
658
if (arena ) {
648
659
_PyArena_Free (arena );
@@ -665,7 +676,7 @@ ignore_source_errors(void) {
665
676
666
677
static inline int
667
678
print_error_location_carets (PyObject * f , int offset , Py_ssize_t start_offset , Py_ssize_t end_offset ,
668
- Py_ssize_t right_start_offset , Py_ssize_t left_end_offset ,
679
+ Py_ssize_t left_end_offset , Py_ssize_t right_start_offset ,
669
680
const char * primary , const char * secondary ) {
670
681
int err = 0 ;
671
682
int special_chars = (left_end_offset != -1 || right_start_offset != -1 );
@@ -744,13 +755,15 @@ tb_displayline(PyTracebackObject* tb, PyObject *f, PyObject *filename, int linen
744
755
745
756
// Convert the utf-8 byte offset to the actual character offset so we print the right number of carets.
746
757
assert (source_line );
747
- Py_ssize_t start_offset = _PyPegen_byte_offset_to_character_offset (source_line , start_col_byte_offset );
758
+
759
+ Py_ssize_t start_difference , end_difference ;
760
+ Py_ssize_t start_offset = _PyPegen_byte_offset_to_character_offset (source_line , start_col_byte_offset , & start_difference );
748
761
if (start_offset < 0 ) {
749
762
err = ignore_source_errors () < 0 ;
750
763
goto done ;
751
764
}
752
765
753
- Py_ssize_t end_offset = _PyPegen_byte_offset_to_character_offset (source_line , end_col_byte_offset );
766
+ Py_ssize_t end_offset = _PyPegen_byte_offset_to_character_offset (source_line , end_col_byte_offset , & end_difference );
754
767
if (end_offset < 0 ) {
755
768
err = ignore_source_errors () < 0 ;
756
769
goto done ;
@@ -764,6 +777,7 @@ tb_displayline(PyTracebackObject* tb, PyObject *f, PyObject *filename, int linen
764
777
765
778
if (start_line == end_line ) {
766
779
int res = extract_anchors_from_line (filename , source_line , start_offset , end_offset ,
780
+ start_difference ,
767
781
& left_end_offset , & right_start_offset ,
768
782
& primary_error_char , & secondary_error_char );
769
783
if (res < 0 && ignore_source_errors () < 0 ) {
@@ -788,8 +802,11 @@ tb_displayline(PyTracebackObject* tb, PyObject *f, PyObject *filename, int linen
788
802
end_offset = i + 1 ;
789
803
}
790
804
805
+ start_offset += start_difference ;
806
+ end_offset += end_difference ;
807
+
791
808
err = print_error_location_carets (f , truncation , start_offset , end_offset ,
792
- right_start_offset , left_end_offset ,
809
+ left_end_offset , right_start_offset ,
793
810
primary_error_char , secondary_error_char );
794
811
795
812
done :
0 commit comments