Note: This website is archived. For up-to-date information about D projects and development, please visit wiki.dlang.org.

Changeset 504

Show
Ignore:
Timestamp:
01/11/11 22:12:10 (14 years ago)
Author:
sean
Message:

Fixed demangle so it handles nested types properly.

Files:

Legend:

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

    r455 r504  
    12631263        _D QualifiedName M Type 
    12641264    */ 
    12651265    void parseMangledName() 
    12661266    { 
    12671267        debug(trace) printf( "parseMangledName+\n" ); 
    12681268        debug(trace) scope(success) printf( "parseMangledName-\n" ); 
    12691269        char[] name = null; 
    12701270 
    12711271        eat( '_' ); 
    12721272        match( 'D' ); 
    1273         name = parseQualifiedName(); 
    1274         debug(info) printf( "name (%.*s)\n", cast(int) name.length, name.ptr ); 
    1275         if( 'M' == tok() ) 
    1276             next(); // has 'this' pointer 
    1277         if( addType ) 
    1278             parseType( name ); 
     1273        do 
     1274        { 
     1275            name = parseQualifiedName(); 
     1276            debug(info) printf( "name (%.*s)\n", cast(int) name.length, name.ptr ); 
     1277            if( 'M' == tok() ) 
     1278                next(); // has 'this' pointer 
     1279            if( addType ) 
     1280                parseType( name ); 
     1281            if( pos >= buf.length ) 
     1282                return; 
     1283            put( "." ); 
     1284        } while( true ); 
    12791285    } 
    12801286 
    12811287 
    12821288    char[] opCall() 
    12831289    { 
    12841290        while( true ) 
    12851291        { 
    12861292            try 
    12871293            { 
    12881294                debug(info) printf( "demangle(%.*s)\n", cast(int) buf.length, buf.ptr ); 
     
    13341340    //return Demangle(buf, dst)(); 
    13351341    auto d = Demangle(buf, dst); 
    13361342    return d(); 
    13371343} 
    13381344 
    13391345 
    13401346unittest 
    13411347{ 
    13421348    static string[2][] table = 
    13431349    [ 
    1344         [ "printf",      "printf" ], 
    1345         [ "_foo",        "_foo" ], 
    1346         [ "_D88",        "_D88" ], 
    1347         [ "_D4test3fooAa", "char[] test.foo"], 
    1348         [ "_D8demangle8demangleFAaZAa", "char[] demangle.demangle(char[])" ], 
    1349         [ "_D6object6Object8opEqualsFC6ObjectZi", "int object.Object.opEquals(class Object)" ], 
    1350         [ "_D4test2dgDFiYd", "double delegate(int, ...) test.dg" ], 
    1351         [ "_D4test58__T9factorialVde67666666666666860140VG5aa5_68656c6c6fVPvnZ9factorialf", "float test.factorial!(double 4.2, char[5] \"hello\"c, void* null).factorial" ], 
    1352         [ "_D4test101__T9factorialVde67666666666666860140Vrc9a999999999999d9014000000000000000c00040VG5aa5_68656c6c6fVPvnZ9factorialf", "float test.factorial!(double 4.2, cdouble 6.8+3i, char[5] \"hello\"c, void* null).factorial" ], 
    1353         [ "_D4test34__T3barVG3uw3_616263VG3wd3_646566Z1xi", "int test.bar!(wchar[3] \"abc\"w, dchar[3] \"def\"d).x" ], 
    1354         [ "_D8demangle4testFLC6ObjectLDFLiZiZi", "int demangle.test(lazy class Object, lazy int delegate(lazy int))"], 
    1355         [ "_D8demangle4testFAiXi", "int demangle.test(int[] ...)"], 
    1356         [ "_D8demangle4testFLAiXi", "int demangle.test(lazy int[] ...)"], 
    1357         [ "_D6plugin8generateFiiZAya", "immutable(char)[] plugin.generate(int, int)"], 
    1358         [ "_D6plugin8generateFiiZAxa", "const(char)[] plugin.generate(int, int)"], 
    1359         [ "_D6plugin8generateFiiZAOa", "shared(char)[] plugin.generate(int, int)"] 
     1350        ["printf",      "printf"], 
     1351        ["_foo",        "_foo"], 
     1352        ["_D88",        "_D88"], 
     1353        ["_D4test3fooAa", "char[] test.foo"], 
     1354        ["_D8demangle8demangleFAaZAa", "char[] demangle.demangle(char[])"], 
     1355        ["_D6object6Object8opEqualsFC6ObjectZi", "int object.Object.opEquals(class Object)"], 
     1356        ["_D4test2dgDFiYd", "double delegate(int, ...) test.dg"], 
     1357        ["_D4test58__T9factorialVde67666666666666860140VG5aa5_68656c6c6fVPvnZ9factorialf", "float test.factorial!(double 4.2, char[5] \"hello\"c, void* null).factorial"], 
     1358        ["_D4test101__T9factorialVde67666666666666860140Vrc9a999999999999d9014000000000000000c00040VG5aa5_68656c6c6fVPvnZ9factorialf", "float test.factorial!(double 4.2, cdouble 6.8+3i, char[5] \"hello\"c, void* null).factorial"], 
     1359        ["_D4test34__T3barVG3uw3_616263VG3wd3_646566Z1xi", "int test.bar!(wchar[3] \"abc\"w, dchar[3] \"def\"d).x"], 
     1360        ["_D8demangle4testFLC6ObjectLDFLiZiZi", "int demangle.test(lazy class Object, lazy int delegate(lazy int))"], 
     1361        ["_D8demangle4testFAiXi", "int demangle.test(int[] ...)"], 
     1362        ["_D8demangle4testFLAiXi", "int demangle.test(lazy int[] ...)"], 
     1363        ["_D6plugin8generateFiiZAya", "immutable(char)[] plugin.generate(int, int)"], 
     1364        ["_D6plugin8generateFiiZAxa", "const(char)[] plugin.generate(int, int)"], 
     1365        ["_D6plugin8generateFiiZAOa", "shared(char)[] plugin.generate(int, int)"], 
     1366        ["_D8demangle3fnAFZv3fnBMFZv", "void demangle.fnA().void fnB()"], 
     1367        ["_D8demangle4mainFZv1S3fnCFZv", "void demangle.main().void S.fnC()"], 
     1368        ["_D8demangle4mainFZv1S3fnDMFZv", "void demangle.main().void S.fnD()"] 
    13601369    ]; 
    13611370 
    13621371    foreach( i, name; table ) 
    13631372    { 
    13641373        auto r = demangle( name[0] ); 
    13651374        /* 
    13661375        assert(r == name[1], 
    13671376                "table entry #" ~ to!string(i) ~ ": '" ~ name[0] 
    13681377                ~ "' demangles as '" ~ r ~ "' but is expected to be '" 
    13691378                ~ name[1] ~ "'");