in hessian2/basic_codec/list_codec.cc [108:187]
std::unique_ptr<UntypedListObject> Decoder::decode() {
Object::UntypedList obj_list;
auto result = std::make_unique<UntypedListObject>();
values_ref_.push_back(result.get());
auto ret = reader_->read<uint8_t>();
if (!ret.first) {
return nullptr;
}
auto code = ret.second;
auto ReadNumsObject = [&](int nums) -> bool {
for (int i = 0; i < nums; i++) {
auto o = decode<Object>();
if (!o) {
return false;
}
obj_list.emplace_back(std::move(o));
}
return true;
};
auto ReadObjectUntilEnd = [&]() -> bool {
auto ret = reader_->peek<uint8_t>();
if (!ret.first) {
return false;
}
while (ret.second != 'Z') {
auto o = decode<Object>();
if (!o) {
return false;
}
obj_list.emplace_back(std::move(o));
ret = reader_->peek<uint8_t>();
if (!ret.first) {
return false;
}
}
// Skip last 'Z'
reader_->read<uint8_t>();
return true;
};
switch (code) {
case 0x57: {
if (!ReadObjectUntilEnd()) {
return nullptr;
}
break;
}
case 0x58: {
auto ret = decode<int32_t>();
if (!ret) {
return nullptr;
}
if (!ReadNumsObject(*ret)) {
return nullptr;
}
break;
}
case 0x78:
case 0x79:
case 0x7a:
case 0x7b:
case 0x7c:
case 0x7d:
case 0x7e:
case 0x7f: {
if (!ReadNumsObject(code - 0x78)) {
return nullptr;
}
break;
}
}
result->setUntypedList(std::move(obj_list));
return result;
}