MemberCode parseMemberCode(const char* s) { int incr; switch (*s) { case 'W': return MW; case 'E': incr = 0; break; case 'P': incr = 1; break; default: return InvalidMemberCode; } switch (s[1]) { case 'C': return MemberCode(MEC + incr); case 'L': return MemberCode(MEL + incr); case 'T': return MemberCode(MET + incr); case 'I': return incr ? InvalidMemberCode : MEI; default: return InvalidMemberCode; } }
const uint8_t* ImmVector::findLastMember() const { assert(m_length > 0); // Loop that does basically the same as numStackValues(), except // stop at the last. const uint8_t* vec = m_start; const LocationCode locCode = LocationCode(*vec++); const int numLocImms = numLocationCodeImms(locCode); for (int i = 0; i < numLocImms; ++i) { decodeVariableSizeImm(&vec); } for (;;) { const uint8_t* ret = vec; MemberCode code = MemberCode(*vec++); if (memberCodeHasImm(code)) { decodeMemberCodeImm(&vec, code); } if (vec - m_start == m_length) { return ret; } assert(vec - m_start < m_length); } NOT_REACHED(); }
folly::Optional<MemberCode> parseMemberCode(const char* s) { for (auto i = 0; i < memberNamesCount; i++) { if (!strcmp(memberNames[i], s)) { return MemberCode(i); } } return folly::none; }
MemberCode parseMemberCode(const char* s) { for (auto i = 0; i < memberNamesCount; i++) { if (!strcmp(memberNames[i], s)) { return MemberCode(i); } } return InvalidMemberCode; }
bool ImmVector::decodeLastMember(const Unit* u, StringData*& sdOut, MemberCode& membOut, int64_t* strIdOut /*=NULL*/) const { const uint8_t* vec = findLastMember(); membOut = MemberCode(*vec++); if (memberCodeImmIsString(membOut)) { int64_t strId = decodeMemberCodeImm(&vec, membOut); if (strIdOut) *strIdOut = strId; sdOut = u->lookupLitstrId(strId); return true; } return false; }
std::vector<MVectorItem> getMVector(const Op* opcode) { auto immVec = getImmVector(opcode); std::vector<MVectorItem> result; auto it = immVec.vec(); auto end = it + immVec.size(); // Skip the LocationCode and its immediate auto const lcode = LocationCode(*it++); if (numLocationCodeImms(lcode)) decodeVariableSizeImm(&it); while (it < end) { auto const mcode = MemberCode(*it++); auto const imm = memberCodeHasImm(mcode) ? decodeMemberCodeImm(&it, mcode) : 0; result.push_back({mcode, imm}); } return result; }