| 1417 | } |
| 1418 | |
| 1419 | DbgType* COFF::CvParseType(int tagIdx, bool ipi) |
| 1420 | { |
| 1421 | auto& reader = ipi ? mCvIPIReader : mCvTypeSectionReader; |
| 1422 | int offset = ipi ? mCvIPITagStartMap[tagIdx - mCvIPIMinTag] : mCvTagStartMap[tagIdx - mCvMinTag]; |
| 1423 | |
| 1424 | uint8* data = reader.GetTempPtr(offset, 4); |
| 1425 | uint16 trLength = *(uint16*)data; |
| 1426 | offset += 2; |
| 1427 | data = reader.GetTempPtr(offset, trLength, true); |
| 1428 | CvAutoReleaseTempData releaseTempData(this, data); |
| 1429 | |
| 1430 | uint8* dataStart = data; |
| 1431 | uint8* dataEnd = data + trLength; |
| 1432 | int16 trLeafType = GET(int16); |
| 1433 | bool strMadeCopy; |
| 1434 | |
| 1435 | auto _ParseString = [&]() |
| 1436 | { |
| 1437 | strMadeCopy = false; |
| 1438 | int nameLen = strlen((const char*)data); |
| 1439 | int nameOfs = data - dataStart; |
| 1440 | const char* name = (const char*)reader.GetPermanentPtr(offset + nameOfs, nameLen + 1, &strMadeCopy); |
| 1441 | data += nameLen + 1; |
| 1442 | return name; |
| 1443 | }; |
| 1444 | |
| 1445 | DbgType* dbgType = NULL; |
| 1446 | |
| 1447 | switch (trLeafType) |
| 1448 | { |
| 1449 | case LF_ENUM: |
| 1450 | { |
| 1451 | int elemCount = (int)GET(uint16); |
| 1452 | int prop = (int)GET(uint16); |
| 1453 | int underlyingType = GET(int32); |
| 1454 | int typeIndex = GET(int32); |
| 1455 | const char* name = _ParseString(); |
| 1456 | |
| 1457 | dbgType = CvCreateType(); |
| 1458 | dbgType->mCompileUnit = mMasterCompileUnit; |
| 1459 | dbgType->mName = name; |
| 1460 | dbgType->mTypeName = name; |
| 1461 | //SplitName(dbgType->mName, dbgType->mTypeName, dbgType->mTemplateParams); |
| 1462 | dbgType->mTypeCode = DbgType_Enum; |
| 1463 | dbgType->mTypeParam = CvGetTypeSafe(underlyingType); |
| 1464 | dbgType->mIsIncomplete = true; |
| 1465 | |
| 1466 | if (dbgType->mTypeParam->GetByteCount() == 0) |
| 1467 | dbgType->mIsDeclaration = true; |
| 1468 | |
| 1469 | dbgType->mSize = dbgType->mTypeParam->mSize; |
| 1470 | dbgType->mAlign = dbgType->mTypeParam->mAlign; |
| 1471 | |
| 1472 | /*if (dbgType->mTypeParam->GetByteCount() == 0) |
| 1473 | { |
| 1474 | // Appears to be a bug where byte-sized enums come out as void (sometimes?) |
| 1475 | dbgType->mTypeParam = mBfPrimitiveTypes[DbgType_u8]; |
| 1476 | }*/ |
nothing calls this directly
no test coverage detected