Esempio n. 1
0
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;
    }
}
Esempio n. 2
0
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();
}
Esempio n. 3
0
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;
}
Esempio n. 4
0
File: hhbc.cpp Progetto: 5heri/hhvm
MemberCode parseMemberCode(const char* s) {
  for (auto i = 0; i < memberNamesCount; i++) {
    if (!strcmp(memberNames[i], s)) {
      return MemberCode(i);
    }
  }
  return InvalidMemberCode;
}
Esempio n. 5
0
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;
}
Esempio n. 6
0
File: hhbc.cpp Progetto: 5heri/hhvm
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;
}