Skip to content

Commit c1ca65d

Browse files
committed
New: Sequentially serialize fields ordered by id, as of the spec.
1 parent 3ead13e commit c1ca65d

File tree

1 file changed

+13
-5
lines changed

1 file changed

+13
-5
lines changed

src/encoder.js

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,16 @@ function encoder(mtype) {
3232
("w=Writer.create()");
3333

3434
var i, ref;
35-
for (var i = 0; i < /* initializes */ mtype.fieldsArray.length; ++i) {
36-
var field = mtype._fieldsArray[i].resolve();
35+
36+
// "when a message is serialized its known fields should be written sequentially by field number"
37+
var sortedFields = /* initializes */ mtype.fieldsArray.slice();
38+
sortedFields.sort(function(a, b) {
39+
return a.id - b.id;
40+
});
41+
42+
for (var i = 0; i < sortedFields.length; ++i) {
43+
var field = sortedFields[i].resolve(),
44+
index = mtype._fieldsArray.indexOf(field);
3745
if (field.partOf) // see below for oneofs
3846
continue;
3947
var type = field.resolvedType instanceof Enum ? "uint32" : field.type,
@@ -47,7 +55,7 @@ function encoder(mtype) {
4755
("for(var ks=Object.keys(%s),i=0;i<ks.length;++i){", ref)
4856
("w.uint32(%d).fork().uint32(%d).%s(ks[i])", (field.id << 3 | 2) >>> 0, 8 | types.mapKey[field.keyType], field.keyType);
4957
if (wireType === undefined) gen
50-
("types[%d].encode(%s[ks[i]],w.uint32(18).fork()).ldelim().ldelim()", i, ref); // can't be groups
58+
("types[%d].encode(%s[ks[i]],w.uint32(18).fork()).ldelim().ldelim()", index, ref); // can't be groups
5159
else gen
5260
(".uint32(%d).%s(%s[ks[i]]).ldelim()", 16 | wireType, type, ref);
5361
gen
@@ -73,7 +81,7 @@ function encoder(mtype) {
7381
("if(%s!==undefined&&m.hasOwnProperty(%j)){", ref, field.name)
7482
("for(var i=0;i<%s.length;++i)", ref);
7583
if (wireType === undefined)
76-
genTypePartial(gen, field, i, ref + "[i]");
84+
genTypePartial(gen, field, index, ref + "[i]");
7785
else gen
7886
("w.uint32(%d).%s(%s[i])", (field.id << 3 | wireType) >>> 0, type, ref);
7987
gen
@@ -95,7 +103,7 @@ function encoder(mtype) {
95103
}
96104

97105
if (wireType === undefined)
98-
genTypePartial(gen, field, i, ref);
106+
genTypePartial(gen, field, index, ref);
99107
else gen
100108
("w.uint32(%d).%s(%s)", (field.id << 3 | wireType) >>> 0, type, ref);
101109

0 commit comments

Comments
 (0)