| 1493 | |
| 1494 | |
| 1495 | TypeBuilder Demangle::DemangleFunction(BNNameType classFunctionType, bool pointerSuffix, BackrefList& nameBackrefList, int funcClass) |
| 1496 | { |
| 1497 | m_logger->LogDebug("%s: '%s'\n", __FUNCTION__, reader.GetRaw()); |
| 1498 | bool _const = false, _volatile = false, isMember = false; |
| 1499 | set<BNPointerSuffix> suffix; |
| 1500 | TypeBuilder returnType; |
| 1501 | BNCallingConventionName cc; |
| 1502 | |
| 1503 | //Demangle adjustor which we don't do anything with for now |
| 1504 | if ((funcClass & StaticThunkFunctionClass) == StaticThunkFunctionClass) |
| 1505 | { |
| 1506 | int64_t adjustor; |
| 1507 | DemangleNumber(adjustor); |
| 1508 | m_varName.back() += "`adjustor{" + to_string(adjustor) + "}'"; |
| 1509 | } |
| 1510 | else if ((funcClass & VirtualThunkFunctionClass) == VirtualThunkFunctionClass) |
| 1511 | { |
| 1512 | if ((funcClass & VirtualThunkExFunctionClass) == VirtualThunkExFunctionClass) |
| 1513 | { |
| 1514 | int64_t vbptrOffset; |
| 1515 | int64_t vbOffsetOffset; |
| 1516 | int64_t vtorDispOffset; |
| 1517 | int64_t staticOffset; |
| 1518 | DemangleNumber(vbptrOffset); |
| 1519 | DemangleNumber(vbOffsetOffset); |
| 1520 | DemangleNumber(vtorDispOffset); |
| 1521 | DemangleNumber(staticOffset); |
| 1522 | m_varName.back() += "`vtordispex{" + to_string(vbptrOffset) + ", " + to_string(vbOffsetOffset) + ", " + to_string(vtorDispOffset) + ", " + to_string(staticOffset) + "}'"; |
| 1523 | } |
| 1524 | else |
| 1525 | { |
| 1526 | int64_t vtorDispOffset; |
| 1527 | int64_t staticOffset; |
| 1528 | DemangleNumber(vtorDispOffset); |
| 1529 | DemangleNumber(staticOffset); |
| 1530 | m_varName.back() += "`vtordisp{" + to_string(vtorDispOffset) + ", " + to_string(staticOffset) + "}'"; |
| 1531 | } |
| 1532 | } |
| 1533 | |
| 1534 | if (pointerSuffix) |
| 1535 | { |
| 1536 | suffix = DemanglePointerSuffix(); |
| 1537 | DemangleModifiers(_const, _volatile, isMember); |
| 1538 | } |
| 1539 | if (reader.Peek() == '?') |
| 1540 | reader.Consume(); |
| 1541 | cc = DemangleCallingConvention(); |
| 1542 | bool shouldHaveReturnType = true; |
| 1543 | if (reader.Peek() == '@') |
| 1544 | { |
| 1545 | //No return type |
| 1546 | shouldHaveReturnType = false; |
| 1547 | reader.Consume(); |
| 1548 | m_logger->LogDebug("Function has no return type %s", reader.GetRaw()); |
| 1549 | } |
| 1550 | else |
| 1551 | { |
| 1552 | //Demangle function return type |
nothing calls this directly
no test coverage detected