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

Mailing lists / fpc-pascal / 2008-02
8 messages · 4 people · –
Reply by email Subscribe to this list Your subscription
Read-only archive. Use j and k to move between messages.
Why do static class methods in FPC have a "Self" parameter? In Delphi, static class methods do not have a Self parameter.
Jon
Jonathan Benedicto wroteWhy 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
Jonas Maebe wroteI'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
What are "static" class methods?
"Plain" class methods are allowed to be virtual, surely.
Micha
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
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
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
Instance size is a regular class method, not a static class method.
Jonas