@@ -1060,6 +1060,8 @@ EPySyntaxError = class (EPyStandardError)
1060
1060
ELineStr: UnicodeString;
1061
1061
ELineNumber: Integer;
1062
1062
EOffset: Integer;
1063
+ EEndLineNumber: Integer;
1064
+ EEndOffset: Integer;
1063
1065
end ;
1064
1066
EPyIndentationError = class (EPySyntaxError);
1065
1067
EPyTabError = class (EPyIndentationError);
@@ -5004,12 +5006,14 @@ procedure TPythonEngine.RaiseError;
5004
5006
5005
5007
function DefineSyntaxError ( E : EPySyntaxError; const sType, sValue : UnicodeString; err_type, err_value : PPyObject ) : EPySyntaxError;
5006
5008
var
5007
- s_value : UnicodeString;
5008
- s_line : UnicodeString;
5009
- s_filename : UnicodeString;
5010
- i_line_number : Integer;
5011
- i_offset : Integer;
5012
- tmp : PPyObject;
5009
+ s_value : UnicodeString;
5010
+ s_line : UnicodeString;
5011
+ s_filename : UnicodeString;
5012
+ i_line_number : Integer;
5013
+ i_offset : Integer;
5014
+ i_end_line_number : Integer;
5015
+ i_end_offset : Integer;
5016
+ tmp : PPyObject;
5013
5017
begin
5014
5018
Result := E;
5015
5019
Result.EName := sType;
@@ -5019,8 +5023,10 @@ procedure TPythonEngine.RaiseError;
5019
5023
s_filename := ' ' ;
5020
5024
i_line_number := 0 ;
5021
5025
i_offset := 0 ;
5026
+ i_end_line_number := 0 ;
5027
+ i_end_offset := 0 ;
5022
5028
// Sometimes there's a tuple instead of instance...
5023
- if PyTuple_Check( err_value ) and (PyTuple_Size( err_value) >= 2 ) then
5029
+ if PyTuple_Check(err_value) and (PyTuple_Size( err_value) >= 2 ) then
5024
5030
begin
5025
5031
s_value := PyObjectAsString(PyTuple_GetItem( err_value, 0 ));
5026
5032
err_value := PyTuple_GetItem( err_value, 1 );
@@ -5065,19 +5071,34 @@ procedure TPythonEngine.RaiseError;
5065
5071
if Assigned(tmp) and PyUnicode_Check(tmp) then
5066
5072
s_value := PyUnicodeAsString(tmp);
5067
5073
Py_XDECREF(tmp);
5074
+ if MajorVersion >= 10 then
5075
+ begin
5076
+ // Get the end offset of the error
5077
+ tmp := PyObject_GetAttrString(err_value, ' end_offset' );
5078
+ if Assigned(tmp) and PyLong_Check(tmp) then
5079
+ i_end_offset := PyLong_AsLong(tmp);
5080
+ Py_XDECREF(tmp);
5081
+ // Get the end line number of the error
5082
+ tmp := PyObject_GetAttrString(err_value, ' end_lineno' );
5083
+ if Assigned(tmp) and PyLong_Check(tmp) then
5084
+ i_end_line_number := PyLong_AsLong(tmp);
5085
+ Py_XDECREF(tmp);
5086
+ end ;
5068
5087
end ;
5069
5088
// If all is ok
5070
5089
if s_value <> ' ' then
5071
5090
begin
5072
5091
with Result do
5073
5092
begin
5074
- Message := Format(' %s: %s (line %d, offset %d): '' %s'' ' , [sType,s_value,i_line_number, i_offset,s_line]);
5075
- EName := sType;
5076
- EValue := s_value;
5077
- EFileName := s_filename;
5078
- ELineNumber := i_line_number;
5079
- EOffset := i_offset;
5080
- ELineStr := s_line;
5093
+ Message := Format(' %s: %s (line %d, offset %d): '' %s'' ' , [sType,s_value,i_line_number, i_offset,s_line]);
5094
+ EName := sType;
5095
+ EValue := s_value;
5096
+ EFileName := s_filename;
5097
+ ELineNumber := i_line_number;
5098
+ EOffset := i_offset;
5099
+ EEndLineNumber := i_end_line_number;
5100
+ EEndOffset := i_end_offset;
5101
+ ELineStr := s_line;
5081
5102
end ;
5082
5103
end
5083
5104
else
0 commit comments