MCPcopy Create free account
hub / github.com/aldelaro5/dolphin-memory-engine / isValidFieldLayout

Method isValidFieldLayout

Source/Structs/StructDef.cpp:58–115  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

56}
57
58bool StructDef::isValidFieldLayout(u32 length, QVector<FieldDef*> fields)
59{
60 const size_t segbitsize = sizeof(uint64_t) * 8;
61 const size_t structSegments = static_cast<size_t>(ceil(static_cast<float>(length) / segbitsize));
62 uint64_t* structBytes = new uint64_t[structSegments];
63 for (size_t i = 0; i < structSegments; i++)
64 {
65 structBytes[i] = 0;
66 }
67
68 for (FieldDef* field : fields)
69 {
70 size_t fieldOffset = field->getOffset();
71 size_t fieldLength = static_cast<size_t>(field->getFieldSize());
72 if (fieldOffset + fieldLength > length)
73 {
74 return false;
75 }
76
77 size_t firstSegment = static_cast<size_t>(floor(static_cast<float>(fieldOffset) / segbitsize));
78 size_t lastSegment =
79 static_cast<size_t>(floor(static_cast<float>(fieldOffset + fieldLength) / segbitsize));
80
81 size_t lengthChecked = 0;
82 for (size_t i = firstSegment; i <= lastSegment; i++)
83 {
84 uint64_t entryByteMask = 0ULL;
85 if (i == firstSegment)
86 {
87 size_t maskLength = std::min(fieldLength, (segbitsize - fieldOffset % segbitsize));
88 if (maskLength == 0x40)
89 entryByteMask--;
90 else
91 entryByteMask = ((1ULL << (maskLength)) - 1) << fieldOffset;
92 lengthChecked += maskLength;
93 }
94 else if (i == lastSegment)
95 {
96 entryByteMask = ((1ULL << (fieldLength - lengthChecked)) - 1);
97 lengthChecked += (fieldLength - lengthChecked);
98 }
99 else
100 {
101 entryByteMask--;
102 lengthChecked += segbitsize;
103 }
104
105 if (structBytes[i] & entryByteMask)
106 {
107 return false;
108 }
109
110 structBytes[i] ^= entryByteMask;
111 }
112 }
113
114 return true;
115}

Callers

nothing calls this directly

Calls 2

getOffsetMethod · 0.80
getFieldSizeMethod · 0.80

Tested by

no test coverage detected