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; }
void read_immvector_immediate(AsmState& as, std::vector<uchar>& ret, MemberCode mcode = InvalidMemberCode) { if (memberCodeImmIsLoc(mcode) || mcode == InvalidMemberCode) { if (as.in.getc() != '$') { as.error("*L member code in vector immediate must be followed by " "a local variable name"); } std::string name; if (!as.in.readword(name)) { as.error("couldn't read name for local variable in vector immediate"); } encodeIvaToVector(ret, as.getLocalId("$" + name)); } else if (memberCodeImmIsString(mcode)) { encodeToVector<int32>(ret, as.ue->mergeLitstr(read_litstr(as))); } else if (memberCodeImmIsInt(mcode)) { encodeToVector<int64>(ret, read_opcode_arg<int64>(as)); } else { as.error(std::string("don't understand immediate for member code ") + memberCodeString(mcode)); } }