Thanks for the help, I understood it now; I also found the test progs.

As far I see, it could already be substituted by the following constructs:

program RHelper1v ;

 type
   poLongint = ^ oLongint ;
   oLongint = object
                li : longint ;
                procedure ShowValue ;
                procedure put ( j : longint ) ;
                Function inc : poLongint ;
               end ;

 procedure oLongInt.showvalue ;

   begin
     Writeln ( 'Value=', li ) ;
    end ;

 procedure oLongInt.put ( j : longint ) ;

   begin
     li := j ;
    end ;

 function oLongInt.inc : polongint ;

   begin
     system.inc ( li ) ;
     result := @self ;
    end ;

 function v ( i : longint ) : polongint ;

   begin
     result := addr(i) ;
    end ;

 var
   i : LongInt ;

begin
 i := 3 ;
 olongint(i).showvalue ;
 olongint(i).put ( 4711 ) ;
 olongint(i).showvalue ;
 olongint(i).inc ;
 olongint(i).showvalue ;
 olongint(v(12345678)^).put ( 4711 ) ;  // senseless, but possible
 olongint(v(12345678)^).inc ;                // senseless, but possible
 olongint(v(12345678)^).showvalue ;     // 4712?
end.

And it produces the same assembler code as the construct TYPE HELPER FOR LONGINT
(which is definitely better readable).

The same program with type helper:

program RHelper1f ;

 type
   pLongInt = ^ longint ;
   tLongIntHelper = type helper for LongInt
                      procedure ShowValue ;
                      procedure put ( j : longint ) ;
                      Function inc : pLongint ;
                     end ;

 procedure TLongIntHelper.showvalue ;

   begin
     Writeln ( 'Value=', self ) ;
    end ;

 procedure TLongIntHelper.put ( j : longint ) ;

   begin
     self := j ;
    end ;

 function tLongInthelper.inc : plongint ;

   begin
     system.inc ( self ) ;
     result := @self ;
    end ;

 var
   i : LongInt ;

begin
 i := 3 ;
 i.showvalue ;
 i.put ( 4711 ) ;
 i.showvalue ;
 i.inc ;
 i.showvalue ;
 12345678.put ( 4711 ) ;  // senseless, but possible
 12345678.inc ;                 // senseless, but possible
 12345678.showvalue ;     // 4712?
end.

The last 3 lines show that the type helpers allow useless code. I assume such useless code is not catchable by the compiler.

Gerhard

----- Original Message ----- From: "Paul Ishenin" <paul.ishe...@gmail.com>
To: "FPC developers' list" <fpc-devel@lists.freepascal.org>
Sent: Friday, February 08, 2013 3:21 PM
Subject: Re: [fpc-devel] Re: [fpc-announce] Feature announcement: Type helpers


08.02.13, 21:52, Gerhard Scholz wrote:

Maybe I didn't understand the syntax correctly: I didn't see how to get
the value inside the method?

By accessing Self

example:

type
   TLongIntHelper = type helper for LongInt
     class procedure ShowValue; static;
   end;

class procedure TLongIntHelper.Test;
begin
   Writeln('Value=',self);
end;

Replace your static class procedure with regular method:

procecure TLongIntHelper.Test;
begin
  WriteLn(Self);
end;

Class static method is only needed if you are going to call it for the type declaration itself like: LongInt.PrintSize:

class procedure TLongIntHelper.PrintSize;
begin
  WriteLn(SizeOf(LongInt));
end;

static methods don't have a magic Self variable.

In any case I suggest to look for test which had been commited together with Sven patch.

Best regards,
Paul Ishenin
_______________________________________________
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel

_______________________________________________
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel

Reply via email to