@@ -19,7 +19,7 @@ function decoder(mtype) {
19
19
var gen = util . codegen ( [ "r" , "l" ] , mtype . name + "$decode" )
20
20
( "if(!(r instanceof Reader))" )
21
21
( "r=Reader.create(r)" )
22
- ( "var c=l===undefined?r.len:r.pos+l,m=new this.ctor" + ( mtype . fieldsArray . filter ( function ( field ) { return field . map ; } ) . length ? ",k" : "" ) )
22
+ ( "var c=l===undefined?r.len:r.pos+l,m=new this.ctor" + ( mtype . fieldsArray . filter ( function ( field ) { return field . map ; } ) . length ? ",k,value " : "" ) )
23
23
( "while(r.pos<c){" )
24
24
( "var t=r.uint32()" ) ;
25
25
if ( mtype . group ) gen
@@ -37,22 +37,44 @@ function decoder(mtype) {
37
37
38
38
// Map fields
39
39
if ( field . map ) { gen
40
- ( "r.skip().pos++" ) // assumes id 1 + key wireType
41
40
( "if(%s===util.emptyObject)" , ref )
42
41
( "%s={}" , ref )
43
- ( "k=r.%s()" , field . keyType )
44
- ( "r.pos++" ) ; // assumes id 2 + value wireType
45
- if ( types . long [ field . keyType ] !== undefined ) {
46
- if ( types . basic [ type ] === undefined ) gen
47
- ( "%s[typeof k===\"object\"?util.longToHash(k):k]=types[%i].decode(r,r.uint32())" , ref , i ) ; // can't be groups
48
- else gen
49
- ( "%s[typeof k===\"object\"?util.longToHash(k):k]=r.%s()" , ref , type ) ;
50
- } else {
51
- if ( types . basic [ type ] === undefined ) gen
52
- ( "%s[k]=types[%i].decode(r,r.uint32())" , ref , i ) ; // can't be groups
53
- else gen
54
- ( "%s[k]=r.%s()" , ref , type ) ;
55
- }
42
+ ( "var c2 = r.uint32()+r.pos" ) ;
43
+
44
+ if ( types . defaults [ field . keyType ] !== undefined ) gen
45
+ ( "k=%j" , types . defaults [ field . keyType ] ) ;
46
+ else gen
47
+ ( "k=null" ) ;
48
+
49
+ if ( types . defaults [ type ] !== undefined ) gen
50
+ ( "value=%j" , types . defaults [ type ] ) ;
51
+ else gen
52
+ ( "value=null" ) ;
53
+
54
+ gen
55
+ ( "while(r.pos<c2){" )
56
+ ( "var tag2=r.uint32()" )
57
+ ( "switch(tag2>>>3){" )
58
+ ( "case 1: k=r.%s(); break" , field . keyType )
59
+ ( "case 2:" ) ;
60
+
61
+ if ( types . basic [ type ] === undefined ) gen
62
+ ( "value=types[%i].decode(r,r.uint32())" , i ) ; // can't be groups
63
+ else gen
64
+ ( "value=r.%s()" , type ) ;
65
+
66
+ gen
67
+ ( "break" )
68
+ ( "default:" )
69
+ ( "r.skipType(tag2&7)" )
70
+ ( "break" )
71
+ ( "}" )
72
+ ( "}" ) ;
73
+
74
+ if ( types . long [ field . keyType ] !== undefined ) gen
75
+ ( "%s[typeof k===\"object\"?util.longToHash(k):k]=value" , ref ) ;
76
+ else gen
77
+ ( "%s[k]=value" , ref ) ;
56
78
57
79
// Repeated fields
58
80
} else if ( field . repeated ) { gen
0 commit comments