Thread overview
Can I get caller name?
Sep 26, 2014
AsmMan
Sep 26, 2014
ketmar
Sep 26, 2014
Vladimir Panteleev
Sep 26, 2014
AsmMan
September 26, 2014
for debugging purposes, I need to get the caller name. Is it possible? if so, how do I do this?

void foo()
{
  baa();
}

void baa()
{
  wrilten(caller_name()); // foo
}

I know I could create an extra parameter and pass the current function name as argument but it isn't a possibility for now.
September 26, 2014
On Fri, 26 Sep 2014 05:59:32 +0000
AsmMan via Digitalmars-d-learn <digitalmars-d-learn@puremagic.com>
wrote:

> for debugging purposes, I need to get the caller name. Is it possible? if so, how do I do this?
use debugger? or parse debugging info and do stackwalk.


September 26, 2014
On Friday, 26 September 2014 at 05:59:33 UTC, AsmMan wrote:
> for debugging purposes, I need to get the caller name. Is it possible? if so, how do I do this?
>
> void foo()
> {
>   baa();
> }
>
> void baa()
> {
>   wrilten(caller_name()); // foo
> }
>
> I know I could create an extra parameter and pass the current function name as argument but it isn't a possibility for now.

Method 1 (extra template parameter):

////////////// method1.d /////////////
import std.stdio;

void foo()
{
    baa();
}

void baa(string caller=__FUNCTION__)()
{
    writeln(caller);
}

void main()
{
    foo();
}
//////////////////////////////////////

Method 2 (slow, needs -g, also prints line number on Windows):

/////////////////////////// method2.d ///////////////////////////
import std.stdio;

void foo()
{
    baa();
}

void baa()
{
    writeln(getCaller());
}

void main()
{
    foo();
}

string getCaller()
{
    try
        throw new Exception(null);
    catch (Exception e)
    {
        import std.string, std.algorithm;
        string[] lines = e.toString().splitLines()[1..$];
        return lines.find!(line => line.canFind("getCaller"))[2];
    }
}
/////////////////////////////////////////////////////////////////
September 26, 2014
Thanks guys!