@@ -32,8 +32,16 @@ function encoder(mtype) {
32
32
( "w=Writer.create()" ) ;
33
33
34
34
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 ) ;
37
45
if ( field . partOf ) // see below for oneofs
38
46
continue ;
39
47
var type = field . resolvedType instanceof Enum ? "uint32" : field . type ,
@@ -47,7 +55,7 @@ function encoder(mtype) {
47
55
( "for(var ks=Object.keys(%s),i=0;i<ks.length;++i){" , ref )
48
56
( "w.uint32(%d).fork().uint32(%d).%s(ks[i])" , ( field . id << 3 | 2 ) >>> 0 , 8 | types . mapKey [ field . keyType ] , field . keyType ) ;
49
57
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
51
59
else gen
52
60
( ".uint32(%d).%s(%s[ks[i]]).ldelim()" , 16 | wireType , type , ref ) ;
53
61
gen
@@ -73,7 +81,7 @@ function encoder(mtype) {
73
81
( "if(%s!==undefined&&m.hasOwnProperty(%j)){" , ref , field . name )
74
82
( "for(var i=0;i<%s.length;++i)" , ref ) ;
75
83
if ( wireType === undefined )
76
- genTypePartial ( gen , field , i , ref + "[i]" ) ;
84
+ genTypePartial ( gen , field , index , ref + "[i]" ) ;
77
85
else gen
78
86
( "w.uint32(%d).%s(%s[i])" , ( field . id << 3 | wireType ) >>> 0 , type , ref ) ;
79
87
gen
@@ -95,7 +103,7 @@ function encoder(mtype) {
95
103
}
96
104
97
105
if ( wireType === undefined )
98
- genTypePartial ( gen , field , i , ref ) ;
106
+ genTypePartial ( gen , field , index , ref ) ;
99
107
else gen
100
108
( "w.uint32(%d).%s(%s)" , ( field . id << 3 | wireType ) >>> 0 , type , ref ) ;
101
109
0 commit comments