Browse Source

encoding/cbor: fix skipping of ignored/missing fields in struct unmarshal

Laytan Laats 9 months ago
parent
commit
4608d26e6e

+ 2 - 0
core/encoding/cbor/unmarshal.odin

@@ -664,6 +664,8 @@ _unmarshal_map :: proc(d: Decoder, v: any, ti: ^reflect.Type_Info, hdr: Header,
 				
 				
 				// Skips unused map entries.
 				// Skips unused map entries.
 				if use_field_idx < 0 {
 				if use_field_idx < 0 {
+					val := err_conv(_decode_from_decoder(d, allocator=context.temp_allocator)) or_return
+					destroy(val, context.temp_allocator)
 					continue
 					continue
 				}
 				}
 			}
 			}

+ 4 - 1
tests/core/encoding/cbor/test_core_cbor.odin

@@ -392,6 +392,7 @@ test_unmarshal_map_into_struct_partially :: proc(t: ^testing.T) {
 		bar: struct {
 		bar: struct {
 			hello: string,
 			hello: string,
 			world: string,
 			world: string,
+			foo:   string `cbor:"-"`,
 		},
 		},
 		baz: int,
 		baz: int,
 	}
 	}
@@ -401,6 +402,7 @@ test_unmarshal_map_into_struct_partially :: proc(t: ^testing.T) {
 			hello:   string,
 			hello:   string,
 			world:   string,
 			world:   string,
 			hellope: string,
 			hellope: string,
+			foo:     string,
 		},
 		},
 		baz: int,
 		baz: int,
 	}
 	}
@@ -409,6 +411,7 @@ test_unmarshal_map_into_struct_partially :: proc(t: ^testing.T) {
 			hello   = "hello",
 			hello   = "hello",
 			world   = "world",
 			world   = "world",
 			hellope = "hellope",
 			hellope = "hellope",
+			foo     = "foo",
 		},
 		},
 		baz = 4,
 		baz = 4,
 	}
 	}
@@ -426,7 +429,7 @@ test_unmarshal_map_into_struct_partially :: proc(t: ^testing.T) {
 	less_out: Foo
 	less_out: Foo
 	uerr := cbor.unmarshal(string(more_bin), &less_out)
 	uerr := cbor.unmarshal(string(more_bin), &less_out)
 	testing.expect_value(t, uerr, nil)
 	testing.expect_value(t, uerr, nil)
-	testing.expect_value(t, less, less_out)
+	testing.expect_value(t, less_out, less)
 
 
 	delete(more_bin)
 	delete(more_bin)
 	delete(less_out.bar.hello)
 	delete(less_out.bar.hello)