[fpc-pascal] Get all caller adresses of a procedure/function

Rainer Stratmann RainerStratmann at t-online.de
Tue Aug 7 18:58:13 CEST 2012

Am Tuesday 07 August 2012 11:34:10 schrieb Martin:
> > With all caller adresses OR all numbers (see down) I have the whole
> > amount of snippets that I want to have.
> How?

With the compiler keyword 'calleradresstable';

function s( str : pchar ) : pchar; calleradresstable;

Then the compiler makes a table of all calleradresses and also the amount of 
s() in the program.
With the rtl function getcalleradresstable() then I get a pointer and the 
amount of the array.

> I can see 2 ways you get that address
> procedure p (snip:string);
> begin
>    calleraddr := get_caller_addr(); //needs to be implemented
>    ......
> end

It exists already:

>       OR
> procedure p (snip:string, caller_addr:pointer);
> ....
> and when calling
> p('hello world', get_my_addr()); // needs to be implemented
> *** BUT
> then you run your app. You collect maybe (for example) 42 addresses with
> snippets
> How do you know that is all of them? There may be places that call p()
> but that where not executed. Then you do not have that address, so you
> do not know it is missing

That is the point.

> > The caller adress is a unique identifier.
> > A handle.
> **IF** each snippet is unique (that is if each text exists only once)
> Then the text itself can be used as a unique ID

Then I also need all adresses from the snippets before all s() are called.
Method 'caller adress' is easier and clearly.

> yes it is longer, and compares slower, but a hash table can solve that

I prefer faster execution wherever it is possible with little effort.

> >> so if you had
> >> p(next_compile_time_number, 'text');
> >
> > I do not write something about 'next_compile_time_number'.
> > My words were 'incremented counter at compiletime'.
> > That means the counter increases immediately after every occurence in the
> > sourcecode.
> That is what I meant: Take  'next_compile_time_number' as a macro or
> preprocesser driective
> Now in that case, if you know the highest number (but you do not know
> it), you would be able to check completness
Yes, but the number doesn't exist. I think we talk again about 2 different 
things here.
> You want the compiler (at compile time) to build a table (array) of all
> places that call p, so you can check if they called?
> That is something you never said (or I missed it)

I say it the whole time. Beginning with the first post of this thread. Sven 
wanted to know why I need this, so we are discussing the snippet things now.

> >> Lets take a step back:
> >>
> >> Why do you not just store all snippets in a stringlist, if p saw them?
> >
> > I do it.
> > But I need the information which snippet was not called yet.
> > That is all I want.
> See above. I have yet to know, how that works with the caller address


More information about the fpc-pascal mailing list