func (cdc *Codec) decodeReflectJSONSlice(bz []byte, info *TypeInfo, rv reflect.Value, fopts FieldOptions) (err error) {
	if !rv.CanAddr() {
		panic("rv not addressable")
	}
	if printLog {
		fmt.Println("(d) decodeReflectJSONSlice")
		defer func() {
			fmt.Printf("(d) -> err: %v\n", err)
		}()
	}

	var ert = info.Type.Elem()

	switch ert.Kind() {

	case reflect.Uint8: // Special case: byte slice
		err = json.Unmarshal(bz, rv.Addr().Interface())
		if err != nil {
			return
		}
		if rv.Len() == 0 {
			// Special case when length is 0.
			// NOTE: We prefer nil slices.
			rv.Set(info.ZeroValue)
		} else {
			// NOTE: Already set via json.Unmarshal() above.
		}
		return

	default: // General case.
		var einfo *TypeInfo
		einfo, err = cdc.getTypeInfo_wlock(ert)
		if err != nil {
			return
		}

		// Read into rawSlice.
		var rawSlice []json.RawMessage
		if err = json.Unmarshal(bz, &rawSlice); err != nil {
			return
		}

		// Special case when length is 0.
		// NOTE: We prefer nil slices.
		var length = len(rawSlice)
		if length == 0 {
			rv.Set(info.ZeroValue)
			return
		}

		// Read into a new slice.
		var esrt = reflect.SliceOf(ert) // TODO could be optimized.
		var srv = reflect.MakeSlice(esrt, length, length)
		for i := 0; i < length; i++ {
			erv := srv.Index(i)
			ebz := rawSlice[i]
			err = cdc.decodeReflectJSON(ebz, einfo, erv, fopts)
			if err != nil {
				return
			}
		}

		// TODO do we need this extra step?
		rv.Set(srv)
		return
	}
}
func (cdc *Codec) decodeReflectJSONSlice(bz []byte, info *TypeInfo, rv reflect.Value, fopts FieldOptions) (err error) {
	if !rv.CanAddr() {
		panic("rv not addressable")
	}
	if printLog {
		fmt.Println("(d) decodeReflectJSONSlice")
		defer func() {
			fmt.Printf("(d) -> err: %v\n", err)
		}()
	}

	var ert = info.Type.Elem()

	switch ert.Kind() {

	case reflect.Uint8: 
		err = json.Unmarshal(bz, rv.Addr().Interface())
		if err != nil {
			return
		}
		if rv.Len() == 0 {
			
			
			rv.Set(info.ZeroValue)
		} else {
			
		}
		return

	default: 
		var einfo *TypeInfo
		einfo, err = cdc.getTypeInfo_wlock(ert)
		if err != nil {
			return
		}

		
		var rawSlice []json.RawMessage
		if err = json.Unmarshal(bz, &rawSlice); err != nil {
			return
		}

		
		
		var length = len(rawSlice)
		if length == 0 {
			rv.Set(info.ZeroValue)
			return
		}

		
		var esrt = reflect.SliceOf(ert) 
		var srv = reflect.MakeSlice(esrt, length, length)
		for i := 0; i < length; i++ {
			erv := srv.Index(i)
			ebz := rawSlice[i]
			err = cdc.decodeReflectJSON(ebz, einfo, erv, fopts)
			if err != nil {
				return
			}
		}

		
		rv.Set(srv)
		return
	}
}
func ( cdc * Codec ) decodeReflectJSONSlice ( bz [ ] byte , info * TypeInfo , rv reflect . Value , fopts FieldOptions ) ( err error ) { if ! rv . CanAddr ( ) { panic ( " " ) } if printLog { fmt . Println ( " " ) defer func ( ) { fmt . Printf ( " \n " , err ) } ( ) } var ert = info . Type . Elem ( ) switch ert . Kind ( ) { case reflect . Uint8 : // Special case: byte slice err = json . Unmarshal ( bz , rv . Addr ( ) . Interface ( ) ) if err != nil { return } if rv . Len ( ) == 0 { // Special case when length is 0. // NOTE: We prefer nil slices. rv . Set ( info . ZeroValue ) } else { // NOTE: Already set via json.Unmarshal() above. } return default : // General case. var einfo * TypeInfo einfo , err = cdc . getTypeInfo_wlock ( ert ) if err != nil { return } // Read into rawSlice. var rawSlice [ ] json . RawMessage if err = json . Unmarshal ( bz , & rawSlice ) ; err != nil { return } // Special case when length is 0. // NOTE: We prefer nil slices. var length = len ( rawSlice ) if length == 0 { rv . Set ( info . ZeroValue ) return } // Read into a new slice. var esrt = reflect . SliceOf ( ert ) // TODO could be optimized. var srv = reflect . MakeSlice ( esrt , length , length ) for i := 0 ; i < length ; i ++ { erv := srv . Index ( i ) ebz := rawSlice [ i ] err = cdc . decodeReflectJSON ( ebz , einfo , erv , fopts ) if err != nil { return } } // TODO do we need this extra step? rv . Set ( srv ) return } }
// CONTRACT: rv.CanAddr() is true.
CONTRACT : rv . CanAddr () is true .