__FUNCTION__ implemented with mixins and mangles

davidl davidl at nospam.org
Fri Jun 12 09:49:43 PDT 2009


在 Sat, 13 Jun 2009 00:40:09 +0800,Jarrett Billingsley  
<jarrett.billingsley at gmail.com> 写道:

> It's not foolproof, but I found it useful enough; maybe others will too.
>
> // Parsing mangles for fun and profit.
> char[] _getJustName(char[] mangle)
> {
>     size_t idx = 1;
>     size_t start = idx;
>     size_t len = 0;
>
>     while(idx < mangle.length && mangle[idx] >= '0' &&
>           mangle[idx] <= '9')
>     {
>         int size = mangle[idx++] - '0';
>
>         while(mangle[idx] >= '0' && mangle[idx] <= '9')
>             size = (size * 10) + (mangle[idx++] - '0');
>
>         start = idx;
>         len = size;
>         idx += size;
>     }
>
>     if(start < mangle.length)
>         return mangle[start .. start + len];
>     else
>         return "";
> }
>
> // Eheheh, I has a __FUNCTION__.
> const char[] FuncNameMix = "static if(!is(typeof(__FUNCTION__)))"
> "{ struct __FUNCTION {} const char[] __FUNCTION__ ="
> "_getJustName(__FUNCTION.mangleof); }";
>
> To use, just mix into any function where you want to use __FUNCTION__,
> and it'll be declared as a const char[].
>
> void forble()
> {
>     mixin(FuncNameMix);
>     pragma(msg, __FUNCTION__); // shows "forble"
> }
>
> It doesn't seem to cause any noticeable bloat.  The only reference I
> found to __FUNCTION in an executable compiled with -release was the
> contents of the FuncNameMix constant itself; I'm sure an "enum string"
> in D2 wouldn't be emitted like this.
>
> It doesn't work for nested functions, but that's just a little more
> parsing work.  If you want a version that displays the FQN instead of
> just the function name, I have that too.
>
> For those wondering how this works, it's pretty simple: when you
> declare a type within a function, its mangleof contains the function's
> name.  All the mixin is doing is declaring a type within the function
> (struct __FUNCTION), then parsing the owning function's name out of
> the type's mangleof.

Cool! But basing on mangled name might be broken in the future release of  
DMD.

-- 
使用 Opera 革命性的电子邮件客户程序: http://www.opera.com/mail/



More information about the Digitalmars-d mailing list