@@ -594,8 +594,9 @@ extract_anchors_from_stmt(const char *segment_str, stmt_ty statement, Py_ssize_t
594594static int
595595extract_anchors_from_line (PyObject * filename , PyObject * line ,
596596 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 )
599600{
600601 int res = -1 ;
601602 PyArena * arena = NULL ;
@@ -638,11 +639,21 @@ extract_anchors_from_line(PyObject *filename, PyObject *line,
638639 res = 0 ;
639640 }
640641
641- done :
642642 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 ;
645655 }
656+ done :
646657 Py_XDECREF (segment );
647658 if (arena ) {
648659 _PyArena_Free (arena );
@@ -665,7 +676,7 @@ ignore_source_errors(void) {
665676
666677static inline int
667678print_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 ,
669680 const char * primary , const char * secondary ) {
670681 int err = 0 ;
671682 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
744755
745756 // Convert the utf-8 byte offset to the actual character offset so we print the right number of carets.
746757 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 );
748761 if (start_offset < 0 ) {
749762 err = ignore_source_errors () < 0 ;
750763 goto done ;
751764 }
752765
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 );
754767 if (end_offset < 0 ) {
755768 err = ignore_source_errors () < 0 ;
756769 goto done ;
@@ -764,6 +777,7 @@ tb_displayline(PyTracebackObject* tb, PyObject *f, PyObject *filename, int linen
764777
765778 if (start_line == end_line ) {
766779 int res = extract_anchors_from_line (filename , source_line , start_offset , end_offset ,
780+ start_difference ,
767781 & left_end_offset , & right_start_offset ,
768782 & primary_error_char , & secondary_error_char );
769783 if (res < 0 && ignore_source_errors () < 0 ) {
@@ -788,8 +802,11 @@ tb_displayline(PyTracebackObject* tb, PyObject *f, PyObject *filename, int linen
788802 end_offset = i + 1 ;
789803 }
790804
805+ start_offset += start_difference ;
806+ end_offset += end_difference ;
807+
791808 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 ,
793810 primary_error_char , secondary_error_char );
794811
795812done :
0 commit comments