Project JEDI - Issue Tracker
Mantis Bugtracker

Viewing Issue Simple Details Jump to Notes ] View Advanced ] Issue History ] Print ]
ID Category Severity Reproducibility Date Submitted Last Update
0006192 [JEDI VCL] 00 JVCL Components major always 2013-08-27 00:33 2015-09-14 13:20
Reporter mr View Status public  
Assigned To obones
Priority normal Resolution fixed  
Status resolved   Product Version Daily / GIT
Summary 0006192: JvInterpreterAdapter - wrong sorting in SortMethodIdentifier
Description In TJvInterpreterAdapter.GetValue.GetMethod sorting by inheritance of class is needed to correct call last (by inheritance) defined get method(FGetList) - i observed error there.
I can experimentaly reproduce problem on small set - please add via TJvInterpreterAdapter.SharedAdapter.AddGet method called "Method" in order :
TMyForm
TForm
TChart
TMyGrid
TScrollingWinControl
TWinControl
TControl
TComponent

and after first call TJvInterpreterAdapter.Sort we get wrong order :
TMyGrid
TScrollingWinControl
TChart
TMyForm
TForm
TWinControl
TControl
TComponent

wrong because TMyForm and TForm inherits from TScrollingWinControl, and should be above it to correct call TMyForm.Method instead of TScrollingWinControl.Method.

solution is small change in procedure JvInterpreter.SortMethodIdentifier - from:

function SortMethodIdentifier(Item1, Item2: Pointer): Integer;
begin
  Result := AnsiStrIComp(PChar(TJvInterpreterIdentifier(Item1).Identifier),
    PChar(TJvInterpreterIdentifier(Item2).Identifier));

  if (Result = 0) and (Item1 <> Item2) then
  begin
    if TJvInterpreterMethod(Item1).FClassType.InheritsFrom(TJvInterpreterMethod(Item2).FClassType) then
      Result := -1
    else
    if TJvInterpreterMethod(Item2).FClassType.InheritsFrom(TJvInterpreterMethod(Item1).FClassType) then
      Result := 1;
  end;
end;

to :

function SortMethodIdentifier(Item1, Item2: Pointer): Integer;
begin
  Result := AnsiStrIComp(PChar(TJvInterpreterIdentifier(Item1).Identifier),
    PChar(TJvInterpreterIdentifier(Item2).Identifier));

  if (Result = 0) and (Item1 <> Item2) then
  begin
    if TJvInterpreterMethod(Item1).FClassType.InheritsFrom(TJvInterpreterMethod(Item2).FClassType) then
      Result := -1
    else
      Result := 1;
  end;
end;

i can't clearly explain why it's happend (original code looks good at first glance), but itsems to me that quicksort is not good choice for sorting here. this change, helps in my cases so far.

i use delphi xe2, all tests were done on "Debug Configuration"
Additional Information bellow is my test case method from dunit:

type
  TMyForm = class(TForm);
  TMyGrid = class(TWinControl);
  TJvAA = class(TJvInterpreterAdapter);
  TJvMA = class(TJvInterpreterMethod);

procedure TTestItpt_Basics.Test_MethodOrderEx4;
var
  itpt: TJvInterpreterProgram;

  procedure DumpGL(fn: string);
  var
    i: Integer;
    sl: TStringList;
  begin
    sl := TStringList.Create;
    for i := 0 to itpt.SharedAdapter.GetList.Count - 1 do
      sl.Add(TjvMA(itpt.SharedAdapter.GetList.Items[i]).FClassType.ClassName);
    sl.SaveToFile(fn);
    sl.Free;
  end;

begin
  itpt := TJvInterpreterProgram.Create(nil);
  try
    TJvAA(itpt.SharedAdapter).Clear;
    itpt.SharedAdapter.AddGet(TMyForm, 'Method', nil, 0, [], varEmpty);
    itpt.SharedAdapter.AddGet(TForm, 'Method', nil, 0, [], varEmpty);
    itpt.SharedAdapter.AddGet(TChart, 'Method', nil, 0, [], varEmpty);
    itpt.SharedAdapter.AddGet(TMyGrid, 'Method', nil, 0, [], varEmpty);
    itpt.SharedAdapter.AddGet(TScrollingWinControl, 'Method', nil, 0, [], varEmpty);
    itpt.SharedAdapter.AddGet(TWinControl, 'Method', nil, 0, [], varEmpty);
    itpt.SharedAdapter.AddGet(TControl, 'Method', nil, 0, [], varEmpty);
    itpt.SharedAdapter.AddGet(TComponent, 'Method', nil, 0, [], varEmpty);

    DumpGL('cre0.txt');
    TJvAA(itpt.SharedAdapter).Sort;
    DumpGL('cre1.txt');
  finally
    itpt.Free;
  end;
end;
Tags No tags attached.
Attached Files zip file icon jviTest.zip [^] (9,396 bytes) 2013-12-13 21:27

- Relationships

-  Notes
(0020740)
obones (administrator)
2013-12-13 11:02

Please try with the latest JVCL version in GIT (or daily zip) and then send us a zipped file containing the sources of an application showing the issue.
(0020844)
mr (reporter)
2013-12-13 21:48

i checked git version also.
i uploaded zip with dunit project - in "TTest1" "Test_MethodOrder" demonstrated result after wrong sort, "Test_MethodOrderOk" is modified test with proposed "SortMethodIdentifier". Of course it's abstract and simplified example - and without real script demonstrating problem, but i think it's not necessary.
(0020878)
obones (administrator)
2013-12-18 15:24

This is now fixed in GIT

- Issue History
Date Modified Username Field Change
2013-08-27 00:33 mr New Issue
2013-12-13 11:02 obones Note Added: 0020740
2013-12-13 11:02 obones Status new => feedback
2013-12-13 21:27 mr File Added: jviTest.zip
2013-12-13 21:48 mr Note Added: 0020844
2013-12-16 17:04 obones Status feedback => acknowledged
2013-12-18 15:24 obones Note Added: 0020878
2013-12-18 15:24 obones Status acknowledged => resolved
2013-12-18 15:24 obones Fixed in Version => Daily / GIT
2013-12-18 15:24 obones Resolution open => fixed
2013-12-18 15:24 obones Assigned To => obones
2015-09-14 13:20 obones Fixed in Version Daily / GIT => 3.48


Mantis 1.1.6[^]
Copyright © 2000 - 2008 Mantis Group
Powered by Mantis Bugtracker