Recent

Author Topic: [SOLVED] Bad Index Exception cause by TLazSynDisplayBuffer.GetNextHighlighterTok  (Read 3689 times)

Pascal

  • Hero Member
  • *****
  • Posts: 932
Callstack:

Code: Pascal  [Select][+][-]
  1. #0 fpc_raiseexception at :0
  2. #1 GETRANGE(0x166b41f8, -2) at ..\..\laz\components\synedit\synedithighlighter.pp:1813
  3. #2 STARTATLINEINDEX(0x4e0b0c8, -1) at ..\..\laz\components\synedit\synedithighlighter.pp:1551
  4. #3 GETNEXTHIGHLIGHTERTOKEN(0x165f4580, {TOKENSTART = 0x0, TOKENLENGTH = 0, TOKENATTR = 0x0}) at ..\..\laz\components\synedit\synedittextbuffer.pp:382
  5. #4 GETNEXTHIGHLIGHTERTOKEN(0x165716a8, {TOKENSTART = 0x0, TOKENLENGTH = 0, TOKENATTR = 0x0}) at ..\..\laz\components\synedit\lazsynedittext.pas:542
  6. #5 GETNEXTHIGHLIGHTERTOKEN(0x165716a8, {TOKENSTART = 0x0, TOKENLENGTH = 0, TOKENATTR = 0x0}) at ..\..\laz\components\synedit\synedittexttrimmer.pas:348
  7. #6 GETNEXTHIGHLIGHTERTOKEN(0x165f62c0, {TOKENSTART = 0x0, TOKENLENGTH = 0, TOKENATTR = 0x0}) at ..\..\laz\components\synedit\lazsynedittext.pas:542
  8. #7 GETNEXTHIGHLIGHTERTOKENFROMVIEW(0x15294cb8, {TK = {TOKENSTART = 0x9c421c #184, TOKENLENGTH = 354937312, TOKENATTR = 0x4d0f3f4}, ATTR = 0x0, STARTPOS = {PHYSICAL = 354937312, LOGICAL = 80802836, OFFSET = 4391024}, ENDPOS = {PHYSICAL = 354937120, LOGICAL = 354937312, OFFSET = 10240540}, PHYSICALCHARSTART = 354937120, PHYSICALCLIPSTART = 354937312, PHYSICALCHAREND = 354937120, PHYSICALCLIPEND = 80802868, RTLINFO = {ISRTL = 102, PHYSLEFT = 374699392, PHYSRIGHT = 374699392, LOGFIRST = 374699392, LOGLAST = 375052896}, RTLEXPANDEDEXTRABYTES = 0, RTLHASTABS = 255, RTLHASDOUBLEWIDTH = 255, EXPANDEDEXTRABYTES = 81834184, HASTABS = 255, HASDOUBLEWIDTH = 255, NEXTPOS = {PHYSICAL = 80802904, LOGICAL = 4360139, OFFSET = 370170560}, NEXTRTLINFO = {ISRTL = 128, PHYSLEFT = 8243092, PHYSRIGHT = 536870911, LOGFIRST = 375342464, LOGLAST = 80802928}}, -1, 1) at ..\..\laz\components\synedit\lazsyntextarea.pp:679
  9. #8 INITCURMARKUP(0x15294cb8) at ..\..\laz\components\synedit\lazsyntextarea.pp:257
  10. #9 GETNEXTHIGHLIGHTERTOKENEX(0x15294cb8, {TK = {TOKENSTART = 0x4d0f5bc #164#245#208#4#204#247#208#4#1, TOKENLENGTH = 82154696, TOKENATTR = 0x7432713c}, ATTR = 0x743157a4, STARTPOS = {PHYSICAL = 370276696, LOGICAL = 1, OFFSET = 80803072}, ENDPOS = {PHYSICAL = 5719809, LOGICAL = 15, OFFSET = 375342464}, PHYSICALCHARSTART = 82154696, PHYSICALCLIPSTART = 15, PHYSICALCHAREND = 80803088, PHYSICALCLIPEND = 375230120, RTLINFO = {ISRTL = 90, PHYSLEFT = 9821684, PHYSRIGHT = 80803108, LOGFIRST = 5432383, LOGLAST = 15794160}, RTLEXPANDEDEXTRABYTES = 80803132, RTLHASTABS = 145, RTLHASDOUBLEWIDTH = 89, EXPANDEDEXTRABYTES = -285137318, HASTABS = 240, HASDOUBLEWIDTH = 240, NEXTPOS = {PHYSICAL = 80803140, LOGICAL = 82154696, OFFSET = -2147483633}, NEXTRTLINFO = {ISRTL = 90, PHYSLEFT = 80803156, PHYSRIGHT = 4267042, LOGFIRST = 0, LOGLAST = 80803224}}) at ..\..\laz\components\synedit\lazsyntextarea.pp:321
  11. #10 PAINTLINES(0x4d0f634) at ..\..\laz\components\synedit\lazsyntextarea.pp:1716
  12. #11 PAINTTEXTLINES(0x15294c08, {LEFT = 69, TOP = 0, RIGHT = 711, BOTTOM = 17, TOPLEFT = {X = 69, Y = 0}, BOTTOMRIGHT = {X = 711, Y = 17}}, 0, 0, 1, 82) at ..\..\laz\components\synedit\lazsyntextarea.pp:1788
  13. #12 DOPAINT(0x15294c08, 0x152945d8, {LEFT = 69, TOP = 0, RIGHT = 711, BOTTOM = 17, TOPLEFT = {X = 69, Y = 0}, BOTTOMRIGHT = {X = 711, Y = 17}}) at ..\..\laz\components\synedit\lazsyntextarea.pp:1408
  14. #13 PAINT(0x15294c08, 0x152945d8, {LEFT = 67, TOP = 0, RIGHT = 711, BOTTOM = 17, TOPLEFT = {X = 67, Y = 0}, BOTTOMRIGHT = {X = 711, Y = 17}}) at ..\..\laz\components\synedit\syneditmiscclasses.pp:1304
  15. #14 DOPAINT(0x16105a80, 0x152945d8, {LEFT = 0, TOP = 0, RIGHT = 712, BOTTOM = 17, TOPLEFT = {X = 0, Y = 0}, BOTTOMRIGHT = {X = 712, Y = 17}}) at ..\..\laz\components\synedit\lazsyntextarea.pp:1063
  16. #15 PAINT(0x16105a80, 0x152945d8, {LEFT = 0, TOP = 0, RIGHT = 712, BOTTOM = 17, TOPLEFT = {X = 0, Y = 0}, BOTTOMRIGHT = {X = 712, Y = 17}}) at ..\..\laz\components\synedit\syneditmiscclasses.pp:1304
  17. #16 DOPAINT(0x16557530, 0x152945d8, {LEFT = 0, TOP = 0, RIGHT = 712, BOTTOM = 668, TOPLEFT = {X = 0, Y = 0}, BOTTOMRIGHT = {X = 712, Y = 668}}) at primeedit.pas:1056
  18. #17 PAINT(0x16557530, 0x152945d8, {LEFT = 0, TOP = 0, RIGHT = 712, BOTTOM = 668, TOPLEFT = {X = 0, Y = 0}, BOTTOMRIGHT = {X = 712, Y = 668}}) at ..\..\laz\components\synedit\syneditmiscclasses.pp:1304
  19. #18 PAINT(0x165ada60) at ..\..\laz\components\synedit\synedit.pp:3848
  20. #19 CONTROLS$_$TCUSTOMCONTROL_$__$$_PAINTWINDOW$LONGWORD at :0
  21. #20 CONTROLS$_$TWINCONTROL_$__$$_PAINTHANDLER$TLMPAINT at :0
  22. #21 CONTROLS$_$TWINCONTROL_$__$$_WMPAINT$TLMPAINT at :0
  23. #22 CONTROLS$_$TCUSTOMCONTROL_$__$$_WMPAINT$TLMPAINT at :0
  24. #23 SYSTEM$_$TOBJECT_$__$$_DISPATCH$formal at :0
  25. #24 VMT_$CONTROLS_$$_TCUSTOMCONTROL at :0
  26. #25 ?? at :0
  27. #26 CONTROLS$_$TWINCONTROL_$__$$_WNDPROC$TMESSAGE at :0
  28. #27 WNDPROC(0x165ada60, {MSG = 15, WPARAM = -285137318, LPARAM = 80804632, RESULT = 0, WPARAMLO = 9818, WPARAMHI = 61185, WPARAMFILLER = {}, LPARAMLO = 64280, LPARAMHI = 1232, LPARAMFILLER = {}, RESULTLO = 0, RESULTHI = 0, RESULTFILLER = {}}) at ..\..\laz\components\synedit\synedit.pp:5969
  29. #28 LCLMESSAGEGLUE_$$_DELIVERMESSAGE$TOBJECT$formal$$LONGINT at :0
  30. #29 WIN32INT$_$TWINDOWPROCHELPER_$__$$_SENDPAINTMESSAGE$LONGWORD at :0
  31. #30 WIN32INT$_$TWINDOWPROCHELPER_$__$$_DOWINDOWPROC$$LONGINT at :0
  32. #31 WIN32INT_$$_WINDOWPROC$LONGWORD$LONGWORD$LONGINT$LONGINT$$LONGINT at :0
  33. #32 USER32!SetManipulationInputTarget at :0
  34. #33 USER32!CallWindowProcW at :0
  35. #34 USER32!DispatchMessageW at :0
  36. #35 USER32!PeekMessageW at :0
  37. #36 ntdll!KiUserCallbackDispatcher at :0
  38. #37 ?? at :0
  39. #38 USER32!DispatchMessageW at :0
  40. #39 WIN32INT$_$TWIN32WIDGETSET_$__$$_APPPROCESSMESSAGES at :0
  41. #40 FORMS$_$TAPPLICATION_$__$$_HANDLEMESSAGE at :0
  42. #41 FORMS$_$TAPPLICATION_$__$$_RUNLOOP at :0
  43. #42 INTERFACEBASE$_$TWIDGETSET_$__$$_APPRUN$TAPPLICATIONMAINLOOP at :0
  44. #43 FORMS$_$TAPPLICATION_$__$$_RUN at :0
  45. #44 main at primeIDE.lpr:41

Code: Pascal  [Select][+][-]
  1. function TLazSynDisplayBuffer.GetNextHighlighterToken(out ATokenInfo: TLazSynDisplayTokenInfo): Boolean;
  2. begin
  3.   Result := False;
  4.   if not Initialized then exit;
  5.  
  6.   if CurrentTokenHighlighter = nil then begin
  7.     Result := FAtLineStart;
  8.     if not Result then exit;
  9.     ATokenInfo.TokenStart := FBuffer.GetPChar(CurrentTokenLine, ATokenInfo.TokenLength);
  10.     ATokenInfo.TokenAttr := nil;
  11.     FAtLineStart := False;
  12.   end
  13.   else begin
  14.     if FAtLineStart then
  15.       CurrentTokenHighlighter.StartAtLineIndex(CurrentTokenLine); // CurrentTokenLine is -1 here and causes the error
  16.     FAtLineStart := False;    
  17.     ...

Why is CurrentTokeLine = -1 here?
It is initialized to -1 here:

Code: Pascal  [Select][+][-]
  1. procedure TLazSynDisplayViewEx.InitHighlighterTokens(AHighlighter: TSynCustomHighlighter);
  2. begin
  3.   {$IFDEF SynAssert}
  4.   if FInitialized then
  5.     raise Exception.Create('Nested InitHighlighterTokensForLine');
  6.   {$ENDIF}
  7.   FCurrentTokenHighlighter := AHighlighter;
  8.   FCurrentTokenLine := -1;
  9.   FInitialized := True;
  10.   inherited;
  11. end;
  12.  

Any clues?

« Last Edit: August 02, 2016, 09:42:18 am by Pascal »
laz trunk x64 - fpc trunk i386 (cross x64) - Windows 10 Pro x64 (21H2)

Martin_fr

  • Administrator
  • Hero Member
  • *
  • Posts: 12209
  • Debugger - SynEdit - and more
    • wiki
I need some sample code to reproduce....

InitHighlighterTokens is not supposed to set the line.

This happens in SetHighlighterTokensLine, which is called before GetNextHighlighterToken

See LazSynTextArea line 1700
Code: Pascal  [Select][+][-]
  1.       FTokenBreaker.SetHighlighterTokensLine(TV + CurLine, CurTextIndex);
  2.       CharWidths := FTokenBreaker.CharWidths;
  3.       fMarkupManager.PrepareMarkupForRow(CurTextIndex+1);
  4. ....
  5. // line 1715
  6.       while FTokenBreaker.GetNextHighlighterTokenEx(TokenInfoEx) do begin
  7.         DrawHiLightMarkupToken(TokenInfoEx);
  8.       end;
  9.  

TV probably short for TopView.
So what are the values for TV and CurLine?

----------------
The reason that SetHighlighterTokensLine is NOT on TLazSynDisplayViewEx, but instead on TLazSynDisplayBuffer.

There is a chain of TLazSynDisplayView, each forwards calls to FNextView.
The last view is TLazSynDisplayBuffer.

While values are forwarded, they can be modified.

SetHighlighterTokensLine(ALine: TLineIdx; out ARealLine: TLineIdx);
will go through the TLazSynDisplayView, belonging to the fold-module. This can adjust values if lines are folded.

---
There are several concepts of lines:
- Screenlines: The lines currently seen in the window, starting at the first visible line. Not counting invisible(folded) lines.
-  "ViewedLines" = ALL visible lines. This includes lines not on the screen, but that can be scrolled into the screen, without folding to change
- all lines (here real line)



Pascal

  • Hero Member
  • *****
  • Posts: 932
Martin,

TV=0
CurLine=0

after execution of
Code: Pascal  [Select][+][-]
  1.       FTokenBreaker.SetHighlighterTokensLine(TV + CurLine, CurTextIndex);  
CurTextIndex is -1


This is because in
Code: Pascal  [Select][+][-]
  1. procedure TSourceLazSynTopInfoView.SetHighlighterTokensLine(ALine: TLineIdx; out
  2.   ARealLine: TLineIdx);
  3. begin
  4.   CurrentTokenLine := ALine;
  5.   inherited SetHighlighterTokensLine(FLineMap[ALine], ARealLine);
  6. end;  
           
                                                     
FLineMap[ALine] is -1

My derived class of TCustomSynEdit uses TSourceLazSynTopInfoView like in lazarus to show the last
paragraph of a cobol program.

I will further investigate this.
laz trunk x64 - fpc trunk i386 (cross x64) - Windows 10 Pro x64 (21H2)

Pascal

  • Hero Member
  • *****
  • Posts: 932
Martin,

forget about it.

I had introduced an error which causes the FLineMap[0] to be set to -1.
laz trunk x64 - fpc trunk i386 (cross x64) - Windows 10 Pro x64 (21H2)

 

TinyPortal © 2005-2018