@@ -10,13 +10,15 @@ type interfaceDecoder struct {
10
10
typ * rtype
11
11
structName string
12
12
fieldName string
13
+ dec * Decoder
13
14
}
14
15
15
- func newInterfaceDecoder (typ * rtype , structName , fieldName string ) * interfaceDecoder {
16
+ func newInterfaceDecoder (dec * Decoder , typ * rtype , structName , fieldName string ) * interfaceDecoder {
16
17
return & interfaceDecoder {
17
18
typ : typ ,
18
19
structName : structName ,
19
20
fieldName : fieldName ,
21
+ dec : dec ,
20
22
}
21
23
}
22
24
40
42
)
41
43
)
42
44
43
- func decodeWithUnmarshaler (s * stream , unmarshaler Unmarshaler ) error {
45
+ func decodeStreamUnmarshaler (s * stream , unmarshaler Unmarshaler ) error {
44
46
start := s .cursor
45
47
if err := s .skipValue (); err != nil {
46
48
return err
@@ -55,7 +57,7 @@ func decodeWithUnmarshaler(s *stream, unmarshaler Unmarshaler) error {
55
57
return nil
56
58
}
57
59
58
- func decodeWithTextUnmarshaler (s * stream , unmarshaler encoding.TextUnmarshaler ) error {
60
+ func decodeStreamTextUnmarshaler (s * stream , unmarshaler encoding.TextUnmarshaler ) error {
59
61
start := s .cursor
60
62
if err := s .skipValue (); err != nil {
61
63
return err
@@ -70,34 +72,19 @@ func decodeWithTextUnmarshaler(s *stream, unmarshaler encoding.TextUnmarshaler)
70
72
return nil
71
73
}
72
74
73
- func (d * interfaceDecoder ) decodeStream (s * stream , p unsafe.Pointer ) error {
75
+ func (d * interfaceDecoder ) decodeStreamEmptyInterface (s * stream , p unsafe.Pointer ) error {
74
76
s .skipWhiteSpace ()
75
77
for {
76
78
switch s .char () {
77
79
case '{' :
78
- runtimeInterfaceValue := * (* interface {})(unsafe .Pointer (& interfaceHeader {
79
- typ : d .typ ,
80
- ptr : p ,
81
- }))
82
- rv := reflect .ValueOf (runtimeInterfaceValue )
83
- if rv .NumMethod () > 0 && rv .CanInterface () {
84
- if u , ok := rv .Interface ().(Unmarshaler ); ok {
85
- return decodeWithUnmarshaler (s , u )
86
- }
87
- if u , ok := rv .Interface ().(encoding.TextUnmarshaler ); ok {
88
- return decodeWithTextUnmarshaler (s , u )
89
- }
90
- return nil
91
- }
92
- // empty interface
93
80
var v map [string ]interface {}
94
81
ptr := unsafe .Pointer (& v )
95
82
if err := newMapDecoder (
96
83
interfaceMapType ,
97
84
stringType ,
98
85
newStringDecoder (d .structName , d .fieldName ),
99
86
interfaceMapType .Elem (),
100
- newInterfaceDecoder (d .typ , d .structName , d .fieldName ),
87
+ newInterfaceDecoder (d .dec , d . typ , d .structName , d .fieldName ),
101
88
d .structName ,
102
89
d .fieldName ,
103
90
).decodeStream (s , ptr ); err != nil {
@@ -109,7 +96,7 @@ func (d *interfaceDecoder) decodeStream(s *stream, p unsafe.Pointer) error {
109
96
var v []interface {}
110
97
ptr := unsafe .Pointer (& v )
111
98
if err := newSliceDecoder (
112
- newInterfaceDecoder (d .typ , d .structName , d .fieldName ),
99
+ newInterfaceDecoder (d .dec , d . typ , d .structName , d .fieldName ),
113
100
d .typ ,
114
101
d .typ .Size (),
115
102
d .structName ,
@@ -171,7 +158,86 @@ func (d *interfaceDecoder) decodeStream(s *stream, p unsafe.Pointer) error {
171
158
return errNotAtBeginningOfValue (s .totalOffset ())
172
159
}
173
160
161
+ func (d * interfaceDecoder ) decodeStream (s * stream , p unsafe.Pointer ) error {
162
+ runtimeInterfaceValue := * (* interface {})(unsafe .Pointer (& interfaceHeader {
163
+ typ : d .typ ,
164
+ ptr : p ,
165
+ }))
166
+ rv := reflect .ValueOf (runtimeInterfaceValue )
167
+ if rv .NumMethod () > 0 && rv .CanInterface () {
168
+ if u , ok := rv .Interface ().(Unmarshaler ); ok {
169
+ return decodeStreamUnmarshaler (s , u )
170
+ }
171
+ if u , ok := rv .Interface ().(encoding.TextUnmarshaler ); ok {
172
+ return decodeStreamTextUnmarshaler (s , u )
173
+ }
174
+ return nil
175
+ }
176
+ iface := rv .Interface ()
177
+ ifaceHeader := (* interfaceHeader )(unsafe .Pointer (& iface ))
178
+ typ := ifaceHeader .typ
179
+ if d .typ == typ || typ == nil {
180
+ // concrete type is empty interface
181
+ return d .decodeStreamEmptyInterface (s , p )
182
+ }
183
+ if typ .Kind () == reflect .Ptr && typ .Elem () == d .typ || typ .Kind () != reflect .Ptr {
184
+ return d .decodeStreamEmptyInterface (s , p )
185
+ }
186
+ if s .char () == 'n' {
187
+ if err := nullBytes (s ); err != nil {
188
+ return err
189
+ }
190
+ * (* interface {})(p ) = nil
191
+ return nil
192
+ }
193
+ decoder , err := d .dec .compileToGetDecoder (uintptr (unsafe .Pointer (typ )), typ )
194
+ if err != nil {
195
+ return err
196
+ }
197
+ return decoder .decodeStream (s , ifaceHeader .ptr )
198
+ }
199
+
174
200
func (d * interfaceDecoder ) decode (buf []byte , cursor int64 , p unsafe.Pointer ) (int64 , error ) {
201
+ runtimeInterfaceValue := * (* interface {})(unsafe .Pointer (& interfaceHeader {
202
+ typ : d .typ ,
203
+ ptr : p ,
204
+ }))
205
+ rv := reflect .ValueOf (runtimeInterfaceValue )
206
+ iface := rv .Interface ()
207
+ ifaceHeader := (* interfaceHeader )(unsafe .Pointer (& iface ))
208
+ typ := ifaceHeader .typ
209
+ if d .typ == typ || typ == nil {
210
+ // concrete type is empty interface
211
+ return d .decodeEmptyInterface (buf , cursor , p )
212
+ }
213
+ if typ .Kind () == reflect .Ptr && typ .Elem () == d .typ || typ .Kind () != reflect .Ptr {
214
+ return d .decodeEmptyInterface (buf , cursor , p )
215
+ }
216
+ if buf [cursor ] == 'n' {
217
+ if cursor + 3 >= int64 (len (buf )) {
218
+ return 0 , errUnexpectedEndOfJSON ("null" , cursor )
219
+ }
220
+ if buf [cursor + 1 ] != 'u' {
221
+ return 0 , errInvalidCharacter (buf [cursor + 1 ], "null" , cursor )
222
+ }
223
+ if buf [cursor + 2 ] != 'l' {
224
+ return 0 , errInvalidCharacter (buf [cursor + 2 ], "null" , cursor )
225
+ }
226
+ if buf [cursor + 3 ] != 'l' {
227
+ return 0 , errInvalidCharacter (buf [cursor + 3 ], "null" , cursor )
228
+ }
229
+ cursor += 4
230
+ * * (* * interface {})(unsafe .Pointer (& p )) = nil
231
+ return cursor , nil
232
+ }
233
+ decoder , err := d .dec .compileToGetDecoder (uintptr (unsafe .Pointer (typ )), typ )
234
+ if err != nil {
235
+ return 0 , err
236
+ }
237
+ return decoder .decode (buf , cursor , ifaceHeader .ptr )
238
+ }
239
+
240
+ func (d * interfaceDecoder ) decodeEmptyInterface (buf []byte , cursor int64 , p unsafe.Pointer ) (int64 , error ) {
175
241
cursor = skipWhiteSpace (buf , cursor )
176
242
switch buf [cursor ] {
177
243
case '{' :
@@ -182,7 +248,7 @@ func (d *interfaceDecoder) decode(buf []byte, cursor int64, p unsafe.Pointer) (i
182
248
stringType ,
183
249
newStringDecoder (d .structName , d .fieldName ),
184
250
interfaceMapType .Elem (),
185
- newInterfaceDecoder (d .typ , d .structName , d .fieldName ),
251
+ newInterfaceDecoder (d .dec , d . typ , d .structName , d .fieldName ),
186
252
d .structName , d .fieldName ,
187
253
)
188
254
cursor , err := dec .decode (buf , cursor , ptr )
@@ -195,7 +261,7 @@ func (d *interfaceDecoder) decode(buf []byte, cursor int64, p unsafe.Pointer) (i
195
261
var v []interface {}
196
262
ptr := unsafe .Pointer (& v )
197
263
dec := newSliceDecoder (
198
- newInterfaceDecoder (d .typ , d .structName , d .fieldName ),
264
+ newInterfaceDecoder (d .dec , d . typ , d .structName , d .fieldName ),
199
265
d .typ ,
200
266
d .typ .Size (),
201
267
d .structName , d .fieldName ,
0 commit comments