[fpc-pascal] Assigning a virtual class method to a method pointer
    Joao Morais 
    post at joaomorais.com.br
       
    Sun Feb 25 02:41:54 CET 2007
    
    
  
Hello,
I need to check if a virtual class method was implemented in an specific
subclass. I am assigning two methods to two method pointers, casting to
tmethod and comparing its code fields. The application raises a
segmentation fault in this line:
     vmethodptr2 := @tbaseclassref(classparent).classmethod;
The following code raises the exception using both 2.0.4 and 2.1.1.
====
{$mode objfpc}
program testclass;
type
   tbaseclassref = class of tbaseclass;
   tbaseclass = class(tobject)
   public
     class function classmethod: string; virtual;
     class function implementsclassmethod: boolean;
   end;
   tinheritedyesclass = class(tbaseclass)
   public
     class function classmethod: string; override;
   end;
   tinheritednoclass = class(tbaseclass)
   end;
class function tbaseclass.implementsclassmethod: boolean;
var
   vmethodptr1, vmethodptr2: function: string of object;
begin
   if self <> tbaseclass then
   begin
     vmethodptr1 := @classmethod;
     // here is the problem
     vmethodptr2 := @tbaseclassref(classparent).classmethod;
     result := tmethod(vmethodptr1).code <> tmethod(vmethodptr2).code;
   end else
     result := false;
end;
class function tbaseclass.classmethod: string;
begin
   result := '';
end;
class function tinheritedyesclass.classmethod: string;
begin
   result := 'some stuff';
end;
const
   cboolvalues: array[boolean] of string = ('no', 'yes');
begin
   writeln(cboolvalues[tinheritedyesclass.implementsclassmethod]);
   writeln(cboolvalues[tinheritednoclass.implementsclassmethod]);
end.
====
Am I doing something wrong or this is a bug?
Thanks,
--
Joao Morais
    
    
More information about the fpc-pascal
mailing list