Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit cf35cdc

Browse files
authored
fix: Apply oneof last-value wins during decode (#2193)
1 parent 7b8d5c1 commit cf35cdc

3 files changed

Lines changed: 15 additions & 0 deletions

File tree

src/decoder.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,8 @@ function decoder(mtype) {
109109
: "%s=types[%i].decode(r,r.uint32(),undefined,n+1)", ref, i);
110110
else gen
111111
("%s=r.%s()", ref, type);
112+
if (field.partOf) gen
113+
("m%s=%j", util.safeProp(field.partOf.name), field.name);
112114
gen
113115
("break")
114116
("}");

tests/comp_oneof.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,11 @@ tape.test("oneofs", function(test) {
5353
test.equal(buf[0], 16, "should write id 1, wireType 0");
5454
test.equal(buf[1], 0, "should write a value of 0");
5555

56+
message = Message.decode([ 10, 1, 97, 16, 1 ]);
57+
test.equal(message.kind, "num", "should decode the last value");
58+
test.notOk(message.hasOwnProperty("str"), "should delete previous values while decoding");
59+
test.same(Array.prototype.slice.call(Message.encode(message).finish()), [ 16, 1 ], "should re-encode only the last value");
60+
5661
test.end();
5762

5863
});

tests/data/test.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7827,18 +7827,22 @@ $root.jspb = (function() {
78277827
switch (tag >>> 3) {
78287828
case 3: {
78297829
message.pone = reader.string();
7830+
message.partialOneof = "pone";
78307831
break;
78317832
}
78327833
case 5: {
78337834
message.pthree = reader.string();
7835+
message.partialOneof = "pthree";
78347836
break;
78357837
}
78367838
case 6: {
78377839
message.rone = $root.jspb.test.TestMessageWithOneof.decode(reader, reader.uint32(), undefined, long + 1);
7840+
message.recursiveOneof = "rone";
78387841
break;
78397842
}
78407843
case 7: {
78417844
message.rtwo = reader.string();
7845+
message.recursiveOneof = "rtwo";
78427846
break;
78437847
}
78447848
case 8: {
@@ -7853,18 +7857,22 @@ $root.jspb = (function() {
78537857
}
78547858
case 10: {
78557859
message.aone = reader.int32();
7860+
message.defaultOneofA = "aone";
78567861
break;
78577862
}
78587863
case 11: {
78597864
message.atwo = reader.int32();
7865+
message.defaultOneofA = "atwo";
78607866
break;
78617867
}
78627868
case 12: {
78637869
message.bone = reader.int32();
7870+
message.defaultOneofB = "bone";
78647871
break;
78657872
}
78667873
case 13: {
78677874
message.btwo = reader.int32();
7875+
message.defaultOneofB = "btwo";
78687876
break;
78697877
}
78707878
default:

0 commit comments

Comments
 (0)