in hessian2/basic_codec/def_ref_codec.cc [9:59]
std::unique_ptr<Object::Definition> Decoder::decode() {
auto ret = reader_->read<uint8_t>();
if (!ret.first) {
return nullptr;
}
Object::RawDefinitionSharedPtr def =
std::make_shared<Object::RawDefinition>();
auto code = ret.second;
if (code == 'C') {
auto type_name = decode<std::string>();
if (!type_name) {
return nullptr;
}
auto field_len = decode<int32_t>();
if (!field_len) {
return nullptr;
}
def->type_ = *type_name;
def->field_names_.reserve(*field_len);
for (int i = 0; i < *field_len; i++) {
auto field_name = decode<std::string>();
if (!field_name) {
return nullptr;
}
def->field_names_.push_back(*field_name);
}
def_ref_.push_back(def);
} else if (code == 'O') {
auto ref_number = decode<int32_t>();
if (!ref_number) {
return nullptr;
}
if (static_cast<uint32_t>(*ref_number) >= def_ref_.size()) {
return nullptr;
}
def = def_ref_[*ref_number];
} else if (code >= 0x60 && code <= 0x6f) {
uint32_t ref_num = code - 0x60;
if (ref_num >= def_ref_.size()) {
return nullptr;
}
def = def_ref_[ref_num];
} else {
return nullptr;
}
return std::make_unique<Object::Definition>(def);
}