Fixes for oneof conformance tests.

pull/13171/head
Joshua Haberman 7 years ago
parent b697882fb2
commit 15308afff2
  1. 14
      tests/conformance_upb_failures.txt
  2. 5
      upb/decode.c
  3. 13
      upb/encode.c

@ -1,15 +1 @@
Recommended.ProtobufInput.OneofZeroBool.ProtobufOutput
Recommended.ProtobufInput.OneofZeroBytes.ProtobufOutput
Recommended.ProtobufInput.OneofZeroDouble.ProtobufOutput
Recommended.ProtobufInput.OneofZeroEnum.ProtobufOutput
Recommended.ProtobufInput.OneofZeroFloat.ProtobufOutput
Recommended.ProtobufInput.OneofZeroString.ProtobufOutput
Recommended.ProtobufInput.OneofZeroUint32.ProtobufOutput
Recommended.ProtobufInput.OneofZeroUint64.ProtobufOutput
Required.ProtobufInput.PrematureEofInSubmessageValue.MESSAGE
Required.ProtobufInput.RepeatedScalarSelectsLast.BOOL.ProtobufOutput
Required.ProtobufInput.RepeatedScalarSelectsLast.FIXED32.ProtobufOutput
Required.ProtobufInput.RepeatedScalarSelectsLast.FIXED64.ProtobufOutput
Required.ProtobufInput.RepeatedScalarSelectsLast.UINT64.ProtobufOutput
Required.ProtobufInput.ValidDataRepeated.BOOL.ProtobufOutput
Required.ProtobufInput.ValidDataScalar.BOOL.ProtobufOutput

@ -309,6 +309,11 @@ static bool upb_decode_varintfield(upb_decstate *d, upb_decframe *frame,
memcpy(field_mem, &val32, sizeof(val32));
break;
}
case UPB_DESCRIPTOR_TYPE_BOOL: {
bool valbool = val != 0;
memcpy(field_mem, &valbool, sizeof(valbool));
break;
}
case UPB_DESCRIPTOR_TYPE_SINT32: {
int32_t decoded = upb_zzdec_32(val);
memcpy(field_mem, &decoded, sizeof(decoded));

@ -258,7 +258,7 @@ static bool upb_encode_scalarfield(upb_encstate *e, const char *field_mem,
bool is_proto3) {
#define CASE(ctype, type, wire_type, encodeval) do { \
ctype val = *(ctype*)field_mem; \
if (is_proto3 && val == 0) { \
if (is_proto3 && f->oneof_index == UPB_NOT_IN_ONEOF && val == 0) { \
return true; \
} \
return upb_put_ ## type(e, encodeval) && \
@ -292,7 +292,7 @@ static bool upb_encode_scalarfield(upb_encstate *e, const char *field_mem,
case UPB_DESCRIPTOR_TYPE_STRING:
case UPB_DESCRIPTOR_TYPE_BYTES: {
upb_stringview view = *(upb_stringview*)field_mem;
if (is_proto3 && view.size == 0) {
if (is_proto3 && f->oneof_index == UPB_NOT_IN_ONEOF && view.size == 0) {
return true;
}
return upb_put_bytes(e, view.data, view.size) &&
@ -303,7 +303,7 @@ static bool upb_encode_scalarfield(upb_encstate *e, const char *field_mem,
size_t size;
void *submsg = *(void**)field_mem;
const upb_msglayout_msginit_v1 *subm = m->submsgs[f->submsg_index];
if (is_proto3 && submsg == NULL) {
if (is_proto3 && f->oneof_index == UPB_NOT_IN_ONEOF && submsg == NULL) {
return true;
}
return upb_put_tag(e, f->number, UPB_WIRE_TYPE_END_GROUP) &&
@ -314,7 +314,7 @@ static bool upb_encode_scalarfield(upb_encstate *e, const char *field_mem,
size_t size;
void *submsg = *(void**)field_mem;
const upb_msglayout_msginit_v1 *subm = m->submsgs[f->submsg_index];
if (is_proto3 && submsg == NULL) {
if (is_proto3 && f->oneof_index == UPB_NOT_IN_ONEOF && submsg == NULL) {
return true;
}
return upb_encode_message(e, submsg, subm, &size) &&
@ -344,6 +344,11 @@ bool upb_encode_message(upb_encstate* e, const char *msg,
size_t *size) {
int i;
char *buf_end = e->ptr;
if (msg == NULL) {
return true;
}
for (i = m->field_count - 1; i >= 0; i--) {
const upb_msglayout_fieldinit_v1 *f = &m->fields[i];

Loading…
Cancel
Save