> On Apr 11, 2023, at 4:02 PM, Marco van de Voort via fpc-devel > <fpc-devel@lists.freepascal.org> wrote: > > That's what I thought, yes. But the whole analysis stays the same: > > - you don't have a list of all possible polymorphic types in the application > when you compile the average dispatch point, that is in the realm of > whole-program optimization. (I saw your later mail that you understood > this, but I already composed this message when it arrived)
Yeah I think that’s kind of kills the idea. Btw, I was curious because I haven’t done this in so many years but is this basically how a VTable looks in procedural code? The idea is that the record adds all function pointers from all the descendants and fills them out with local implementation as pseudo-overriding. ============================================ {$mode objfpc} program procedural_oop; uses UDog, UAnimal; var dog: PDog; begin dog := TDog_Init; dog^.walk_proc(PAnimal(dog)); dog^.bark_proc(dog); end. ============================================ {$mode objfpc} unit UDog; interface uses UAnimal; type PDog = ^TDog; TDog = record // TAnimal methods walk_proc: procedure(self: PAnimal); // TDog methods bark_proc: procedure(self: PDog); // instance members sound: string; end; function TDog_Init: PDog; procedure TDog_Bark(self: PDog); implementation procedure TDog_Bark(self: PDog); begin writeln('dog goes ', self^.sound); end; function TDog_Init: PDog; begin result := PDog(GetMem(sizeof(TDog))); // setup methods result^.walk_proc := @TAnimal_Walk; // use parent implementation result^.bark_proc := @TDog_Bark; // override with current implementation // init members result^.sound := 'woof!' end; end. ============================================ {$mode objfpc} unit UAnimal; interface type PAnimal = ^TAnimal; TAnimal = record walk_proc: procedure(self: PAnimal); end; function TAnimal_Init: PAnimal; procedure TAnimal_Walk(self: PAnimal); implementation procedure TAnimal_Walk(self: PAnimal); begin writeln('animal walks'); end; function TAnimal_Init: PAnimal; begin result := PAnimal(GetMem(sizeof(TAnimal))); // setup methods result^.walk_proc := @TAnimal_Walk; end; end. Regards, Ryan Joseph _______________________________________________ fpc-devel maillist - fpc-devel@lists.freepascal.org https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel