Changeset 258
- Timestamp:
- 09/01/06 09:53:17 (2 years ago)
- Files:
-
- trunk/meta/demangle.d (modified) (27 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/meta/demangle.d
r214 r258 3 3 * 4 4 */ 5 5 6 6 module meta.demangle; 7 7 private import meta.ctype; … … 35 35 else { 36 36 static assert(0, "Demangle error: type '" ~ str ~ "' does not contain a qualified name"); 37 } 37 } 38 38 } else static if (str[0] == 'A') // dynamic array 39 39 const char [] demangleType = demangleType!(str[1..$], wantQualifiedNames) ~ "[]"; 40 40 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) 43 43 ~ "[" ~ demangleType!(str[1..1+(demangleTypeConsumed!(str[1..$]))], wantQualifiedNames) ~ "]"; 44 44 else static if (str[0] == 'G') // static array 45 45 const char [] demangleType 46 = demangleType!(str[1+countLeadingDigits!(str[1..$])..$], wantQualifiedNames) 46 = demangleType!(str[1+countLeadingDigits!(str[1..$])..$], wantQualifiedNames) 47 47 ~ "[" ~ str[1..1+countLeadingDigits!(str[1..$]) ] ~ "]"; 48 48 else static if (str[0]=='C') 49 49 const char [] demangleType = "class " ~ prettyLname!(str[1..$], wantQualifiedNames); 50 50 else static if (str[0]=='S') 51 const char [] demangleType = "struct " ~ prettyLname!(str[1..$], wantQualifiedNames); 51 const char [] demangleType = "struct " ~ prettyLname!(str[1..$], wantQualifiedNames); 52 52 else static if (str[0]=='E') 53 const char [] demangleType = "enum " ~ prettyLname!(str[1..$], wantQualifiedNames); 53 const char [] demangleType = "enum " ~ prettyLname!(str[1..$], wantQualifiedNames); 54 54 else static if (str[0]=='T') 55 const char [] demangleType = "typedef " ~ prettyLname!(str[1..$], wantQualifiedNames); 55 const char [] demangleType = "typedef " ~ prettyLname!(str[1..$], wantQualifiedNames); 56 56 else static if (str[0]=='D' && str.length>2 && isMangledFunction!(( str[1] )) ) // delegate 57 57 const char [] demangleType = demangleFunctionOrDelegate!(str[1..$], "delegate ", wantQualifiedNames); … … 62 62 else static if (str[0]=='F') 63 63 const char [] demangleType = demangleFunctionOrDelegate!(str, "", wantQualifiedNames); 64 else const char [] demangleType = demangleBasicType!(str); 64 else const char [] demangleType = demangleBasicType!(str); 65 65 } 66 66 … … 73 73 // possibly a bug in the D name mangling algorithm? 74 74 else static if (str == "x") const char [] demangleBasicType = "bool"; 75 75 76 76 // integral types 77 77 else static if (str == "g") const char [] demangleBasicType = "byte"; … … 87 87 else static if (str == "d") const char [] demangleBasicType = "double"; 88 88 else static if (str == "f") const char [] demangleBasicType = "float"; 89 89 90 90 else static if (str == "j") const char [] demangleBasicType = "ireal"; 91 91 else static if (str == "p") const char [] demangleBasicType = "idouble"; 92 92 else static if (str == "o") const char [] demangleBasicType = "ifloat"; 93 93 94 94 else static if (str == "c") const char [] demangleBasicType = "creal"; 95 95 else static if (str == "r") const char [] demangleBasicType = "cdouble"; … … 99 99 else static if (str == "u") const char [] demangleBasicType = "wchar"; 100 100 else static if (str == "w") const char [] demangleBasicType = "dchar"; 101 101 102 102 else static assert(0, "Demangle Error: '" ~ str ~ "' is not a recognised basic type"); 103 103 } … … 108 108 const int demangleTypeConsumed = 1 + demangleTypeConsumed!(str[1..$]); 109 109 else static if (str[0]=='H') 110 const int demangleTypeConsumed = 1 + demangleTypeConsumed!(str[1..$]) 110 const int demangleTypeConsumed = 1 + demangleTypeConsumed!(str[1..$]) 111 111 + demangleTypeConsumed!(str[1+demangleTypeConsumed!(str[1..$])..$]); 112 112 else static if (str[0]=='G') … … 116 116 const int demangleTypeConsumed = 2 + demangleParamListAndRetValConsumed!(str[2..$]); 117 117 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..$]); 119 119 else static if (str[0]=='C' || str[0]=='S' || str[0]=='E' || str[0]=='T') 120 120 const int demangleTypeConsumed = 1 + getQualifiedNameConsumed!(str[1..$]); 121 121 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..$]); 123 123 else // it's a Basic Type 124 124 const int demangleTypeConsumed = 1; … … 151 151 const char [] getLname = str[2..((str[0]-'0')*10 + str[1]-'0'+ 2)]; 152 152 else static if (str.length <= 999+3 || !isdigit!( (str[3]) )) 153 const char [] getLname = 153 const char [] getLname = 154 154 str[3..((str[0]-'0')*100 + (str[1]-'0')*10 + str[2]-'0' + 3)]; 155 155 else 156 const char [] getLname = 156 const char [] getLname = 157 157 str[4..((str[0]-'0')*1000 + (str[1]-'0')*100 + (str[2]-'0')*10 + (str[3]-'0') + 4)]; 158 158 } … … 167 167 } else { 168 168 static if (wantQualifiedNames == MangledNameType.PrettyName) { 169 const char [] pretty_Dname = 169 const char [] pretty_Dname = 170 170 demangleType!(str[2+dotnameconsumed..$], wantQualifiedNames) 171 171 ~ " " ~ getQualifiedName!(str[2..$], wantQualifiedNames); 172 172 } else { 173 const char [] pretty_Dname = getQualifiedName!(str[2..$], wantQualifiedNames); 173 const char [] pretty_Dname = getQualifiedName!(str[2..$], wantQualifiedNames); 174 174 } 175 175 } … … 182 182 { 183 183 static if (wantQualifiedNames == MangledNameType.PrettyName) { 184 const char [] pretty_Dfunction = 184 const char [] pretty_Dfunction = 185 185 demangleFunctionOrDelegate!(str[2 + dotnameconsumed .. 3 + dotnameconsumed + paramlistconsumed], 186 186 getQualifiedName!(str[2..2+dotnameconsumed], wantQualifiedNames), wantQualifiedNames) … … 188 188 ~ getQualifiedName!(str[3 + dotnameconsumed + paramlistconsumed .. $], wantQualifiedNames, "."); 189 189 } else static if (wantQualifiedNames == MangledNameType.QualifiedName) { 190 // Qualified name 190 // Qualified name 191 191 const char [] pretty_Dfunction = getQualifiedName!(str[2..2+dotnameconsumed], wantQualifiedNames) 192 192 ~ getQualifiedName!(str[3 + dotnameconsumed + paramlistconsumed .. $], wantQualifiedNames, "."); … … 202 202 template get_DnameConsumed(char [] str) 203 203 { 204 const int get_DnameConsumed = 2 + getQualifiedNameConsumed!(str[2..$]) 204 const int get_DnameConsumed = 2 + getQualifiedNameConsumed!(str[2..$]) 205 205 + demangleTypeConsumed!(str[2+getQualifedNameConsumed!(str[2..$])..$]); 206 206 } … … 221 221 else static if (str.length>2 && str[0..2] == "_D") { 222 222 const char [] prettyLname = pretty_Dname!(str, getQualifiedNameConsumed!(str[2..$]), wantQualifiedNames); 223 } else static if ( isdigit!( (str[0]) ) ) 223 } else static if ( isdigit!( (str[0]) ) ) 224 224 const char [] prettyLname = getQualifiedName!(str[0..getQualifiedNameConsumed!(str)], wantQualifiedNames); 225 225 else const char [] prettyLname = str; … … 238 238 else static if (str.length <= (999+3) || !isdigit!( (str[3]) )) 239 239 const int getLnameConsumed = (str[0]-'0')*100 + (str[1]-'0')*10 + str[2]-'0' + 3; 240 else 240 else 241 241 const int getLnameConsumed = (str[0]-'0')*1000 + (str[1]-'0')*100 + (str[2]-'0')*10 + (str[3]-'0') + 4; 242 242 } … … 289 289 template demangleFunctionOrDelegate(char [] str, char [] funcOrDelegStr, MangledNameType wantQualifiedNames) 290 290 { 291 const char [] demangleFunctionOrDelegate = demangleExtern!(( str[0] )) 291 const char [] demangleFunctionOrDelegate = demangleExtern!(( str[0] )) 292 292 ~ demangleReturnValue!(str[1..$], wantQualifiedNames) 293 293 ~ " " ~ funcOrDelegStr ~ "(" … … 297 297 298 298 // 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'. 300 300 template demangleFunctionParamType(char[] str, MangledNameType wantQualifiedNames) 301 301 { 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') 303 305 const char [] demangleFunctionParamType = "inout " ~ demangleType!(str[1..$], wantQualifiedNames); 304 306 else static if (str[0]=='J') … … 310 312 template demangleFunctionParamTypeConsumed(char[] str) 311 313 { 312 static if (str[0]=='K' || str[0]=='J' )314 static if (str[0]=='K' || str[0]=='J' || str[0]=='L') 313 315 const int demangleFunctionParamTypeConsumed = 1 + demangleTypeConsumed!(str[1..$]); 314 316 else const int demangleFunctionParamTypeConsumed = demangleTypeConsumed!(str); … … 336 338 { 337 339 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') 339 341 const char[] demangleReturnValue = demangleType!(str[1..$], wantQualifiedNames); 340 342 else const char [] demangleReturnValue = demangleReturnValue!(str[demangleFunctionParamTypeConsumed!(str)..$], wantQualifiedNames); … … 348 350 else static if (str[0] == 'Y') 349 351 const char [] demangleParamList = commastr ~ "..."; 352 else static if (str[0]=='X') // lazy ... 353 const char[] demangleParamList = commastr ~ "..."; 350 354 else 351 const char [] demangleParamList = commastr ~ 355 const char [] demangleParamList = commastr ~ 352 356 demangleFunctionParamType!(str[0..demangleFunctionParamTypeConsumed!(str)], wantQualifiedNames) 353 357 ~ demangleParamList!(str[demangleFunctionParamTypeConsumed!(str)..$], wantQualifiedNames, ", "); … … 358 362 { 359 363 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') 361 365 const int demangleParamListAndRetValConsumed = 1 + demangleTypeConsumed!(str[1..$]); 362 366 else { 363 const int demangleParamListAndRetValConsumed = demangleFunctionParamTypeConsumed!(str) 367 const int demangleParamListAndRetValConsumed = demangleFunctionParamTypeConsumed!(str) 364 368 + demangleParamListAndRetValConsumed!(str[demangleFunctionParamTypeConsumed!(str)..$]); 365 369 } … … 396 400 const char [] prettyTemplateArg = prettyLname!(str[1..$], wantQualifiedNames); 397 401 else static if (str[0]=='V') // value 398 const char [] prettyTemplateArg = 402 const char [] prettyTemplateArg = 399 403 demangleType!(str[1..1+demangleTypeConsumed!(str[1..$])], wantQualifiedNames) 400 404 ~ " = " ~ prettyValueArg!(str[1+demangleTypeConsumed!(str[1..$])..$]); … … 409 413 const int templateArgConsumed = 1 + getLnameConsumed!(str[1..$]); 410 414 else static if (str[0]=='V') // value 411 const int templateArgConsumed = 1 + demangleTypeConsumed!(str[1..$]) + 415 const int templateArgConsumed = 1 + demangleTypeConsumed!(str[1..$]) + 412 416 templateValueArgConsumed!(str[1+demangleTypeConsumed!(str[1..$])..$]); 413 417 else static if (str[0]=='T') // type … … 422 426 static if (str[0]=='Z') 423 427 const char[] prettyTemplateArgList = ""; 424 else 428 else 425 429 const char [] prettyTemplateArgList = commastr 426 430 ~ prettyTemplateArg!(str[0..templateArgConsumed!(str)], wantQualifiedNames) … … 434 438 const int templateArgListConsumed = 1; 435 439 else 436 const int templateArgListConsumed = templateArgConsumed!(str) 440 const int templateArgListConsumed = templateArgConsumed!(str) 437 441 + templateArgListConsumed!(str[templateArgConsumed!(str)..$]); 438 442 } … … 451 455 idouble SomeFunc2(inout ushort u, ubyte w) { return -3i; } 452 456 byte[] SomeFunc3(out dchar d, ...) { return null; } 457 ifloat SomeFunc4(lazy void[] x...) { return 2i; } 458 char[dchar] SomeFunc5(lazy int delegate()[] z...); 453 459 454 460 extern (Windows) { … … 464 470 typedef cfloat function (wchar) CPPFunc; 465 471 } 472 473 interface SomeInterface {} 466 474 467 475 static assert( demangleType!((&SomeFunc).mangleof) == "ireal function (ushort)" ); 468 476 static assert( demangleType!((&SomeFunc2).mangleof) == "idouble function (inout ushort, ubyte)"); 469 477 static assert( demangleType!((&SomeFunc3).mangleof) == "byte[] function (out dchar, ...)"); 478 static assert( demangleType!((&SomeFunc4).mangleof) == "ifloat function (lazy void[], ...)"); 479 static assert( demangleType!((&SomeFunc5).mangleof) == "char[dchar] function (lazy int delegate ()[], ...)"); 470 480 static assert( demangleType!((WinFunc).mangleof)== "extern (Windows) void function (double, long)"); 471 481 static assert( demangleType!((PascFunc).mangleof) == "extern (Pascal) short[wchar] delegate (bool, ...)"); 472 482 static assert( demangleType!((CFunc).mangleof) == "extern (C) dchar delegate ()"); 473 483 static assert( demangleType!((CPPFunc).mangleof) == "extern (C++) cfloat function (wchar)"); 484 // Interfaces are mangled as classes 485 static assert( demangleType!(SomeInterface.mangleof) == "class " ~ THISFILE ~ ".SomeInterface"); 474 486 475 487 template ComplexTemplate(real a, creal b)
