Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Internal (memory) representation of TProc and references at all

Does anyone here know how Delphi represents a reference to procedure?

for example

var
  proc: TProc;
...
proc = procedure begin beep end;

What do we got in "proc"?

I know that for "method variable" the memory representation is 4 bytes for the "procedure address" followed by 4 bytes for the "object address", but for "reference to procedure" is somewhat different and I cannot quite figure it out.

The reason I want this is because I have some legacy code that I want to make it work with references.

Does anyone know something about it?

like image 475
Nedko Avatar asked Jul 04 '11 13:07

Nedko


1 Answers

Method references are implemented as a COM-style interface with a single method called Invoke, which has the same signature as the method reference.

So TProc looks like this:

type
  TProc = interface(IInterface) // so inherits QI, AddRef, Release
     procedure Invoke;
  end;

It's a valid question to ask, as Delphi has interoperability with the C++ product. By using a pre-existing reference-counted type and idiom (COM lifetime rules), interop with C++ at the method reference level is possible.

Anonymous methods generate a hidden class which implements an interface isomorphic to the method reference interface, i.e. exactly the same shape, but not with the same symbolic identity. The hidden class doesn't implement the method reference interface directly because it may need to implement the interface multiple times (a single block may contain multiple anonymous methods all assigned to locations of the same method reference type).

like image 195
Barry Kelly Avatar answered Nov 04 '22 07:11

Barry Kelly