[lazarus] Bugs and patch
Jeroen van Iddekinge
iddekingej at lycos.com
Sun Dec 22 11:39:12 EST 2002
Hi,
I have found the following errors in lazarus:
propedits.pp/TPropertyEditor.PropDrawName
=================================
Untialised value:
Style.systemfont is not set.
GtkObject.inc/TGtkObject.Create
========================
Memory leak:
FGtkToolTips is first created with gtk_tooltips_new.
After the tool tips are created, the functuon gtk_object_ref is called
and the refcount is set
to 2. In TGtkObject.Destroy the recount of the tool tips is still 2.
Because "unref" is
only called once the tool tips are not destroyed.
GtkObject.inc/GTKProc.SetStyle
========================
Memmory leak:
A Gtk-Tooltips group is created but never deleted.
Patch:
BaseCodeTools.pas/SearchCodeInSource
==============================
I rewrote this functies, and looks now cleaner and is faster.
Attachment contains the patch for this (The errors mention above are NOT
patched
with this file).
Hopefuly is usefull.
Saluti,
Jer
Only in /home/jeroen/source/laz2/lazarus/components/codetools: basiccodetools.bkp
diff -ur components/codetools/basiccodetools.pas /home/jeroen/source/laz2/lazarus/components/codetools/basiccodetools.pas
--- components/codetools/basiccodetools.pas Sat Nov 30 10:12:49 2002
+++ /home/jeroen/source/laz2/lazarus/components/codetools/basiccodetools.pas Sun Dec 22 17:11:20 2002
@@ -864,56 +864,67 @@
Result:=true;
end;
+function ReadNextPascalAtomEx(const Source : string;var Position,EndPosition : integer;CaseSensitive : boolean; var Atom : string):boolean;
+begin
+ Atom := ReadNextPascalAtom(Source,Position,EndPosition);
+ if CaseSensitive then lowerCase(Atom);
+ Result := (Position > length(Source));
+end;
+
+// search pascal atoms of Find in Source
+
function SearchCodeInSource(const Source,Find:string; StartPos:integer;
var EndFoundPosition:integer; CaseSensitive:boolean):integer;
-// search pascal atoms of Find in Source
-var FindAtomStart,FindPos,Position,AtomStart
- ,FirstSrcAtomStart,FirstSrcAtomEnd:integer;
- FindAtom,SrcAtom:string;
+var
+ FindAtomStart : integer;
+ FindPos : integer;
+ Position : integer;
+ AtomStart : integer;
+ FirstSrcAtomStart : integer;
+ CompareSrcPosition: integer;
+ FindAtom : string ;
+ SrcAtom : string;
+ HasFound : boolean;
+ FirstFindAtom : string;
+ FirstFindPos : integer;
begin
Result:=-1;
if (Find='') or (StartPos>length(Source)) then exit;
+
Position:=StartPos;
+ FirstFindPos:=1;
+
+ {search first atom in find}
+
+ if ReadNextPascalAtomEx(Find,FirstFindPos,FindAtomStart,CaseSensitive,FirstFindAtom) then exit;
+
repeat
- // search first atom in find
- FindPos:=1;
- ReadNextPascalAtom(Find,FindPos,FindAtomStart);
- FindAtom:=copy(Find,FindAtomStart,FindPos-FindAtomStart);
- if FindAtom='' then exit;
- if not CaseSensitive then FindAtom:=lowercase(FindAtom);
- // search first atom in source
- repeat
- ReadNextPascalAtom(Source,Position,AtomStart);
- SrcAtom:=copy(Source,AtomStart,Position-AtomStart);
- if not CaseSensitive then SrcAtom:=lowercase(SrcAtom);
- until (Position>length(Source)) or (SrcAtom=FindAtom);
- if SrcAtom=FindAtom then begin
- // first atom found
- FirstSrcAtomStart:=AtomStart;
- FirstSrcAtomEnd:=Position;
- // compare the rest of Find
+
+ if ReadNextPascalAtomEx(Source,Position,AtomStart,CaseSensitive,SrcAtom) then break;
+
+ if SrcAtom=FirstFindAtom then begin
+ {first atom found}
+ FirstSrcAtomStart := AtomStart;
+ CompareSrcPosition := Position;
+ FindPos := FirstFindPos;
+
+ {read next source and find atoms and compare}
+
repeat
- // get next atom in find
- ReadNextPascalAtom(Find,FindPos,FindAtomStart);
- FindAtom:=copy(Find,FindAtomStart,FindPos-FindAtomStart);
- if FindAtom='' then break;
- if not CaseSensitive then FindAtom:=lowercase(FindAtom);
- // compare to next atom in source
- ReadNextPascalAtom(Source,Position,AtomStart);
- SrcAtom:=copy(Source,AtomStart,Position-AtomStart);
- if not CaseSensitive then SrcAtom:=lowercase(SrcAtom);
- until (SrcAtom<>FindAtom);
- if (FindAtom='') and (FindAtomStart>length(Find)) then begin
- // code found
- Result:=FirstSrcAtomStart;
- EndFoundPosition:=Position;
- exit;
- end;
- end else begin
- // first atom not found
- exit;
- end;
- Position:=FirstSrcAtomEnd;
+
+ if ReadNextPascalAtomEx(Find,FindPos,FindAtomStart,CaseSensitive,FindAtom) then break;
+ if ReadNextPascalAtomEx(Source,CompareSrcPosition,AtomStart,CaseSensitive,SrcAtom) then break;
+
+ HasFound := SrcAtom = FindAtom;
+
+ if HasFound then begin
+ Result := FirstSrcAtomStart;
+ EndFoundPosition := CompareSrcPosition;
+ exit;
+ end;
+
+ until not(HasFound);
+ end;
until false;
end;
More information about the Lazarus
mailing list