@@ -45,7 +45,7 @@ type state struct {
4545}
4646
4747func (s * state ) Release () {
48- statePool .Put (& s )
48+ statePool .Put (s )
4949}
5050
5151func (s state ) Operation () Operation {
@@ -271,82 +271,80 @@ func (s *state) assign(dst reflect.Value, val reflect.Value) (reflect.Value, err
271271 return reflect.Value {}, fmt .Errorf ("unexpected end of JSON pointer %v" , cur )
272272 }
273273 // new dst
274- var nd reflect.Value
275- nd , err = s .resolveNext (dst , t )
274+ var rn reflect.Value
275+ rn , err = s .resolveNext (dst , t )
276276 if err != nil {
277- return nd , err
277+ return rn , err
278278 }
279279
280280 shouldSet := false
281- switch nd .Kind () {
281+ switch rn .Kind () {
282282 case reflect .Interface :
283- if ! nd .IsNil () && nd .Type () == typeAny {
284- nd = nd .Elem ()
283+ if ! rn .IsNil () && rn .Type () == typeAny {
284+ rn = rn .Elem ()
285285 }
286286 case reflect .Ptr :
287- if nd .IsNil () {
288- nd .Set (reflect .New (nd .Type ().Elem ()))
287+ if rn .IsNil () {
288+ rn .Set (reflect .New (rn .Type ().Elem ()))
289289 }
290290 case reflect .Map :
291- if nd .IsNil () {
292- nd .Set (reflect .MakeMap (nd .Type ()))
291+ if rn .IsNil () {
292+ rn .Set (reflect .MakeMap (rn .Type ()))
293293 }
294294 case reflect .Slice :
295- if nd .IsNil () {
296- nd .Set (reflect .MakeSlice (nd .Type (), 0 , 1 ))
295+ if rn .IsNil () {
296+ rn .Set (reflect .MakeSlice (rn .Type (), 0 , 1 ))
297297 }
298298 case reflect .Invalid :
299299 switch dst .Type ().Elem ().Kind () {
300- case reflect .Map :
300+ case reflect .Map , reflect . Slice :
301301 shouldSet = true
302- nd = reflect .Zero (dst .Type ().Elem ().Elem ())
303- if nd .Kind () == reflect .Ptr && nd .IsNil () {
304- nd = reflect .New (nd .Type ().Elem ())
302+ rn = reflect .Zero (dst .Type ().Elem ().Elem ())
303+ if rn .Kind () == reflect .Ptr && rn .IsNil () {
304+ rn = reflect .New (rn .Type ().Elem ())
305305 // so this works
306- } else if nd .Type () == typeAny && nd .IsNil () {
307- fmt .Printf ("\t token: %v\n \t \t current: %v\n \t \t root: %v\n " , t , s .current , s .current .IsRoot ())
308- switch {
309- case s .current .IsRoot ():
310- nd = reflect .Zero (val .Type ())
311- case t .IsIndexable ():
312- nd = reflect .MakeSlice (typeAnySlice , 0 , 1 )
313- default :
314- nd = reflect .MakeMap (typeAnyMap )
306+ } else if rn .Type () == typeAny && rn .IsNil () {
307+ nt , ok := s .current .NextToken ()
308+ if ! ok {
309+ rn = reflect .Zero (val .Type ())
310+ } else {
311+ if _ , err = nt .Index (0 ); err == nil {
312+ rn = reflect .MakeSlice (typeAnySlice , 0 , 1 )
313+ } else {
314+ rn = reflect .MakeMap (typeAnyMap )
315+ }
315316 }
316317 }
317- case reflect .Slice :
318- shouldSet = true
319- if err != nil {
320- return reflect.Value {}, newError (err , * s , dst .Type ())
321- }
322- nd = reflect .Zero (dst .Type ().Elem ().Elem ())
323- if nd .Kind () == reflect .Ptr && nd .IsNil () {
324- nd = reflect .New (nd .Type ().Elem ())
325- }
326318 case reflect .Interface :
327- if nd .Type () == typeAny {
328- switch {
329- case s .current .IsRoot ():
330- nd = reflect .Zero (val .Type ())
331- case t .IsIndexable ():
332- nd = reflect .MakeSlice (typeAnySlice , 0 , 1 )
333- default :
334- nd = reflect .MakeMap (typeAnyMap )
319+ _ , nt , ok := s .current .Next ()
320+ if ! ok {
321+ panic ("pointer is not ok" )
322+ }
323+ if rn .Type () == typeAny {
324+ if s .current .IsRoot () {
325+ rn = reflect .Zero (val .Type ())
326+ } else {
327+ if _ , err = nt .Index (0 ); err == nil {
328+ rn = reflect .MakeSlice (typeAnySlice , 0 , 1 )
329+ } else {
330+ rn = reflect .MakeMap (typeAnyMap )
331+ }
335332 }
336333 }
337334 default :
338335 return reflect.Value {}, newError (ErrUnreachable , * s , dst .Type ())
339336 }
340337 }
341- if nd .CanAddr () {
342- nd = nd .Addr ()
338+
339+ if rn .CanAddr () {
340+ rn = rn .Addr ()
343341 } else {
344- pv := reflect .New (nd .Type ())
345- pv .Elem ().Set (nd )
346- nd = pv
342+ pv := reflect .New (rn .Type ())
343+ pv .Elem ().Set (rn )
344+ rn = pv
347345 }
348346 var nv reflect.Value
349- nv , err = s .assign (nd , val )
347+ nv , err = s .assign (rn , val )
350348
351349 s .current = s .current .Prepend (t )
352350 if err != nil {
@@ -385,16 +383,16 @@ func (s *state) assign(dst reflect.Value, val reflect.Value) (reflect.Value, err
385383 s .current = cur
386384 }
387385 }
388- nd , err = s .assignValue (nd , nv .Elem ())
386+ rn , err = s .assignValue (rn , nv .Elem ())
389387 if err != nil {
390- return nd , err
388+ return rn , err
391389 }
392390 if shouldSet {
393391 switch dst .Elem ().Kind () {
394392 case reflect .Map :
395- s .setMapIndex (dst .Elem (), t , nd .Elem ())
393+ s .setMapIndex (dst .Elem (), t , rn .Elem ())
396394 case reflect .Slice :
397- s .setSliceIndex (dst .Elem (), t , nd .Elem ())
395+ s .setSliceIndex (dst .Elem (), t , rn .Elem ())
398396 }
399397 }
400398 return dst , nil
0 commit comments