Thank you Peter. TMethod would have been handy if i knew about this back then. For delphi compatibility, I had to do this:
program methodpointer; uses Classes, sysutils; type TMyEvent = procedure of object; TMyClass = class(TObject) procedure MyMethod; end; { TMyClass } procedure TMyClass.MyMethod; begin end; var MyEvent : TMyEvent; Addr : ^TMethod; MyClass: TMyClass = nil; begin writeln(hexStr(TMethod(TMyEvent(MyClass.MyMethod)).Code)); writeln(hexStr(TMethod(TMyEvent(MyClass.MyMethod)).Data)); MyClass := TMyClass.Create; writeln(hexStr(TMethod(TMyEvent(MyClass.MyMethod)).Code)); writeln(hexStr(TMethod(TMyEvent(MyClass.MyMethod)).Data)); FreeAndNil(MyClass); end. On Thu, Sep 10, 2009 at 2:56 PM, Peter Vreman <pe...@cooldown.xs4all.nl>wrote: > On Thu, 10 Sep 2009 14:25:26 +0000, Desmond Coertzen > <patrolliekapt...@gmail.com> wrote: > > I have done some horrible code where I needed to know the following: > > > > If TSomeProc = procedure(....), then is it easy to determine or set > entry > > vector of ThatProc: TSomeProc by stating ThatProc := > > @ProcWhereTheCodeLives_InTheCodeSegment; > > > > It gets more difficult when you work with TSomeClassProc = > procedure(....) > > of object, because two parts are referenced here: 1) The entry vector > where > > the code lives, 2) The heap address where the object struct lives. > (Known > > as > > the Self variable in a procedure of object) > > > > I have worked out which pointer of the two pointers belongs to the code > and > > which to the instance with a trial. With a move operation, I was able to > > manipulate the two pointers, specifically to determine the address of > the > > instance. > > > > The @ operator only gives you access to the procedure part. Is there, or > > will there be, another operator to give you access to the instance > address? > > > > You can use the TMethod record to access the fields: > > {$mode objfpc} > type > tc=class > procedure p; > end; > procedure tc.p; > begin > end; > var > c : tc; > begin > writeln(hexstr(tmethod(@c.p).data)); > writeln(hexstr(tmethod(@c.p).code)); > > c:=tc.create; > writeln(hexstr(tmethod(@c.p).data)); > writeln(hexstr(tmethod(@c.p).code)); > end. > > _______________________________________________ > 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