@@ -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