Changeset 258

Show
Ignore:
Timestamp:
09/01/06 09:53:17 (2 years ago)
Author:
Don Clugston
Message:

For DMD 0.166 -- now demangles lazy parameters and lazy variadics.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/meta/demangle.d

    r214 r258  
    33 * 
    44 */ 
    5   
     5 
    66module meta.demangle; 
    77private import meta.ctype; 
     
    3535        else { 
    3636            static assert(0, "Demangle error: type '" ~ str ~ "' does not contain a qualified name"); 
    37         }         
     37        } 
    3838    } else static if (str[0] == 'A') // dynamic array 
    3939        const char [] demangleType = demangleType!(str[1..$], wantQualifiedNames) ~ "[]"; 
    4040    else static if (str[0] == 'H')   // associative array 
    41         const char [] demangleType  
    42             = demangleType!(str[1+demangleTypeConsumed!(str[1..$])..$], wantQualifiedNames)  
     41        const char [] demangleType 
     42            = demangleType!(str[1+demangleTypeConsumed!(str[1..$])..$], wantQualifiedNames) 
    4343            ~ "[" ~ demangleType!(str[1..1+(demangleTypeConsumed!(str[1..$]))], wantQualifiedNames) ~ "]"; 
    4444    else static if (str[0] == 'G') // static array 
    4545        const char [] demangleType 
    46             = demangleType!(str[1+countLeadingDigits!(str[1..$])..$], wantQualifiedNames)  
     46            = demangleType!(str[1+countLeadingDigits!(str[1..$])..$], wantQualifiedNames) 
    4747            ~ "[" ~ str[1..1+countLeadingDigits!(str[1..$]) ] ~ "]"; 
    4848    else static if (str[0]=='C') 
    4949        const char [] demangleType = "class " ~ prettyLname!(str[1..$], wantQualifiedNames); 
    5050    else static if (str[0]=='S') 
    51         const char [] demangleType = "struct " ~ prettyLname!(str[1..$], wantQualifiedNames);  
     51        const char [] demangleType = "struct " ~ prettyLname!(str[1..$], wantQualifiedNames); 
    5252    else static if (str[0]=='E') 
    53         const char [] demangleType = "enum " ~ prettyLname!(str[1..$], wantQualifiedNames);  
     53        const char [] demangleType = "enum " ~ prettyLname!(str[1..$], wantQualifiedNames); 
    5454    else static if (str[0]=='T') 
    55         const char [] demangleType = "typedef " ~ prettyLname!(str[1..$], wantQualifiedNames);  
     55        const char [] demangleType = "typedef " ~ prettyLname!(str[1..$], wantQualifiedNames); 
    5656    else static if (str[0]=='D' && str.length>2 && isMangledFunction!(( str[1] )) ) // delegate 
    5757        const char [] demangleType = demangleFunctionOrDelegate!(str[1..$], "delegate ", wantQualifiedNames); 
     
    6262    else static if (str[0]=='F') 
    6363        const char [] demangleType = demangleFunctionOrDelegate!(str, "", wantQualifiedNames); 
    64     else const char [] demangleType = demangleBasicType!(str);   
     64    else const char [] demangleType = demangleBasicType!(str); 
    6565} 
    6666 
     
    7373    // possibly a bug in the D name mangling algorithm? 
    7474    else static if (str == "x") const char [] demangleBasicType = "bool"; 
    75      
     75 
    7676    // integral types 
    7777    else static if (str == "g") const char [] demangleBasicType = "byte"; 
     
    8787    else static if (str == "d") const char [] demangleBasicType = "double"; 
    8888    else static if (str == "f") const char [] demangleBasicType = "float"; 
    89      
     89 
    9090    else static if (str == "j") const char [] demangleBasicType = "ireal"; 
    9191    else static if (str == "p") const char [] demangleBasicType = "idouble"; 
    9292    else static if (str == "o") const char [] demangleBasicType = "ifloat"; 
    93      
     93 
    9494    else static if (str == "c") const char [] demangleBasicType = "creal"; 
    9595    else static if (str == "r") const char [] demangleBasicType = "cdouble"; 
     
    9999    else static if (str == "u") const char [] demangleBasicType = "wchar"; 
    100100    else static if (str == "w") const char [] demangleBasicType = "dchar"; 
    101   
     101 
    102102    else static assert(0, "Demangle Error: '" ~ str ~ "' is not a recognised basic type"); 
    103103} 
     
    108108        const int demangleTypeConsumed = 1 + demangleTypeConsumed!(str[1..$]); 
    109109    else static if (str[0]=='H') 
    110         const int demangleTypeConsumed = 1 + demangleTypeConsumed!(str[1..$])  
     110        const int demangleTypeConsumed = 1 + demangleTypeConsumed!(str[1..$]) 
    111111            + demangleTypeConsumed!(str[1+demangleTypeConsumed!(str[1..$])..$]); 
    112112    else static if (str[0]=='G') 
     
    116116        const int demangleTypeConsumed = 2 + demangleParamListAndRetValConsumed!(str[2..$]); 
    117117    else static if (str[0]=='P') // only after we've dealt with function pointers 
    118         const int demangleTypeConsumed = 1 + demangleTypeConsumed!(str[1..$]);      
     118        const int demangleTypeConsumed = 1 + demangleTypeConsumed!(str[1..$]); 
    119119    else static if (str[0]=='C' || str[0]=='S' || str[0]=='E' || str[0]=='T') 
    120120        const int demangleTypeConsumed = 1 + getQualifiedNameConsumed!(str[1..$]); 
    121121    else static if (str[0]=='F' && str.length>1) 
    122         const int demangleTypeConsumed = 1 + demangleParamListAndRetValConsumed!(str[1..$]);      
     122        const int demangleTypeConsumed = 1 + demangleParamListAndRetValConsumed!(str[1..$]); 
    123123    else // it's a Basic Type 
    124124        const int demangleTypeConsumed = 1; 
     
    151151        const char [] getLname = str[2..((str[0]-'0')*10 + str[1]-'0'+ 2)]; 
    152152    else static if (str.length <= 999+3 || !isdigit!( (str[3]) )) 
    153         const char [] getLname =  
     153        const char [] getLname = 
    154154            str[3..((str[0]-'0')*100 + (str[1]-'0')*10 + str[2]-'0' + 3)]; 
    155155    else 
    156         const char [] getLname =  
     156        const char [] getLname = 
    157157            str[4..((str[0]-'0')*1000 + (str[1]-'0')*100 + (str[2]-'0')*10 + (str[3]-'0') + 4)]; 
    158158} 
     
    167167    } else { 
    168168        static if (wantQualifiedNames == MangledNameType.PrettyName) { 
    169             const char [] pretty_Dname =  
     169            const char [] pretty_Dname = 
    170170                demangleType!(str[2+dotnameconsumed..$], wantQualifiedNames) 
    171171                ~ " " ~ getQualifiedName!(str[2..$], wantQualifiedNames); 
    172172        } else { 
    173             const char [] pretty_Dname = getQualifiedName!(str[2..$], wantQualifiedNames);       
     173            const char [] pretty_Dname = getQualifiedName!(str[2..$], wantQualifiedNames); 
    174174        } 
    175175    } 
     
    182182{ 
    183183    static if (wantQualifiedNames == MangledNameType.PrettyName) { 
    184         const char [] pretty_Dfunction =  
     184        const char [] pretty_Dfunction = 
    185185            demangleFunctionOrDelegate!(str[2 + dotnameconsumed .. 3 + dotnameconsumed + paramlistconsumed], 
    186186                getQualifiedName!(str[2..2+dotnameconsumed], wantQualifiedNames), wantQualifiedNames) 
     
    188188            ~ getQualifiedName!(str[3 + dotnameconsumed + paramlistconsumed .. $], wantQualifiedNames, "."); 
    189189    } else static if (wantQualifiedNames == MangledNameType.QualifiedName) { 
    190         // Qualified name     
     190        // Qualified name 
    191191        const char [] pretty_Dfunction = getQualifiedName!(str[2..2+dotnameconsumed], wantQualifiedNames) 
    192192            ~ getQualifiedName!(str[3 + dotnameconsumed + paramlistconsumed .. $], wantQualifiedNames, "."); 
     
    202202template get_DnameConsumed(char [] str) 
    203203{ 
    204     const int get_DnameConsumed = 2 + getQualifiedNameConsumed!(str[2..$])  
     204    const int get_DnameConsumed = 2 + getQualifiedNameConsumed!(str[2..$]) 
    205205        + demangleTypeConsumed!(str[2+getQualifedNameConsumed!(str[2..$])..$]); 
    206206} 
     
    221221    else static if (str.length>2 && str[0..2] == "_D") { 
    222222        const char [] prettyLname = pretty_Dname!(str, getQualifiedNameConsumed!(str[2..$]), wantQualifiedNames); 
    223     } else static if ( isdigit!( (str[0]) ) )  
     223    } else static if ( isdigit!( (str[0]) ) ) 
    224224        const char [] prettyLname = getQualifiedName!(str[0..getQualifiedNameConsumed!(str)], wantQualifiedNames); 
    225225    else const char [] prettyLname = str; 
     
    238238    else static if (str.length <= (999+3) || !isdigit!( (str[3]) )) 
    239239        const int getLnameConsumed = (str[0]-'0')*100 + (str[1]-'0')*10 + str[2]-'0' + 3; 
    240     else  
     240    else 
    241241        const int getLnameConsumed = (str[0]-'0')*1000 + (str[1]-'0')*100 + (str[2]-'0')*10 + (str[3]-'0') + 4; 
    242242} 
     
    289289template demangleFunctionOrDelegate(char [] str, char [] funcOrDelegStr, MangledNameType wantQualifiedNames) 
    290290{ 
    291     const char [] demangleFunctionOrDelegate = demangleExtern!(( str[0] ))  
     291    const char [] demangleFunctionOrDelegate = demangleExtern!(( str[0] )) 
    292292        ~ demangleReturnValue!(str[1..$], wantQualifiedNames) 
    293293        ~ " " ~ funcOrDelegStr ~ "(" 
     
    297297 
    298298// Special case: types that are in function parameters 
    299 // For function parameters, the type can also contain 'out' or 'inout'.  
     299// For function parameters, the type can also contain 'lazy', 'out' or 'inout'. 
    300300template demangleFunctionParamType(char[] str, MangledNameType wantQualifiedNames) 
    301301{ 
    302     static if (str[0]=='K') 
     302    static if (str[0]=='L') 
     303        const char [] demangleFunctionParamType = "lazy " ~ demangleType!(str[1..$], wantQualifiedNames); 
     304    else static if (str[0]=='K') 
    303305        const char [] demangleFunctionParamType = "inout " ~ demangleType!(str[1..$], wantQualifiedNames); 
    304306    else static if (str[0]=='J') 
     
    310312template demangleFunctionParamTypeConsumed(char[] str) 
    311313{ 
    312     static if (str[0]=='K' || str[0]=='J')  
     314    static if (str[0]=='K' || str[0]=='J' || str[0]=='L') 
    313315        const int demangleFunctionParamTypeConsumed = 1 + demangleTypeConsumed!(str[1..$]); 
    314316    else const int demangleFunctionParamTypeConsumed = demangleTypeConsumed!(str); 
     
    336338{ 
    337339    static assert(str.length>=1, "Demangle error(Function): No return value found"); 
    338     static if (str[0]=='Z' || str[0]=='Y'
     340    static if (str[0]=='Z' || str[0]=='Y' || str[0]=='X'
    339341        const char[] demangleReturnValue = demangleType!(str[1..$], wantQualifiedNames); 
    340342    else const char [] demangleReturnValue = demangleReturnValue!(str[demangleFunctionParamTypeConsumed!(str)..$], wantQualifiedNames); 
     
    348350    else static if (str[0] == 'Y') 
    349351        const char [] demangleParamList = commastr ~ "..."; 
     352    else static if (str[0]=='X') // lazy ... 
     353        const char[] demangleParamList = commastr ~ "..."; 
    350354    else 
    351         const char [] demangleParamList =  commastr ~  
     355        const char [] demangleParamList =  commastr ~ 
    352356            demangleFunctionParamType!(str[0..demangleFunctionParamTypeConsumed!(str)], wantQualifiedNames) 
    353357            ~ demangleParamList!(str[demangleFunctionParamTypeConsumed!(str)..$], wantQualifiedNames, ", "); 
     
    358362{ 
    359363    static assert (str.length>0, "Demangle error(ParamList): No return value found"); 
    360     static if (str[0]=='Z' || str[0]=='Y'
     364    static if (str[0]=='Z' || str[0]=='Y' || str[0]=='X'
    361365        const int demangleParamListAndRetValConsumed = 1 + demangleTypeConsumed!(str[1..$]); 
    362366    else { 
    363         const int demangleParamListAndRetValConsumed = demangleFunctionParamTypeConsumed!(str)  
     367        const int demangleParamListAndRetValConsumed = demangleFunctionParamTypeConsumed!(str) 
    364368            + demangleParamListAndRetValConsumed!(str[demangleFunctionParamTypeConsumed!(str)..$]); 
    365369    } 
     
    396400        const char [] prettyTemplateArg = prettyLname!(str[1..$], wantQualifiedNames); 
    397401    else static if (str[0]=='V') // value 
    398         const char [] prettyTemplateArg =  
     402        const char [] prettyTemplateArg = 
    399403            demangleType!(str[1..1+demangleTypeConsumed!(str[1..$])], wantQualifiedNames) 
    400404            ~ " = " ~ prettyValueArg!(str[1+demangleTypeConsumed!(str[1..$])..$]); 
     
    409413        const int templateArgConsumed = 1 + getLnameConsumed!(str[1..$]); 
    410414    else static if (str[0]=='V') // value 
    411         const int templateArgConsumed = 1 + demangleTypeConsumed!(str[1..$]) +  
     415        const int templateArgConsumed = 1 + demangleTypeConsumed!(str[1..$]) + 
    412416            templateValueArgConsumed!(str[1+demangleTypeConsumed!(str[1..$])..$]); 
    413417    else static if (str[0]=='T') // type 
     
    422426    static if (str[0]=='Z') 
    423427        const char[] prettyTemplateArgList = ""; 
    424     else  
     428    else 
    425429       const char [] prettyTemplateArgList = commastr 
    426430            ~ prettyTemplateArg!(str[0..templateArgConsumed!(str)], wantQualifiedNames) 
     
    434438        const int templateArgListConsumed = 1; 
    435439    else 
    436         const int templateArgListConsumed = templateArgConsumed!(str)  
     440        const int templateArgListConsumed = templateArgConsumed!(str) 
    437441            + templateArgListConsumed!(str[templateArgConsumed!(str)..$]); 
    438442} 
     
    451455idouble SomeFunc2(inout ushort u, ubyte w) { return -3i; } 
    452456byte[] SomeFunc3(out dchar d, ...) { return null; } 
     457ifloat SomeFunc4(lazy void[] x...) { return 2i; } 
     458char[dchar] SomeFunc5(lazy int delegate()[] z...); 
    453459 
    454460extern (Windows) { 
     
    464470    typedef cfloat function (wchar) CPPFunc; 
    465471} 
     472 
     473interface SomeInterface {} 
    466474 
    467475static assert( demangleType!((&SomeFunc).mangleof) == "ireal function (ushort)" ); 
    468476static assert( demangleType!((&SomeFunc2).mangleof) == "idouble function (inout ushort, ubyte)"); 
    469477static assert( demangleType!((&SomeFunc3).mangleof) == "byte[] function (out dchar, ...)"); 
     478static assert( demangleType!((&SomeFunc4).mangleof) == "ifloat function (lazy void[], ...)"); 
     479static assert( demangleType!((&SomeFunc5).mangleof) == "char[dchar] function (lazy int delegate ()[], ...)"); 
    470480static assert( demangleType!((WinFunc).mangleof)== "extern (Windows) void function (double, long)"); 
    471481static assert( demangleType!((PascFunc).mangleof) == "extern (Pascal) short[wchar] delegate (bool, ...)"); 
    472482static assert( demangleType!((CFunc).mangleof) == "extern (C) dchar delegate ()"); 
    473483static assert( demangleType!((CPPFunc).mangleof) == "extern (C++) cfloat function (wchar)"); 
     484// Interfaces are mangled as classes 
     485static assert( demangleType!(SomeInterface.mangleof) == "class " ~ THISFILE ~ ".SomeInterface"); 
    474486 
    475487template ComplexTemplate(real a, creal b)