[ox/mc] Fix int reads not to clear out unions

This commit is contained in:
Gary Talent 2020-04-13 02:37:08 -05:00
parent 1d07890668
commit d2e7528dae
2 changed files with 60 additions and 52 deletions

View File

@ -73,7 +73,7 @@ Error MetalClawReader::field(const char*, bool *val) {
} }
Error MetalClawReader::field(const char*, SerStr val) { Error MetalClawReader::field(const char*, SerStr val) {
if ((m_unionIdx == -1 || m_unionIdx == m_field)) { if (m_unionIdx == -1 || m_unionIdx == m_field) {
if (m_fieldPresence.get(m_field)) { if (m_fieldPresence.get(m_field)) {
// read the length // read the length
if (m_buffIt >= m_buffLen) { if (m_buffIt >= m_buffLen) {

View File

@ -145,18 +145,20 @@ Error MetalClawReader::field(const char *name, ox::BString<L> *val) {
template<typename I> template<typename I>
Error MetalClawReader::readInteger(I *val) { Error MetalClawReader::readInteger(I *val) {
if ((m_unionIdx == -1 || m_unionIdx == m_field) && m_fieldPresence.get(m_field)) { if (m_unionIdx == -1 || m_unionIdx == m_field) {
std::size_t bytesRead = 0; if (m_fieldPresence.get(m_field)) {
if (m_buffIt >= m_buffLen) { std::size_t bytesRead = 0;
oxTrace("ox::MetalClaw::readInteger") << "Buffer ended"; if (m_buffIt >= m_buffLen) {
return OxError(MC_BUFFENDED); oxTrace("ox::MetalClaw::readInteger") << "Buffer ended";
return OxError(MC_BUFFENDED);
}
auto valErr = mc::decodeInteger<I>(&m_buff[m_buffIt], m_buffLen - m_buffIt, &bytesRead);
m_buffIt += bytesRead;
oxReturnError(valErr.error);
*val = valErr.value;
} else {
*val = 0;
} }
auto valErr = mc::decodeInteger<I>(&m_buff[m_buffIt], m_buffLen - m_buffIt, &bytesRead);
m_buffIt += bytesRead;
oxReturnError(valErr.error);
*val = valErr.value;
} else {
*val = 0;
} }
++m_field; ++m_field;
return OxError(0); return OxError(0);
@ -165,26 +167,28 @@ Error MetalClawReader::readInteger(I *val) {
// array handler // array handler
template<typename T> template<typename T>
Error MetalClawReader::field(const char *name, T *val, std::size_t valLen) { Error MetalClawReader::field(const char *name, T *val, std::size_t valLen) {
if ((m_unionIdx == -1 || m_unionIdx == m_field) && m_fieldPresence.get(m_field)) { if (m_unionIdx == -1 || m_unionIdx == m_field) {
// read the length if (m_fieldPresence.get(m_field)) {
if (m_buffIt >= m_buffLen) { // read the length
return OxError(MC_BUFFENDED); if (m_buffIt >= m_buffLen) {
} return OxError(MC_BUFFENDED);
std::size_t bytesRead = 0; }
auto len = mc::decodeInteger<ArrayLength>(&m_buff[m_buffIt], m_buffLen - m_buffIt, &bytesRead); std::size_t bytesRead = 0;
m_buffIt += bytesRead; auto len = mc::decodeInteger<ArrayLength>(&m_buff[m_buffIt], m_buffLen - m_buffIt, &bytesRead);
oxReturnError(len.error); m_buffIt += bytesRead;
oxReturnError(len.error);
// read the list
if (valLen >= len.value) { // read the list
auto reader = child(""); if (valLen >= len.value) {
reader.setTypeInfo("List", len.value); auto reader = child("");
for (std::size_t i = 0; i < len.value; i++) { reader.setTypeInfo("List", len.value);
oxReturnError(reader.field("", &val[i])); for (std::size_t i = 0; i < len.value; i++) {
oxReturnError(reader.field("", &val[i]));
}
} else {
oxTrace("ox::mc::read::field(T)") << name << ", size:" << valLen;
return OxError(MC_OUTBUFFENDED);
} }
} else {
oxTrace("ox::mc::read::field(T)") << name << ", size:" << valLen;
return OxError(MC_OUTBUFFENDED);
} }
} }
++m_field; ++m_field;
@ -193,23 +197,25 @@ Error MetalClawReader::field(const char *name, T *val, std::size_t valLen) {
template<typename T, typename Handler> template<typename T, typename Handler>
Error MetalClawReader::field(const char*, Handler handler) { Error MetalClawReader::field(const char*, Handler handler) {
if ((m_unionIdx == -1 || m_unionIdx == m_field) && m_fieldPresence.get(m_field)) { if (m_unionIdx == -1 || m_unionIdx == m_field) {
// read the length if (m_fieldPresence.get(m_field)) {
if (m_buffIt >= m_buffLen) { // read the length
return OxError(MC_BUFFENDED); if (m_buffIt >= m_buffLen) {
} return OxError(MC_BUFFENDED);
std::size_t bytesRead = 0; }
auto len = mc::decodeInteger<ArrayLength>(&m_buff[m_buffIt], m_buffLen - m_buffIt, &bytesRead); std::size_t bytesRead = 0;
m_buffIt += bytesRead; auto len = mc::decodeInteger<ArrayLength>(&m_buff[m_buffIt], m_buffLen - m_buffIt, &bytesRead);
oxReturnError(len.error); m_buffIt += bytesRead;
oxReturnError(len.error);
// read the list // read the list
auto reader = child(""); auto reader = child("");
reader.setTypeInfo("List", len.value); reader.setTypeInfo("List", len.value);
for (std::size_t i = 0; i < len.value; i++) { for (std::size_t i = 0; i < len.value; i++) {
T val; T val;
oxReturnError(reader.field("", &val)); oxReturnError(reader.field("", &val));
oxReturnError(handler(i, &val)); oxReturnError(handler(i, &val));
}
} }
} }
++m_field; ++m_field;
@ -218,11 +224,13 @@ Error MetalClawReader::field(const char*, Handler handler) {
template<typename T> template<typename T>
Error MetalClawReader::field(const char* name, ox::Vector<T> *val) { Error MetalClawReader::field(const char* name, ox::Vector<T> *val) {
if ((m_unionIdx == -1 || m_unionIdx == m_field) && m_fieldPresence.get(m_field)) { if (m_unionIdx == -1 || m_unionIdx == m_field) {
const auto [len, err] = arrayLength(name, false); if (m_fieldPresence.get(m_field)) {
oxReturnError(err); const auto [len, err] = arrayLength(name, false);
val->resize(len); oxReturnError(err);
return field(name, val->data(), val->size()); val->resize(len);
return field(name, val->data(), val->size());
}
} }
return OxError(0); return OxError(0);
} }