Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / fpc-pascal / 2008-02

static class methods

8 messages · 4 people · –

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

Jonathan Benedicto

Why do static class methods in FPC have a "Self" parameter? In Delphi, static class methods do not have a Self parameter.

Jon

Jonas Maebe
to Jonathan Benedicto
Jonathan Benedicto wrote
Why do static class methods in FPC have a "Self" parameter? In Delphi, static class methods do not have a Self parameter.

You need them to correctly handle cases like this:

***
{$ifdef fpc}
{$mode delphi}
{$endif}
type
   tc = class
     class procedure callme;
     class procedure test; virtual;
   end;
   td = class(tc)
     class procedure test; override;
   end;
class procedure tc.callme;
begin
   test;
end;
class procedure tc.test;
begin
   writeln('tc.test called, although td.test should be called');
end;
class procedure td.test;
begin
   writeln('td.test correctly called');
end;
var
   c: tc;
begin
   c:=td.create;
   c.callme;
   c.free;
end.

***

I'm not sure how Delphi could handle this without passing the VMT as invisible parameter (and from a cursory look at the code generated by Kylix, it does appear to pass the VMT).

Jonas

Jonathan Benedicto
to Jonas Maebe
Jonas Maebe wrote
I'm not sure how Delphi could handle this without passing the VMT as invisible parameter (and from a cursory look at the code generated by Kylix, it does appear to pass the VMT).

Delphi doesn't allow static class methods to be virtual.

Jon

Micha Nelissen
to Jonathan Benedicto
Jonathan Benedicto wrote 6 lines
Jonas Maebe wrote: > I'm not sure how Delphi could handle this without passing the VMT as > invisible parameter (and from a cursory look at the code generated by > Kylix, it does appear to pass the VMT). Delphi doesn't allow static class methods to be virtual.

What are "static" class methods?

"Plain" class methods are allowed to be virtual, surely.

Micha

Jonathan Benedicto
to Micha Nelissen

Micha Nelissen:

What are "static" class methods? From RAD Studio 2007's Help file on Methods

(ms-help://borland.bds5/devcommon/methods_xml.html):

Like class methods, class static methods can be accessed without an object reference. Unlike ordinary class methods, class static methods have no Self also cannot access any instance members. (They still have access to class fields, class properties, and class methods.) Also unlike class methods, class static methods cannot be declared virtual. Methods are made class static by appending the word static to their declaration.

"Plain" class methods are allowed to be virtual, surely.

Yes, "plain" class methods can be virtual, and can be overridden.

Jon

Jonas Maebe
to Jonathan Benedicto
Jonathan Benedicto wrote 11 lines
> From RAD Studio 2007's Help file on Methods (ms-help://borland.bds5/devcommon/methods_xml.html): Like class methods, class static methods can be accessed without an object reference. Unlike ordinary class methods, class static methods have no Self also cannot access any instance members. (They still have access to class fields, class properties, and class methods.) Also unlike class methods, class static methods cannot be declared virtual. Methods are made class static by appending the word static to their declaration.

In that case the reason that FPC passes a self pointer is probably simply because no special support was ever added for static class methods (static is parsed for class methods, but I guess nothing is done with it afterwards). Feel free to submit a bug report.

Jonas

Peter Vreman
Show quoted text 19 lines
On 06 Feb 2008, at 23:19, Jonathan Benedicto wrote: >> From RAD Studio 2007's Help file on Methods > (ms-help://borland.bds5/devcommon/methods_xml.html): > > Like class methods, class static methods can be accessed without an > object reference. Unlike ordinary class methods, class static > methods have no Self also cannot access any > instance members. (They still have access to class fields, class > properties, and class methods.) Also unlike class methods, class > static methods cannot be declared virtual. > Methods are made class static by appending the word static to their > declaration. In that case the reason that FPC passes a self pointer is probably simply because no special support was ever added for static class methods (static is parsed for class methods, but I guess nothing is done with it afterwards). Feel free to submit a bug report.

Disabling self is not possible. It is required and also used in our RTL:

     class function TObject.InstanceSize : SizeInt;
       begin
          InstanceSize:=pSizeInt(pointer(self)+vmtInstanceSize)^;
       end;

Peter

Jonas Maebe
to Peter Vreman
Peter Vreman wrote 7 lines
Disabling self is not possible. It is required and also used in our RTL: class function TObject.InstanceSize : SizeInt; begin InstanceSize:=pSizeInt(pointer(self)+vmtInstanceSize)^; end;

Instance size is a regular class method, not a static class method.

Jonas