[Lazarus] New preprocessor directive

Michael Van Canneyt michael at freepascal.org
Sun May 17 10:50:19 CEST 2015


Hello,

As you probably know, it is possible to include source filename, line number, date etc. in your source
with the following directives:
{$I %FILENAME%}
{$I %LINE%}
{$i %DATE%}

At my request, Florian added

{$I %CURRENTROUTINE%}

to the list of possibilities, which means you can do nifty things as:

program testcr;

{$mode objfpc}

Type
   TMyClass = Class(TObject)
   Public
     Procedure MyMethod;
   end;

Var
   Indent : Integer;

Procedure MethodEnter(Const AMethod : String);
begin
   Writeln(StringOfChar(' ',Indent),'Entering ',AMethod);
   Inc(Indent,2);
end;

Procedure MethodExit(Const AMethod : String);
begin
   Dec(Indent,2);
   if Indent<0 then Indent:=0;
   Writeln(StringOfChar(' ',Indent),'Exiting ',AMethod);
end;

Procedure Debug(Const AMsg : String);

begin
  Writeln(StringOfChar(' ',Indent),AMsg);
end;

Procedure DoSomething;

   Procedure DoNested;

   begin
     MethodEnter({$I %CURRENTROUTINE%});
     Debug('Nested handling in '+{$I %CURRENTROUTINE%});
     MethodExit({$I %CURRENTROUTINE%});
   end;

begin
   MethodEnter({$I %CURRENTROUTINE%});
   Debug('Doing something in '+{$I %CURRENTROUTINE%}+' at line '+{$I %LINE%});
   DoNested;
   MethodExit({$I %CURRENTROUTINE%});
end;

Procedure TMyClass.MyMethod;

   Procedure DoNested;

   begin
     MethodEnter({$I %CURRENTROUTINE%});
     Debug('Nested handling in '+{$I %CURRENTROUTINE%});
     MethodExit({$I %CURRENTROUTINE%});
   end;

begin
   MethodEnter({$I %CURRENTROUTINE%});
   Debug('Doing some things in '+{$I %CURRENTROUTINE%}+' at line '+{$I %LINE%});
   DoNested;
   MethodExit({$I %CURRENTROUTINE%});
end;


Var
   T : TMyClass;

begin
   MethodEnter({$I %CURRENTROUTINE%});
   DoSomething;
   T:=TMyClass.Create;
   try
     T.MyMethod;
   finally
     T.Free;
   end;
   MethodExit({$I %CURRENTROUTINE%});
end.

Which produces something like

Entering $main
   Entering DoSomething
     Doing something in DoSomething at line 44
     Entering DoNested
       Nested handling in DoNested
     Exiting DoNested
   Exiting DoSomething
   Entering MyMethod
     Doing some things in MyMethod at line 61
     Entering DoNested
       Nested handling in DoNested
     Exiting DoNested
   Exiting MyMethod
Exiting $main

Kudos to Florian.

Michael.




More information about the Lazarus mailing list