3

can anyone explain why the code below fails?

type TIDEThemeObserverFunc = reference to procedure(foo: integer);
var fObserverFuncs: TList<TIDEThemeObserverFunc>

function RegisterEventObserver(aObserverFunc: TIDEThemeObserverFunc): Pointer;
begin
  fObserverFuncs.Add(aObserverFunc);
  Result := @aObserverFunc;

  // line below somehow fails
  assert(fObserverFuncs.IndexOf(TIDEThemeObserverFunc(Result)) <> -1);
end;

I assumed anonymous methods can simply be casted and used around via pointers but that seems like a wrong assumption. Also, any resources explaining how the anonymous methods are implemented under the hood would be great. TIA.

2 Answers 2

5

You should use PPointer(@aObserverFunc)^ instead of @aObserverFunc to avoid the failed assert.

@gabr: thanks for ref to my blog, but I should recommend first to read the Stackoverflow user Barry Kelly blog as a more competent source of information.

Sign up to request clarification or add additional context in comments.

1 Comment

Reference counting for the list should work, as it is of type TList<(some method reference type)>. If reference counting broke with generics, even trivial cases like TList<string> would be useless.
4

Anonymous methods are actually interfaces (more correct - objects implementing an interface).

Read more here: Anonymous methods in Delphi: the internals (written by Stackoverflow user Serg).

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.