MYNEWT-428 GATT Go Library - ACL Data packet parsing bug for L2CAP packets - Revendoring
Project: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/commit/b153d958 Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/tree/b153d958 Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/diff/b153d958 Branch: refs/heads/develop Commit: b153d958117f08ca69a5e526bee90c1fedf5eeeb Parents: a441cdf Author: admin <vrah...@gmail.com> Authored: Fri Oct 7 19:36:34 2016 -0700 Committer: admin <vrah...@gmail.com> Committed: Mon Oct 10 12:02:01 2016 -0700 ---------------------------------------------------------------------- newtmgr/Godeps/Godeps.json | 42 ++-- .../mitchellh/mapstructure/mapstructure.go | 6 +- .../github.com/runtimeinc/gatt/linux/hci.go | 33 +-- .../vendor/github.com/spf13/cobra/command.go | 36 ++- newtmgr/vendor/github.com/spf13/pflag/flag.go | 2 +- .../github.com/spf13/pflag/string_slice.go | 2 +- .../vendor/github.com/ugorji/go/codec/0doc.go | 4 +- .../vendor/github.com/ugorji/go/codec/README.md | 2 +- .../vendor/github.com/ugorji/go/codec/binc.go | 9 +- .../vendor/github.com/ugorji/go/codec/cbor.go | 7 + .../vendor/github.com/ugorji/go/codec/decode.go | 44 +++- .../github.com/ugorji/go/codec/decode_go.go | 16 ++ .../github.com/ugorji/go/codec/decode_go14.go | 14 ++ .../vendor/github.com/ugorji/go/codec/encode.go | 50 +++- .../ugorji/go/codec/fast-path.generated.go | 19 +- .../ugorji/go/codec/fast-path.go.tmpl | 19 +- .../github.com/ugorji/go/codec/fast-path.not.go | 2 + .../ugorji/go/codec/gen-helper.generated.go | 14 +- .../ugorji/go/codec/gen-helper.go.tmpl | 12 +- .../vendor/github.com/ugorji/go/codec/gen.go | 47 +++- .../vendor/github.com/ugorji/go/codec/gen_15.go | 12 + .../vendor/github.com/ugorji/go/codec/gen_16.go | 12 + .../vendor/github.com/ugorji/go/codec/gen_17.go | 10 + .../vendor/github.com/ugorji/go/codec/helper.go | 202 +++++++++------ .../ugorji/go/codec/helper_internal.go | 4 +- .../ugorji/go/codec/helper_not_unsafe.go | 2 +- .../github.com/ugorji/go/codec/helper_unsafe.go | 2 +- .../vendor/github.com/ugorji/go/codec/json.go | 12 +- .../github.com/ugorji/go/codec/msgpack.go | 7 + .../vendor/github.com/ugorji/go/codec/rpc.go | 2 +- .../vendor/github.com/ugorji/go/codec/simple.go | 9 +- .../x/sys/unix/syscall_linux_arm64.go | 2 - .../x/sys/unix/syscall_linux_mips64x.go | 7 - newtmgr/vendor/gopkg.in/fsnotify.v1/.travis.yml | 1 - newtmgr/vendor/gopkg.in/fsnotify.v1/AUTHORS | 1 + .../vendor/gopkg.in/fsnotify.v1/CHANGELOG.md | 4 + .../vendor/gopkg.in/fsnotify.v1/CONTRIBUTING.md | 2 +- newtmgr/vendor/gopkg.in/fsnotify.v1/README.md | 2 +- .../vendor/mynewt.apache.org/newt/DISCLAIMER | 8 + newtmgr/vendor/mynewt.apache.org/newt/LICENSE | 244 +++++++++++++++++++ newtmgr/vendor/mynewt.apache.org/newt/NOTICE | 8 + .../vendor/mynewt.apache.org/newt/util/util.go | 99 +++++++- 42 files changed, 815 insertions(+), 217 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/b153d958/newtmgr/Godeps/Godeps.json ---------------------------------------------------------------------- diff --git a/newtmgr/Godeps/Godeps.json b/newtmgr/Godeps/Godeps.json index 50e2eb9..561ed5a 100644 --- a/newtmgr/Godeps/Godeps.json +++ b/newtmgr/Godeps/Godeps.json @@ -31,39 +31,39 @@ }, { "ImportPath": "github.com/mitchellh/mapstructure", - "Rev": "ca63d7c062ee3c9f34db231e352b60012b4fd0c1" + "Rev": "a6ef2f080c66d0a2e94e97cf74f80f772855da63" }, { "ImportPath": "github.com/runtimeinc/gatt", - "Rev": "c853b3423b251fe4ba4b8ac8e2b48ef37fef52d1" + "Rev": "71e7ae065312559668a7d696b81d6768b69db57a" }, { "ImportPath": "github.com/runtimeinc/gatt/linux", - "Rev": "c853b3423b251fe4ba4b8ac8e2b48ef37fef52d1" + "Rev": "71e7ae065312559668a7d696b81d6768b69db57a" }, { "ImportPath": "github.com/runtimeinc/gatt/linux/cmd", - "Rev": "c853b3423b251fe4ba4b8ac8e2b48ef37fef52d1" + "Rev": "71e7ae065312559668a7d696b81d6768b69db57a" }, { "ImportPath": "github.com/runtimeinc/gatt/linux/evt", - "Rev": "c853b3423b251fe4ba4b8ac8e2b48ef37fef52d1" + "Rev": "71e7ae065312559668a7d696b81d6768b69db57a" }, { "ImportPath": "github.com/runtimeinc/gatt/linux/gioctl", - "Rev": "c853b3423b251fe4ba4b8ac8e2b48ef37fef52d1" + "Rev": "71e7ae065312559668a7d696b81d6768b69db57a" }, { "ImportPath": "github.com/runtimeinc/gatt/linux/socket", - "Rev": "c853b3423b251fe4ba4b8ac8e2b48ef37fef52d1" + "Rev": "71e7ae065312559668a7d696b81d6768b69db57a" }, { "ImportPath": "github.com/runtimeinc/gatt/linux/util", - "Rev": "c853b3423b251fe4ba4b8ac8e2b48ef37fef52d1" + "Rev": "71e7ae065312559668a7d696b81d6768b69db57a" }, { "ImportPath": "github.com/runtimeinc/gatt/xpc", - "Rev": "c853b3423b251fe4ba4b8ac8e2b48ef37fef52d1" + "Rev": "71e7ae065312559668a7d696b81d6768b69db57a" }, { "ImportPath": "github.com/spf13/cast", @@ -71,7 +71,7 @@ }, { "ImportPath": "github.com/spf13/cobra", - "Rev": "9c28e4bbd74e5c3ed7aacbc552b2cab7cfdfe744" + "Rev": "ec2fe7859914a5106dcab4e7901633d959bfc2f4" }, { "ImportPath": "github.com/spf13/jwalterweatherman", @@ -79,7 +79,7 @@ }, { "ImportPath": "github.com/spf13/pflag", - "Rev": "c7e63cf4530bcd3ba943729cee0efeff2ebea63f" + "Rev": "b83537d79690b75cac5e021b036ae16792bf0f20" }, { "ImportPath": "github.com/tarm/serial", @@ -87,31 +87,31 @@ }, { "ImportPath": "github.com/ugorji/go/codec", - "Rev": "187fa0f8af224437e08ecb3f208c4d1a94859a61" + "Rev": "faddd6128c66c4708f45fdc007f575f75e592a3c" }, { "ImportPath": "golang.org/x/sys/unix", - "Rev": "8f0908ab3b2457e2e15403d3697c9ef5cb4b57a9" + "Rev": "8d1157a435470616f975ff9bb013bea8d0962067" }, { "ImportPath": "gopkg.in/fsnotify.v1", - "Comment": "v1.4.0", - "Rev": "26b17cd591df34e7b1cf0087f48fc19ca67eb476" + "Comment": "v1.4.1", + "Rev": "944cff21b3baf3ced9a880365682152ba577d348" }, { "ImportPath": "mynewt.apache.org/newt/util", - "Comment": "pre_sterly_refactor-21-g5389f4c", - "Rev": "5389f4c4ef7d7587658b3374d1d0f68f7ecd14c3" + "Comment": "pre_sterly_refactor-39-gc1470a5", + "Rev": "c1470a51a7f7b6b3deef4597de828f980780ae3d" }, { "ImportPath": "mynewt.apache.org/newt/viper", - "Comment": "pre_sterly_refactor-21-g5389f4c", - "Rev": "5389f4c4ef7d7587658b3374d1d0f68f7ecd14c3" + "Comment": "pre_sterly_refactor-39-gc1470a5", + "Rev": "c1470a51a7f7b6b3deef4597de828f980780ae3d" }, { "ImportPath": "mynewt.apache.org/newt/yaml", - "Comment": "pre_sterly_refactor-21-g5389f4c", - "Rev": "5389f4c4ef7d7587658b3374d1d0f68f7ecd14c3" + "Comment": "pre_sterly_refactor-39-gc1470a5", + "Rev": "c1470a51a7f7b6b3deef4597de828f980780ae3d" } ] } http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/b153d958/newtmgr/vendor/github.com/mitchellh/mapstructure/mapstructure.go ---------------------------------------------------------------------- diff --git a/newtmgr/vendor/github.com/mitchellh/mapstructure/mapstructure.go b/newtmgr/vendor/github.com/mitchellh/mapstructure/mapstructure.go index a554e79..d1cb607 100644 --- a/newtmgr/vendor/github.com/mitchellh/mapstructure/mapstructure.go +++ b/newtmgr/vendor/github.com/mitchellh/mapstructure/mapstructure.go @@ -698,7 +698,7 @@ func (d *Decoder) decodeStruct(name string, data interface{}, val reflect.Value) if !rawMapVal.IsValid() { // Do a slower search by iterating over each key and // doing case-insensitive search. - for dataValKey, _ := range dataValKeys { + for dataValKey := range dataValKeys { mK, ok := dataValKey.Interface().(string) if !ok { // Not a string key @@ -746,7 +746,7 @@ func (d *Decoder) decodeStruct(name string, data interface{}, val reflect.Value) if d.config.ErrorUnused && len(dataValKeysUnused) > 0 { keys := make([]string, 0, len(dataValKeysUnused)) - for rawKey, _ := range dataValKeysUnused { + for rawKey := range dataValKeysUnused { keys = append(keys, rawKey.(string)) } sort.Strings(keys) @@ -761,7 +761,7 @@ func (d *Decoder) decodeStruct(name string, data interface{}, val reflect.Value) // Add the unused keys to the list of unused keys if we're tracking metadata if d.config.Metadata != nil { - for rawKey, _ := range dataValKeysUnused { + for rawKey := range dataValKeysUnused { key := rawKey.(string) if name != "" { key = fmt.Sprintf("%s.%s", name, key) http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/b153d958/newtmgr/vendor/github.com/runtimeinc/gatt/linux/hci.go ---------------------------------------------------------------------- diff --git a/newtmgr/vendor/github.com/runtimeinc/gatt/linux/hci.go b/newtmgr/vendor/github.com/runtimeinc/gatt/linux/hci.go index a04e860..c41d0bf 100644 --- a/newtmgr/vendor/github.com/runtimeinc/gatt/linux/hci.go +++ b/newtmgr/vendor/github.com/runtimeinc/gatt/linux/hci.go @@ -367,27 +367,30 @@ func (h *HCI) handleLEMeta(b []byte) error { } func (h *HCI) handleL2CAP(b []byte) error { - a := &aclData{} + a := &aclData{} if err := a.unmarshal(b); err != nil { return err } h.connsmu.Lock() defer h.connsmu.Unlock() c, found := h.conns[a.attr] - if !found { - // should not happen, just be cautious for now. - log.Printf("l2conn: got data for disconnected handle: 0x%04x", a.attr) - return nil - } - if len(a.b) < 4 { - log.Printf("l2conn: l2cap packet is too short/corrupt, length is %d", len(a.b)) - return nil - } - cid := uint16(a.b[2]) | (uint16(a.b[3]) << 8) - if cid == 5 { - c.handleSignal(a) - return nil - } + + if a.flags != 0x002 { + if !found { + // should not happen, just be cautious for now. + log.Printf("l2conn: got data for disconnected handle: 0x%04x", a.attr) + return nil + if len(a.b) < 4 { + log.Printf("l2conn: l2cap packet is too short/corrupt, length is %d", len(a.b)) + return nil + } + cid := uint16(a.b[2]) | (uint16(a.b[3]) << 8) + if cid == 5 { + c.handleSignal(a) + return nil + } + } + } c.aclc <- a return nil } http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/b153d958/newtmgr/vendor/github.com/spf13/cobra/command.go ---------------------------------------------------------------------- diff --git a/newtmgr/vendor/github.com/spf13/cobra/command.go b/newtmgr/vendor/github.com/spf13/cobra/command.go index 9ae9836..8f6580a 100644 --- a/newtmgr/vendor/github.com/spf13/cobra/command.go +++ b/newtmgr/vendor/github.com/spf13/cobra/command.go @@ -109,10 +109,11 @@ type Command struct { flagErrorBuf *bytes.Buffer - args []string // actual args parsed from flags - output *io.Writer // out writer if set in SetOutput(w) - usageFunc func(*Command) error // Usage can be defined by application - usageTemplate string // Can be defined by Application + args []string // actual args parsed from flags + output *io.Writer // out writer if set in SetOutput(w) + usageFunc func(*Command) error // Usage can be defined by application + usageTemplate string // Can be defined by Application + flagErrorFunc func(*Command, error) error helpTemplate string // Can be defined by Application helpFunc func(*Command, []string) // Help can be defined by application helpCommand *Command // The help command @@ -150,7 +151,13 @@ func (c *Command) SetUsageTemplate(s string) { c.usageTemplate = s } -// Can be defined by Application. +// SetFlagErrorFunc sets a function to generate an error when flag parsing +// fails +func (c *Command) SetFlagErrorFunc(f func(*Command, error) error) { + c.flagErrorFunc = f +} + +// Can be defined by Application func (c *Command) SetHelpFunc(f func(*Command, []string)) { c.helpFunc = f } @@ -257,6 +264,22 @@ func (c *Command) UsageString() string { return bb.String() } +// FlagErrorFunc returns either the function set by SetFlagErrorFunc for this +// command or a parent, or it returns a function which returns the original +// error. +func (c *Command) FlagErrorFunc() (f func(*Command, error) error) { + if c.flagErrorFunc != nil { + return c.flagErrorFunc + } + + if c.HasParent() { + return c.parent.FlagErrorFunc() + } + return func(c *Command, err error) error { + return err + } +} + var minUsagePadding = 25 func (c *Command) UsagePadding() int { @@ -553,7 +576,7 @@ func (c *Command) execute(a []string) (err error) { err = c.ParseFlags(a) if err != nil { - return err + return c.FlagErrorFunc()(c, err) } // If help is called, regardless of other flags, return we want help // Also say we need help if the command isn't runnable. @@ -712,6 +735,7 @@ func (c *Command) ExecuteC() (cmd *Command, err error) { } func (c *Command) initHelpFlag() { + c.mergePersistentFlags() if c.Flags().Lookup("help") == nil { c.Flags().BoolP("help", "h", false, "help for "+c.Name()) } http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/b153d958/newtmgr/vendor/github.com/spf13/pflag/flag.go ---------------------------------------------------------------------- diff --git a/newtmgr/vendor/github.com/spf13/pflag/flag.go b/newtmgr/vendor/github.com/spf13/pflag/flag.go index b0b0d46..4258f45 100644 --- a/newtmgr/vendor/github.com/spf13/pflag/flag.go +++ b/newtmgr/vendor/github.com/spf13/pflag/flag.go @@ -416,7 +416,7 @@ func Set(name, value string) error { // otherwise, the default values of all defined flags in the set. func (f *FlagSet) PrintDefaults() { usages := f.FlagUsages() - fmt.Fprintf(f.out(), "%s", usages) + fmt.Fprint(f.out(), usages) } // defaultIsZeroValue returns true if the default value for this flag represents http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/b153d958/newtmgr/vendor/github.com/spf13/pflag/string_slice.go ---------------------------------------------------------------------- diff --git a/newtmgr/vendor/github.com/spf13/pflag/string_slice.go b/newtmgr/vendor/github.com/spf13/pflag/string_slice.go index 51e3c5d..7829cfa 100644 --- a/newtmgr/vendor/github.com/spf13/pflag/string_slice.go +++ b/newtmgr/vendor/github.com/spf13/pflag/string_slice.go @@ -66,7 +66,7 @@ func (s *stringSliceValue) String() string { } func stringSliceConv(sval string) (interface{}, error) { - sval = strings.Trim(sval, "[]") + sval = sval[1 : len(sval)-1] // An empty string would cause a slice with one (empty) string if len(sval) == 0 { return []string{}, nil http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/b153d958/newtmgr/vendor/github.com/ugorji/go/codec/0doc.go ---------------------------------------------------------------------- diff --git a/newtmgr/vendor/github.com/ugorji/go/codec/0doc.go b/newtmgr/vendor/github.com/ugorji/go/codec/0doc.go index bd7361c..209f9eb 100644 --- a/newtmgr/vendor/github.com/ugorji/go/codec/0doc.go +++ b/newtmgr/vendor/github.com/ugorji/go/codec/0doc.go @@ -68,7 +68,7 @@ Rich Feature Set includes: - Encode/Decode from/to chan types (for iterative streaming support) - Drop-in replacement for encoding/json. `json:` key in struct tag supported. - Provides a RPC Server and Client Codec for net/rpc communication protocol. - - Handle unique idiosynchracies of codecs e.g. + - Handle unique idiosyncrasies of codecs e.g. - For messagepack, configure how ambiguities in handling raw bytes are resolved - For messagepack, provide rpc server/client codec to support msgpack-rpc protocol defined at: @@ -181,7 +181,7 @@ package codec // - Decoding using a chan is good, but incurs concurrency costs. // This is because there's no fast way to use a channel without it // having to switch goroutines constantly. -// Callback pattern is still the best. Maybe cnsider supporting something like: +// Callback pattern is still the best. Maybe consider supporting something like: // type X struct { // Name string // Ys []Y http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/b153d958/newtmgr/vendor/github.com/ugorji/go/codec/README.md ---------------------------------------------------------------------- diff --git a/newtmgr/vendor/github.com/ugorji/go/codec/README.md b/newtmgr/vendor/github.com/ugorji/go/codec/README.md index a790a52..91cb3a2 100644 --- a/newtmgr/vendor/github.com/ugorji/go/codec/README.md +++ b/newtmgr/vendor/github.com/ugorji/go/codec/README.md @@ -68,7 +68,7 @@ Rich Feature Set includes: - Encode/Decode from/to chan types (for iterative streaming support) - Drop-in replacement for encoding/json. `json:` key in struct tag supported. - Provides a RPC Server and Client Codec for net/rpc communication protocol. - - Handle unique idiosynchracies of codecs e.g. + - Handle unique idiosyncrasies of codecs e.g. - For messagepack, configure how ambiguities in handling raw bytes are resolved - For messagepack, provide rpc server/client codec to support msgpack-rpc protocol defined at: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/b153d958/newtmgr/vendor/github.com/ugorji/go/codec/binc.go ---------------------------------------------------------------------- diff --git a/newtmgr/vendor/github.com/ugorji/go/codec/binc.go b/newtmgr/vendor/github.com/ugorji/go/codec/binc.go index 766d26c..33120dc 100644 --- a/newtmgr/vendor/github.com/ugorji/go/codec/binc.go +++ b/newtmgr/vendor/github.com/ugorji/go/codec/binc.go @@ -348,6 +348,13 @@ func (d *bincDecDriver) readNextBd() { d.bdRead = true } +func (d *bincDecDriver) uncacheRead() { + if d.bdRead { + d.r.unreadn1() + d.bdRead = false + } +} + func (d *bincDecDriver) ContainerType() (vt valueType) { if d.vd == bincVdSpecial && d.vs == bincSpNil { return valueTypeNil @@ -705,7 +712,7 @@ func (d *bincDecDriver) decStringAndBytes(bs []byte, withString, zerocopy bool) } func (d *bincDecDriver) DecodeString() (s string) { - // DecodeBytes does not accomodate symbols, whose impl stores string version in map. + // DecodeBytes does not accommodate symbols, whose impl stores string version in map. // Use decStringAndBytes directly. // return string(d.DecodeBytes(d.b[:], true, true)) _, s = d.decStringAndBytes(d.b[:], true, true) http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/b153d958/newtmgr/vendor/github.com/ugorji/go/codec/cbor.go ---------------------------------------------------------------------- diff --git a/newtmgr/vendor/github.com/ugorji/go/codec/cbor.go b/newtmgr/vendor/github.com/ugorji/go/codec/cbor.go index a224cd3..4fa349a 100644 --- a/newtmgr/vendor/github.com/ugorji/go/codec/cbor.go +++ b/newtmgr/vendor/github.com/ugorji/go/codec/cbor.go @@ -188,6 +188,13 @@ func (d *cborDecDriver) readNextBd() { d.bdRead = true } +func (d *cborDecDriver) uncacheRead() { + if d.bdRead { + d.r.unreadn1() + d.bdRead = false + } +} + func (d *cborDecDriver) ContainerType() (vt valueType) { if d.bd == cborBdNil { return valueTypeNil http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/b153d958/newtmgr/vendor/github.com/ugorji/go/codec/decode.go ---------------------------------------------------------------------- diff --git a/newtmgr/vendor/github.com/ugorji/go/codec/decode.go b/newtmgr/vendor/github.com/ugorji/go/codec/decode.go index b87ea63..52c1dfe 100644 --- a/newtmgr/vendor/github.com/ugorji/go/codec/decode.go +++ b/newtmgr/vendor/github.com/ugorji/go/codec/decode.go @@ -91,10 +91,12 @@ type decDriver interface { uncacheRead() } -type decNoSeparator struct{} +type decNoSeparator struct { +} + +func (_ decNoSeparator) ReadEnd() {} -func (_ decNoSeparator) ReadEnd() {} -func (_ decNoSeparator) uncacheRead() {} +// func (_ decNoSeparator) uncacheRead() {} type DecodeOptions struct { // MapType specifies type to use during schema-less decoding of a map in the stream. @@ -161,6 +163,15 @@ type DecodeOptions struct { // Note: Handles will be smart when using the intern functionality. // So everything will not be interned. InternString bool + + // PreferArrayOverSlice controls whether to decode to an array or a slice. + // + // This only impacts decoding into a nil interface{}. + // Consequently, it has no effect on codecgen. + // + // *Note*: This only applies if using go1.5 and above, + // as it requires reflect.ArrayOf support which was absent before go1.5. + PreferArrayOverSlice bool } // ------------------------------------ @@ -433,6 +444,10 @@ func (f *decFnInfo) rawExt(rv reflect.Value) { f.d.d.DecodeExt(rv.Addr().Interface(), 0, nil) } +func (f *decFnInfo) raw(rv reflect.Value) { + rv.SetBytes(f.d.raw()) +} + func (f *decFnInfo) ext(rv reflect.Value) { f.d.d.DecodeExt(rv.Addr().Interface(), f.xfTag, f.xfFn) } @@ -605,8 +620,11 @@ func (f *decFnInfo) kInterfaceNaked() (rvn reflect.Value) { n.ss = append(n.ss, nil) var v2 interface{} = &n.ss[l] d.decode(v2) - rvn = reflect.ValueOf(v2).Elem() n.ss = n.ss[:l] + rvn = reflect.ValueOf(v2).Elem() + if reflectArrayOfSupported && d.stid == 0 && d.h.PreferArrayOverSlice { + rvn = reflectArrayOf(rvn) + } } else { rvn = reflect.New(d.h.SliceType).Elem() d.decodeValue(rvn, nil) @@ -1169,7 +1187,7 @@ type decRtidFn struct { // primitives are being decoded. // // maps and arrays are not handled by this mechanism. -// However, RawExt is, and we accomodate for extensions that decode +// However, RawExt is, and we accommodate for extensions that decode // RawExt from DecodeNaked, but need to decode the value subsequently. // kInterfaceNaked and swallow, which call DecodeNaked, handle this caveat. // @@ -1507,6 +1525,8 @@ func (d *Decoder) decode(iv interface{}) { *v = 0 case *[]uint8: *v = nil + case *Raw: + *v = nil case reflect.Value: if v.Kind() != reflect.Ptr || v.IsNil() { d.errNotValidPtrValue(v) @@ -1576,6 +1596,9 @@ func (d *Decoder) decode(iv interface{}) { case *[]uint8: *v = d.d.DecodeBytes(*v, false, false) + case *Raw: + *v = d.raw() + case *interface{}: d.decodeValueNotNil(reflect.ValueOf(iv).Elem(), nil) @@ -1697,6 +1720,8 @@ func (d *Decoder) getDecFn(rt reflect.Type, checkFastpath, checkCodecSelfer bool fn.f = (*decFnInfo).selferUnmarshal } else if rtid == rawExtTypId { fn.f = (*decFnInfo).rawExt + } else if rtid == rawTypId { + fn.f = (*decFnInfo).raw } else if d.d.IsBuiltinType(rtid) { fn.f = (*decFnInfo).builtin } else if xfFn := d.h.getExt(rtid); xfFn != nil { @@ -1873,6 +1898,15 @@ func (d *Decoder) nextValueBytes() []byte { return d.r.stopTrack() } +func (d *Decoder) raw() []byte { + // ensure that this is not a view into the bytes + // i.e. make new copy always. + bs := d.nextValueBytes() + bs2 := make([]byte, len(bs)) + copy(bs2, bs) + return bs2 +} + // -------------------------------------------------- // decSliceHelper assists when decoding into a slice, from a map or an array in the stream. http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/b153d958/newtmgr/vendor/github.com/ugorji/go/codec/decode_go.go ---------------------------------------------------------------------- diff --git a/newtmgr/vendor/github.com/ugorji/go/codec/decode_go.go b/newtmgr/vendor/github.com/ugorji/go/codec/decode_go.go new file mode 100644 index 0000000..ba289ce --- /dev/null +++ b/newtmgr/vendor/github.com/ugorji/go/codec/decode_go.go @@ -0,0 +1,16 @@ +// Copyright (c) 2012-2015 Ugorji Nwoke. All rights reserved. +// Use of this source code is governed by a MIT license found in the LICENSE file. + +// +build go1.5 + +package codec + +import "reflect" + +const reflectArrayOfSupported = true + +func reflectArrayOf(rvn reflect.Value) (rvn2 reflect.Value) { + rvn2 = reflect.New(reflect.ArrayOf(rvn.Len(), intfTyp)).Elem() + reflect.Copy(rvn2, rvn) + return +} http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/b153d958/newtmgr/vendor/github.com/ugorji/go/codec/decode_go14.go ---------------------------------------------------------------------- diff --git a/newtmgr/vendor/github.com/ugorji/go/codec/decode_go14.go b/newtmgr/vendor/github.com/ugorji/go/codec/decode_go14.go new file mode 100644 index 0000000..50063bc --- /dev/null +++ b/newtmgr/vendor/github.com/ugorji/go/codec/decode_go14.go @@ -0,0 +1,14 @@ +// Copyright (c) 2012-2015 Ugorji Nwoke. All rights reserved. +// Use of this source code is governed by a MIT license found in the LICENSE file. + +// +build !go1.5 + +package codec + +import "reflect" + +const reflectArrayOfSupported = false + +func reflectArrayOf(rvn reflect.Value) (rvn2 reflect.Value) { + panic("reflect.ArrayOf unsupported") +} http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/b153d958/newtmgr/vendor/github.com/ugorji/go/codec/encode.go ---------------------------------------------------------------------- diff --git a/newtmgr/vendor/github.com/ugorji/go/codec/encode.go b/newtmgr/vendor/github.com/ugorji/go/codec/encode.go index a60daa2..28ad347 100644 --- a/newtmgr/vendor/github.com/ugorji/go/codec/encode.go +++ b/newtmgr/vendor/github.com/ugorji/go/codec/encode.go @@ -119,6 +119,19 @@ type EncodeOptions struct { // This is opt-in, as there may be a performance hit to checking circular references. CheckCircularRef bool + // RecursiveEmptyCheck controls whether we descend into interfaces, structs and pointers + // when checking if a value is empty. + // + // Note that this may make OmitEmpty more expensive, as it incurs a lot more reflect calls. + RecursiveEmptyCheck bool + + // Raw controls whether we encode Raw values. + // This is a "dangerous" option and must be explicitly set. + // If set, we blindly encode Raw values as-is, without checking + // if they are a correct representation of a value in that format. + // If unset, we error out. + Raw bool + // AsSymbols defines what should be encoded as symbols. // // Encoding as symbols can reduce the encoded size significantly. @@ -242,8 +255,8 @@ func (z *bytesEncWriter) writen1(b1 byte) { func (z *bytesEncWriter) writen2(b1 byte, b2 byte) { c := z.grow(2) - z.b[c] = b1 z.b[c+1] = b2 + z.b[c] = b1 } func (z *bytesEncWriter) atEndOfEncode() { @@ -282,6 +295,10 @@ func (f *encFnInfo) builtin(rv reflect.Value) { f.e.e.EncodeBuiltin(f.ti.rtid, rv.Interface()) } +func (f *encFnInfo) raw(rv reflect.Value) { + f.e.raw(rv.Interface().(Raw)) +} + func (f *encFnInfo) rawExt(rv reflect.Value) { // rev := rv.Interface().(RawExt) // f.e.e.EncodeRawExt(&rev, f.e) @@ -308,7 +325,7 @@ func (f *encFnInfo) getValueForMarshalInterface(rv reflect.Value, indir int8) (v v = rv.Interface() } else if indir == -1 { // If a non-pointer was passed to Encode(), then that value is not addressable. - // Take addr if addresable, else copy value to an addressable value. + // Take addr if addressable, else copy value to an addressable value. if rv.CanAddr() { v = rv.Addr().Interface() } else { @@ -524,20 +541,20 @@ func (f *encFnInfo) kStruct(rv reflect.Value) { } newlen = 0 var kv stringRv + recur := e.h.RecursiveEmptyCheck for _, si := range tisfi { kv.r = si.field(rv, false) if toMap { - if si.omitEmpty && isEmptyValue(kv.r) { + if si.omitEmpty && isEmptyValue(kv.r, recur, recur) { continue } kv.v = si.encName } else { // use the zero value. // if a reference or struct, set to nil (so you do not output too much) - if si.omitEmpty && isEmptyValue(kv.r) { + if si.omitEmpty && isEmptyValue(kv.r, recur, recur) { switch kv.r.Kind() { - case reflect.Struct, reflect.Interface, reflect.Ptr, reflect.Array, - reflect.Map, reflect.Slice: + case reflect.Struct, reflect.Interface, reflect.Ptr, reflect.Array, reflect.Map, reflect.Slice: kv.r = reflect.Value{} //encode as nil } } @@ -548,7 +565,7 @@ func (f *encFnInfo) kStruct(rv reflect.Value) { // debugf(">>>> kStruct: newlen: %v", newlen) // sep := !e.be - ee := e.e //don't dereference everytime + ee := e.e //don't dereference every time if toMap { ee.EncodeMapStart(newlen) @@ -935,7 +952,7 @@ func newEncoder(h Handle) *Encoder { // Reset the Encoder with a new output stream. // -// This accomodates using the state of the Encoder, +// This accommodates using the state of the Encoder, // where it has "cached" information about sub-engines. func (e *Encoder) Reset(w io.Writer) { ww, ok := w.(ioEncWriterWriter) @@ -1067,7 +1084,8 @@ func (e *Encoder) encode(iv interface{}) { e.e.EncodeNil() case Selfer: v.CodecEncodeSelf(e) - + case Raw: + e.raw(v) case reflect.Value: e.encodeValue(v, nil) @@ -1252,6 +1270,8 @@ func (e *Encoder) getEncFn(rtid uintptr, rt reflect.Type, checkFastpath, checkCo if checkCodecSelfer && ti.cs { fn.f = (*encFnInfo).selferMarshal + } else if rtid == rawTypId { + fn.f = (*encFnInfo).raw } else if rtid == rawExtTypId { fn.f = (*encFnInfo).rawExt } else if e.e.IsBuiltinType(rtid) { @@ -1356,6 +1376,18 @@ func (e *Encoder) asis(v []byte) { } } +func (e *Encoder) raw(vv Raw) { + v := []byte(vv) + if !e.h.Raw { + e.errorf("Raw values cannot be encoded: %v", v) + } + if e.as == nil { + e.w.writeb(v) + } else { + e.as.EncodeAsis(v) + } +} + func (e *Encoder) errorf(format string, params ...interface{}) { err := fmt.Errorf(format, params...) panic(err) http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/b153d958/newtmgr/vendor/github.com/ugorji/go/codec/fast-path.generated.go ---------------------------------------------------------------------- diff --git a/newtmgr/vendor/github.com/ugorji/go/codec/fast-path.generated.go b/newtmgr/vendor/github.com/ugorji/go/codec/fast-path.generated.go index cf6e00d..f2e5d2d 100644 --- a/newtmgr/vendor/github.com/ugorji/go/codec/fast-path.generated.go +++ b/newtmgr/vendor/github.com/ugorji/go/codec/fast-path.generated.go @@ -23,7 +23,7 @@ package codec // Currently support // - slice of all builtin types, // - map of all builtin types to string or interface value -// - symetrical maps of all builtin types (e.g. str-str, uint8-uint8) +// - symmetrical maps of all builtin types (e.g. str-str, uint8-uint8) // This should provide adequate "typical" implementations. // // Note that fast track decode functions must handle values for which an address cannot be obtained. @@ -38,6 +38,8 @@ import ( "sort" ) +const fastpathEnabled = true + const fastpathCheckNilFalse = false // for reflect const fastpathCheckNilTrue = true // for type switch @@ -81,9 +83,6 @@ var fastpathAV fastpathA // due to possible initialization loop error, make fastpath in an init() func init() { - if !fastpathEnabled { - return - } i := 0 fn := func(v interface{}, fe func(*encFnInfo, reflect.Value), fd func(*decFnInfo, reflect.Value)) (f fastpathE) { xrt := reflect.TypeOf(v) @@ -373,9 +372,6 @@ func init() { // -- -- fast path type switch func fastpathEncodeTypeSwitch(iv interface{}, e *Encoder) bool { - if !fastpathEnabled { - return false - } switch v := iv.(type) { case []interface{}: @@ -1741,9 +1737,6 @@ func fastpathEncodeTypeSwitch(iv interface{}, e *Encoder) bool { } func fastpathEncodeTypeSwitchSlice(iv interface{}, e *Encoder) bool { - if !fastpathEnabled { - return false - } switch v := iv.(type) { case []interface{}: @@ -1829,9 +1822,6 @@ func fastpathEncodeTypeSwitchSlice(iv interface{}, e *Encoder) bool { } func fastpathEncodeTypeSwitchMap(iv interface{}, e *Encoder) bool { - if !fastpathEnabled { - return false - } switch v := iv.(type) { case map[interface{}]interface{}: @@ -15954,9 +15944,6 @@ func (_ fastpathT) EncMapBoolBoolV(v map[bool]bool, checkNil bool, e *Encoder) { // -- -- fast path type switch func fastpathDecodeTypeSwitch(iv interface{}, d *Decoder) bool { - if !fastpathEnabled { - return false - } switch v := iv.(type) { case []interface{}: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/b153d958/newtmgr/vendor/github.com/ugorji/go/codec/fast-path.go.tmpl ---------------------------------------------------------------------- diff --git a/newtmgr/vendor/github.com/ugorji/go/codec/fast-path.go.tmpl b/newtmgr/vendor/github.com/ugorji/go/codec/fast-path.go.tmpl index 04c173f..c3ffdf9 100644 --- a/newtmgr/vendor/github.com/ugorji/go/codec/fast-path.go.tmpl +++ b/newtmgr/vendor/github.com/ugorji/go/codec/fast-path.go.tmpl @@ -23,7 +23,7 @@ package codec // Currently support // - slice of all builtin types, // - map of all builtin types to string or interface value -// - symetrical maps of all builtin types (e.g. str-str, uint8-uint8) +// - symmetrical maps of all builtin types (e.g. str-str, uint8-uint8) // This should provide adequate "typical" implementations. // // Note that fast track decode functions must handle values for which an address cannot be obtained. @@ -38,6 +38,8 @@ import ( "sort" ) +const fastpathEnabled = true + const fastpathCheckNilFalse = false // for reflect const fastpathCheckNilTrue = true // for type switch @@ -81,9 +83,6 @@ var fastpathAV fastpathA // due to possible initialization loop error, make fastpath in an init() func init() { - if !fastpathEnabled { - return - } i := 0 fn := func(v interface{}, fe func(*encFnInfo, reflect.Value), fd func(*decFnInfo, reflect.Value)) (f fastpathE) { xrt := reflect.TypeOf(v) @@ -106,9 +105,6 @@ func init() { // -- -- fast path type switch func fastpathEncodeTypeSwitch(iv interface{}, e *Encoder) bool { - if !fastpathEnabled { - return false - } switch v := iv.(type) { {{range .Values}}{{if not .Primitive}}{{if not .MapKey }} case []{{ .Elem }}:{{else}} @@ -126,9 +122,6 @@ func fastpathEncodeTypeSwitch(iv interface{}, e *Encoder) bool { } func fastpathEncodeTypeSwitchSlice(iv interface{}, e *Encoder) bool { - if !fastpathEnabled { - return false - } switch v := iv.(type) { {{range .Values}}{{if not .Primitive}}{{if not .MapKey }} case []{{ .Elem }}: @@ -144,9 +137,6 @@ func fastpathEncodeTypeSwitchSlice(iv interface{}, e *Encoder) bool { } func fastpathEncodeTypeSwitchMap(iv interface{}, e *Encoder) bool { - if !fastpathEnabled { - return false - } switch v := iv.(type) { {{range .Values}}{{if not .Primitive}}{{if .MapKey }} case map[{{ .MapKey }}]{{ .Elem }}: @@ -286,9 +276,6 @@ func (_ fastpathT) {{ .MethodNamePfx "Enc" false }}V(v map[{{ .MapKey }}]{{ .Ele // -- -- fast path type switch func fastpathDecodeTypeSwitch(iv interface{}, d *Decoder) bool { - if !fastpathEnabled { - return false - } switch v := iv.(type) { {{range .Values}}{{if not .Primitive}}{{if not .MapKey }} case []{{ .Elem }}:{{else}} http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/b153d958/newtmgr/vendor/github.com/ugorji/go/codec/fast-path.not.go ---------------------------------------------------------------------- diff --git a/newtmgr/vendor/github.com/ugorji/go/codec/fast-path.not.go b/newtmgr/vendor/github.com/ugorji/go/codec/fast-path.not.go index d6f5f0c..63e5911 100644 --- a/newtmgr/vendor/github.com/ugorji/go/codec/fast-path.not.go +++ b/newtmgr/vendor/github.com/ugorji/go/codec/fast-path.not.go @@ -4,6 +4,8 @@ package codec import "reflect" +const fastpathEnabled = false + // The generated fast-path code is very large, and adds a few seconds to the build time. // This causes test execution, execution of small tools which use codec, etc // to take a long time. http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/b153d958/newtmgr/vendor/github.com/ugorji/go/codec/gen-helper.generated.go ---------------------------------------------------------------------- diff --git a/newtmgr/vendor/github.com/ugorji/go/codec/gen-helper.generated.go b/newtmgr/vendor/github.com/ugorji/go/codec/gen-helper.generated.go index 22bce77..96a6b61 100644 --- a/newtmgr/vendor/github.com/ugorji/go/codec/gen-helper.generated.go +++ b/newtmgr/vendor/github.com/ugorji/go/codec/gen-helper.generated.go @@ -1,4 +1,4 @@ -// //+build ignore +// // +build ignore // Copyright (c) 2012-2015 Ugorji Nwoke. All rights reserved. // Use of this source code is governed by a MIT license found in the LICENSE file. @@ -17,7 +17,7 @@ import ( // This file is used to generate helper code for codecgen. // The values here i.e. genHelper(En|De)coder are not to be used directly by -// library users. They WILL change continously and without notice. +// library users. They WILL change continuously and without notice. // // To help enforce this, we create an unexported type with exported members. // The only way to get the type is via the one exported type that we control (somewhat). @@ -84,6 +84,11 @@ func (f genHelperEncoder) EncBinaryMarshal(iv encoding.BinaryMarshaler) { } // FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* +func (f genHelperEncoder) EncRaw(iv Raw) { + f.e.raw(iv) +} + +// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* func (f genHelperEncoder) TimeRtidIfBinc() uintptr { if _, ok := f.e.hh.(*BincHandle); ok { return timeTypId @@ -192,6 +197,11 @@ func (f genHelperDecoder) DecBinaryUnmarshal(bm encoding.BinaryUnmarshaler) { } // FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* +func (f genHelperDecoder) DecRaw() []byte { + return f.d.raw() +} + +// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* func (f genHelperDecoder) TimeRtidIfBinc() uintptr { if _, ok := f.d.hh.(*BincHandle); ok { return timeTypId http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/b153d958/newtmgr/vendor/github.com/ugorji/go/codec/gen-helper.go.tmpl ---------------------------------------------------------------------- diff --git a/newtmgr/vendor/github.com/ugorji/go/codec/gen-helper.go.tmpl b/newtmgr/vendor/github.com/ugorji/go/codec/gen-helper.go.tmpl index 3195857..9b276d4 100644 --- a/newtmgr/vendor/github.com/ugorji/go/codec/gen-helper.go.tmpl +++ b/newtmgr/vendor/github.com/ugorji/go/codec/gen-helper.go.tmpl @@ -1,4 +1,4 @@ -// //+build ignore +// // +build ignore // Copyright (c) 2012-2015 Ugorji Nwoke. All rights reserved. // Use of this source code is governed by a MIT license found in the LICENSE file. @@ -17,7 +17,7 @@ import ( // This file is used to generate helper code for codecgen. // The values here i.e. genHelper(En|De)coder are not to be used directly by -// library users. They WILL change continously and without notice. +// library users. They WILL change continuously and without notice. // // To help enforce this, we create an unexported type with exported members. // The only way to get the type is via the one exported type that we control (somewhat). @@ -79,6 +79,10 @@ func (f genHelperEncoder) EncBinaryMarshal(iv encoding.BinaryMarshaler) { f.e.marshal(bs, fnerr, false, c_RAW) } // FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* +func (f genHelperEncoder) EncRaw(iv Raw) { + f.e.raw(iv) +} +// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* func (f genHelperEncoder) TimeRtidIfBinc() uintptr { if _, ok := f.e.hh.(*BincHandle); ok { return timeTypId @@ -172,6 +176,10 @@ func (f genHelperDecoder) DecBinaryUnmarshal(bm encoding.BinaryUnmarshaler) { } } // FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* +func (f genHelperDecoder) DecRaw() []byte { + return f.d.raw() +} +// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* func (f genHelperDecoder) TimeRtidIfBinc() uintptr { if _, ok := f.d.hh.(*BincHandle); ok { return timeTypId http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/b153d958/newtmgr/vendor/github.com/ugorji/go/codec/gen.go ---------------------------------------------------------------------- diff --git a/newtmgr/vendor/github.com/ugorji/go/codec/gen.go b/newtmgr/vendor/github.com/ugorji/go/codec/gen.go index 8544f04..1a27675 100644 --- a/newtmgr/vendor/github.com/ugorji/go/codec/gen.go +++ b/newtmgr/vendor/github.com/ugorji/go/codec/gen.go @@ -12,7 +12,6 @@ import ( "io" "io/ioutil" "math/rand" - "os" "reflect" "regexp" "sort" @@ -28,6 +27,7 @@ import ( // --------------------------------------------------- // codecgen supports the full cycle of reflection-based codec: // - RawExt +// - Raw // - Builtins // - Extensions // - (Binary|Text|JSON)(Unm|M)arshal @@ -78,7 +78,7 @@ import ( // codecgen will panic if the file was generated with an old version of the library in use. // // Note: -// It was a concious decision to have gen.go always explicitly call EncodeNil or TryDecodeAsNil. +// It was a conscious decision to have gen.go always explicitly call EncodeNil or TryDecodeAsNil. // This way, there isn't a function call overhead just to see that we should not enter a block of code. // GenVersion is the current version of codecgen. @@ -126,6 +126,7 @@ var ( genExpectArrayOrMapErr = errors.New("unexpected type. Expecting array/map/slice") genBase64enc = base64.NewEncoding("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789__") genQNameRegex = regexp.MustCompile(`[A-Za-z_.]+`) + genCheckVendor bool ) // genRunner holds some state used during a Gen run. @@ -211,7 +212,7 @@ func Gen(w io.Writer, buildTags, pkgName, uid string, useUnsafe bool, ti *TypeIn x.genRefPkgs(t) } if buildTags != "" { - x.line("//+build " + buildTags) + x.line("// +build " + buildTags) x.line("") } x.line(` @@ -701,13 +702,17 @@ func (x *genRunner) enc(varname string, t reflect.Type) { } // check if - // - type is RawExt + // - type is RawExt, Raw // - the type implements (Text|JSON|Binary)(Unm|M)arshal x.linef("%sm%s := z.EncBinary()", genTempVarPfx, mi) x.linef("_ = %sm%s", genTempVarPfx, mi) x.line("if false {") //start if block defer func() { x.line("}") }() //end if block + if t == rawTyp { + x.linef("} else { z.EncRaw(%v)", varname) + return + } if t == rawExtTyp { x.linef("} else { r.EncodeRawExt(%v, e)", varname) return @@ -987,6 +992,14 @@ func (x *genRunner) encStruct(varname string, rtid uintptr, t reflect.Type) { } func (x *genRunner) encListFallback(varname string, t reflect.Type) { + if t.AssignableTo(uint8SliceTyp) { + x.linef("r.EncodeStringBytes(codecSelferC_RAW%s, []byte(%s))", x.xs, varname) + return + } + if t.Kind() == reflect.Array && t.Elem().Kind() == reflect.Uint8 { + x.linef("r.EncodeStringBytes(codecSelferC_RAW%s, ([%v]byte(%s))[:])", x.xs, t.Len(), varname) + return + } i := x.varsfx() g := genTempVarPfx x.line("r.EncodeArrayStart(len(" + varname + "))") @@ -1123,7 +1136,7 @@ func (x *genRunner) dec(varname string, t reflect.Type) { } // check if - // - type is RawExt + // - type is Raw, RawExt // - the type implements (Text|JSON|Binary)(Unm|M)arshal mi := x.varsfx() x.linef("%sm%s := z.DecBinary()", genTempVarPfx, mi) @@ -1131,6 +1144,10 @@ func (x *genRunner) dec(varname string, t reflect.Type) { x.line("if false {") //start if block defer func() { x.line("}") }() //end if block + if t == rawTyp { + x.linef("} else { *%v = z.DecRaw()", varname) + return + } if t == rawExtTyp { x.linef("} else { r.DecodeExt(%v, 0, nil)", varname) return @@ -1306,6 +1323,14 @@ func (x *genRunner) decTryAssignPrimitive(varname string, t reflect.Type) (tryAs } func (x *genRunner) decListFallback(varname string, rtid uintptr, t reflect.Type) { + if t.AssignableTo(uint8SliceTyp) { + x.line("*" + varname + " = r.DecodeBytes(*((*[]byte)(" + varname + ")), false, false)") + return + } + if t.Kind() == reflect.Array && t.Elem().Kind() == reflect.Uint8 { + x.linef("r.DecodeBytes( ((*[%s]byte)(%s))[:], false, true)", t.Len(), varname) + return + } type tstruc struct { TempVar string Rand string @@ -1421,7 +1446,7 @@ func (x *genRunner) decStructMapSwitch(kName string, varname string, rtid uintpt if si.i != -1 { t2 = t.Field(int(si.i)) } else { - //we must accomodate anonymous fields, where the embedded field is a nil pointer in the value. + //we must accommodate anonymous fields, where the embedded field is a nil pointer in the value. // t2 = t.FieldByIndex(si.is) t2typ := t varname3 := varname @@ -1509,7 +1534,7 @@ func (x *genRunner) decStructArray(varname, lenvarname, breakString string, rtid if si.i != -1 { t2 = t.Field(int(si.i)) } else { - //we must accomodate anonymous fields, where the embedded field is a nil pointer in the value. + //we must accommodate anonymous fields, where the embedded field is a nil pointer in the value. // t2 = t.FieldByIndex(si.is) t2typ := t varname3 := varname @@ -1626,8 +1651,6 @@ func (x *genV) MethodNamePfx(prefix string, prim bool) string { } -var genCheckVendor = os.Getenv("GO15VENDOREXPERIMENT") == "1" - // genImportPath returns import path of a non-predeclared named typed, or an empty string otherwise. // // This handles the misbehaviour that occurs when 1.5-style vendoring is enabled, @@ -1678,7 +1701,7 @@ func genNonPtr(t reflect.Type) reflect.Type { func genTitleCaseName(s string) string { switch s { - case "interface{}": + case "interface{}", "interface {}": return "Intf" default: return strings.ToUpper(s[0:1]) + s[1:] @@ -1781,7 +1804,7 @@ func (x genInternal) FastpathLen() (l int) { func genInternalZeroValue(s string) string { switch s { - case "interface{}": + case "interface{}", "interface {}": return "nil" case "bool": return "false" @@ -1933,7 +1956,7 @@ func genInternalInit() { } var gt genInternal - // For each slice or map type, there must be a (symetrical) Encode and Decode fast-path function + // For each slice or map type, there must be a (symmetrical) Encode and Decode fast-path function for _, s := range types { gt.Values = append(gt.Values, genV{Primitive: s, Size: mapvaltypes2[s]}) if s != "uint8" { // do not generate fast path for slice of bytes. Treat specially already. http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/b153d958/newtmgr/vendor/github.com/ugorji/go/codec/gen_15.go ---------------------------------------------------------------------- diff --git a/newtmgr/vendor/github.com/ugorji/go/codec/gen_15.go b/newtmgr/vendor/github.com/ugorji/go/codec/gen_15.go new file mode 100644 index 0000000..ab76c31 --- /dev/null +++ b/newtmgr/vendor/github.com/ugorji/go/codec/gen_15.go @@ -0,0 +1,12 @@ +// Copyright (c) 2012-2015 Ugorji Nwoke. All rights reserved. +// Use of this source code is governed by a MIT license found in the LICENSE file. + +// +build go1.5,!go1.6 + +package codec + +import "os" + +func init() { + genCheckVendor = os.Getenv("GO15VENDOREXPERIMENT") == "1" +} http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/b153d958/newtmgr/vendor/github.com/ugorji/go/codec/gen_16.go ---------------------------------------------------------------------- diff --git a/newtmgr/vendor/github.com/ugorji/go/codec/gen_16.go b/newtmgr/vendor/github.com/ugorji/go/codec/gen_16.go new file mode 100644 index 0000000..87c04e2 --- /dev/null +++ b/newtmgr/vendor/github.com/ugorji/go/codec/gen_16.go @@ -0,0 +1,12 @@ +// Copyright (c) 2012-2015 Ugorji Nwoke. All rights reserved. +// Use of this source code is governed by a MIT license found in the LICENSE file. + +// +build go1.6 + +package codec + +import "os" + +func init() { + genCheckVendor = os.Getenv("GO15VENDOREXPERIMENT") != "0" +} http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/b153d958/newtmgr/vendor/github.com/ugorji/go/codec/gen_17.go ---------------------------------------------------------------------- diff --git a/newtmgr/vendor/github.com/ugorji/go/codec/gen_17.go b/newtmgr/vendor/github.com/ugorji/go/codec/gen_17.go new file mode 100644 index 0000000..3881a43 --- /dev/null +++ b/newtmgr/vendor/github.com/ugorji/go/codec/gen_17.go @@ -0,0 +1,10 @@ +// Copyright (c) 2012-2015 Ugorji Nwoke. All rights reserved. +// Use of this source code is governed by a MIT license found in the LICENSE file. + +// +build go1.7 + +package codec + +func init() { + genCheckVendor = true +} http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/b153d958/newtmgr/vendor/github.com/ugorji/go/codec/helper.go ---------------------------------------------------------------------- diff --git a/newtmgr/vendor/github.com/ugorji/go/codec/helper.go b/newtmgr/vendor/github.com/ugorji/go/codec/helper.go index f3d2600..bf954ab 100644 --- a/newtmgr/vendor/github.com/ugorji/go/codec/helper.go +++ b/newtmgr/vendor/github.com/ugorji/go/codec/helper.go @@ -137,17 +137,6 @@ const ( // Note that this will always cause rpc tests to fail, since they need io.EOF sent via panic. recoverPanicToErr = true - // Fast path functions try to create a fast path encode or decode implementation - // for common maps and slices, by by-passing reflection altogether. - fastpathEnabled = true - - // if checkStructForEmptyValue, check structs fields to see if an empty value. - // This could be an expensive call, so possibly disable it. - checkStructForEmptyValue = false - - // if derefForIsEmptyValue, deref pointers and interfaces when checking isEmptyValue - derefForIsEmptyValue = false - // if resetSliceElemToZeroValue, then on decoding a slice, reset the element to a zero value first. // Only concern is that, if the slice already contained some garbage, we will decode into that garbage. // The chances of this are slim, so leave this "optimization". @@ -217,16 +206,21 @@ const ( containerArrayEnd ) -type rgetPoolT struct { - encNames [8]string - fNames [8]string - etypes [8]uintptr - sfis [8]*structFieldInfo +// sfiIdx used for tracking where a (field/enc)Name is seen in a []*structFieldInfo +type sfiIdx struct { + name string + index int } -var rgetPool = sync.Pool{ - New: func() interface{} { return new(rgetPoolT) }, -} +// do not recurse if a containing type refers to an embedded type +// which refers back to its containing type (via a pointer). +// The second time this back-reference happens, break out, +// so as not to cause an infinite loop. +const rgetMaxRecursion = 2 + +// Anecdotally, we believe most types have <= 12 fields. +// Java's PMD rules set TooManyFields threshold to 15. +const rgetPoolTArrayLen = 12 type rgetT struct { fNames []string @@ -235,6 +229,18 @@ type rgetT struct { sfis []*structFieldInfo } +type rgetPoolT struct { + fNames [rgetPoolTArrayLen]string + encNames [rgetPoolTArrayLen]string + etypes [rgetPoolTArrayLen]uintptr + sfis [rgetPoolTArrayLen]*structFieldInfo + sfiidx [rgetPoolTArrayLen]sfiIdx +} + +var rgetPool = sync.Pool{ + New: func() interface{} { return new(rgetPoolT) }, +} + type containerStateRecv interface { sendContainerState(containerState) } @@ -260,6 +266,7 @@ var ( stringTyp = reflect.TypeOf("") timeTyp = reflect.TypeOf(time.Time{}) rawExtTyp = reflect.TypeOf(RawExt{}) + rawTyp = reflect.TypeOf(Raw{}) uint8SliceTyp = reflect.TypeOf([]uint8(nil)) mapBySliceTyp = reflect.TypeOf((*MapBySlice)(nil)).Elem() @@ -277,6 +284,7 @@ var ( uint8SliceTypId = reflect.ValueOf(uint8SliceTyp).Pointer() rawExtTypId = reflect.ValueOf(rawExtTyp).Pointer() + rawTypId = reflect.ValueOf(rawTyp).Pointer() intfTypId = reflect.ValueOf(intfTyp).Pointer() timeTypId = reflect.ValueOf(timeTyp).Pointer() stringTypId = reflect.ValueOf(stringTyp).Pointer() @@ -357,6 +365,11 @@ type Handle interface { isBinary() bool } +// Raw represents raw formatted bytes. +// We "blindly" store it during encode and store the raw bytes during decode. +// Note: it is dangerous during encode, so we may gate the behaviour behind an Encode flag which must be explicitly set. +type Raw []byte + // RawExt represents raw unprocessed extension data. // Some codecs will decode extension data as a *RawExt if there is no registered extension for the tag. // @@ -367,7 +380,7 @@ type RawExt struct { // Data is used by codecs (e.g. binc, msgpack, simple) which do custom serialization of the types Data []byte // Value represents the extension, if Data is nil. - // Value is used by codecs (e.g. cbor) which use the format to do custom serialization of the types. + // Value is used by codecs (e.g. cbor, json) which use the format to do custom serialization of the types. Value interface{} } @@ -545,7 +558,7 @@ func (o *extHandle) AddExt( func (o *extHandle) SetExt(rt reflect.Type, tag uint64, ext Ext) (err error) { // o is a pointer, because we may need to initialize it if rt.PkgPath() == "" || rt.Kind() == reflect.Interface { - err = fmt.Errorf("codec.Handle.AddExt: Takes named type, especially not a pointer or interface: %T", + err = fmt.Errorf("codec.Handle.AddExt: Takes named type, not a pointer or interface: %T", reflect.Zero(rt).Interface()) return } @@ -588,7 +601,8 @@ func (o extHandle) getExtForTag(tag uint64) *extTypeTagFn { } type structFieldInfo struct { - encName string // encode name + encName string // encode name + fieldName string // field name // only one of 'i' or 'is' can be set. If 'i' is -1, then 'is' has been set. @@ -849,21 +863,18 @@ func (x *TypeInfos) get(rtid uintptr, rt reflect.Type) (pti *typeInfo) { } if rt.Kind() == reflect.Struct { - var siInfo *structFieldInfo + var omitEmpty bool if f, ok := rt.FieldByName(structInfoFieldName); ok { - siInfo = parseStructFieldInfo(structInfoFieldName, x.structTag(f.Tag)) + siInfo := parseStructFieldInfo(structInfoFieldName, x.structTag(f.Tag)) ti.toArray = siInfo.toArray + omitEmpty = siInfo.omitEmpty } pi := rgetPool.Get() pv := pi.(*rgetPoolT) pv.etypes[0] = ti.baseId vv := rgetT{pv.fNames[:0], pv.encNames[:0], pv.etypes[:1], pv.sfis[:0]} - x.rget(rt, rtid, nil, &vv, siInfo) - ti.sfip = make([]*structFieldInfo, len(vv.sfis)) - ti.sfi = make([]*structFieldInfo, len(vv.sfis)) - copy(ti.sfip, vv.sfis) - sort.Sort(sfiSortedByEncName(vv.sfis)) - copy(ti.sfi, vv.sfis) + x.rget(rt, rtid, omitEmpty, nil, &vv) + ti.sfip, ti.sfi = rgetResolveSFI(vv.sfis, pv.sfiidx[:0]) rgetPool.Put(pi) } // sfi = sfip @@ -877,26 +888,17 @@ func (x *TypeInfos) get(rtid uintptr, rt reflect.Type) (pti *typeInfo) { return } -func (x *TypeInfos) rget(rt reflect.Type, rtid uintptr, - indexstack []int, pv *rgetT, siInfo *structFieldInfo, +func (x *TypeInfos) rget(rt reflect.Type, rtid uintptr, omitEmpty bool, + indexstack []int, pv *rgetT, ) { - // This will read up the fields and store how to access the value. - // It uses the go language's rules for embedding, as below: - // - if a field has been seen while traversing, skip it - // - if an encName has been seen while traversing, skip it - // - if an embedded type has been seen, skip it + // Read up fields and store how to access the value. // - // Also, per Go's rules, embedded fields must be analyzed AFTER all top-level fields. + // It uses go's rules for message selectors, + // which say that the field with the shallowest depth is selected. // // Note: we consciously use slices, not a map, to simulate a set. - // Typically, types have < 16 fields, and iteration using equals is faster than maps there - - type anonField struct { - ft reflect.Type - idx int - } - - var anonFields []anonField + // Typically, types have < 16 fields, + // and iteration using equals is faster than maps there LOOP: for j, jlen := 0, rt.NumField(); j < jlen; j++ { @@ -908,7 +910,8 @@ LOOP: continue LOOP } - // if r1, _ := utf8.DecodeRuneInString(f.Name); r1 == utf8.RuneError || !unicode.IsUpper(r1) { + // if r1, _ := utf8.DecodeRuneInString(f.Name); + // r1 == utf8.RuneError || !unicode.IsUpper(r1) { if f.PkgPath != "" && !f.Anonymous { // unexported, not embedded continue } @@ -917,7 +920,8 @@ LOOP: continue } var si *structFieldInfo - // if anonymous and no struct tag (or it's blank), and a struct (or pointer to struct), inline it. + // if anonymous and no struct tag (or it's blank), + // and a struct (or pointer to struct), inline it. if f.Anonymous && fkind != reflect.Interface { doInline := stag == "" if !doInline { @@ -931,8 +935,31 @@ LOOP: ft = ft.Elem() } if ft.Kind() == reflect.Struct { - // handle anonymous fields after handling all the non-anon fields - anonFields = append(anonFields, anonField{ft, j}) + // if etypes contains this, don't call rget again (as fields are already seen here) + ftid := reflect.ValueOf(ft).Pointer() + // We cannot recurse forever, but we need to track other field depths. + // So - we break if we see a type twice (not the first time). + // This should be sufficient to handle an embedded type that refers to its + // owning type, which then refers to its embedded type. + processIt := true + numk := 0 + for _, k := range pv.etypes { + if k == ftid { + numk++ + if numk == rgetMaxRecursion { + processIt = false + break + } + } + } + if processIt { + pv.etypes = append(pv.etypes, ftid) + indexstack2 := make([]int, len(indexstack)+1) + copy(indexstack2, indexstack) + indexstack2[len(indexstack)] = j + // indexstack2 := append(append(make([]int, 0, len(indexstack)+4), indexstack...), j) + x.rget(ft, ftid, omitEmpty, indexstack2, pv) + } continue } } @@ -947,11 +974,6 @@ LOOP: panic(noFieldNameToStructFieldInfoErr) } - for _, k := range pv.fNames { - if k == f.Name { - continue LOOP - } - } pv.fNames = append(pv.fNames, f.Name) if si == nil { @@ -959,12 +981,8 @@ LOOP: } else if si.encName == "" { si.encName = f.Name } + si.fieldName = f.Name - for _, k := range pv.encNames { - if k == si.encName { - continue LOOP - } - } pv.encNames = append(pv.encNames, si.encName) // si.ikind = int(f.Type.Kind()) @@ -978,32 +996,60 @@ LOOP: // si.is = append(append(make([]int, 0, len(indexstack)+4), indexstack...), j) } - if siInfo != nil { - if siInfo.omitEmpty { - si.omitEmpty = true - } + if omitEmpty { + si.omitEmpty = true } pv.sfis = append(pv.sfis, si) } +} - // now handle anonymous fields -LOOP2: - for _, af := range anonFields { - // if etypes contains this, then do not call rget again (as the fields are already seen here) - ftid := reflect.ValueOf(af.ft).Pointer() - for _, k := range pv.etypes { - if k == ftid { - continue LOOP2 +// resolves the struct field info got from a call to rget. +// Returns a trimmed, unsorted and sorted []*structFieldInfo. +func rgetResolveSFI(x []*structFieldInfo, pv []sfiIdx) (y, z []*structFieldInfo) { + var n int + for i, v := range x { + xn := v.encName //TODO: fieldName or encName? use encName for now. + var found bool + for j, k := range pv { + if k.name == xn { + // one of them must be reset to nil, and the index updated appropriately to the other one + if len(v.is) == len(x[k.index].is) { + } else if len(v.is) < len(x[k.index].is) { + pv[j].index = i + if x[k.index] != nil { + x[k.index] = nil + n++ + } + } else { + if x[i] != nil { + x[i] = nil + n++ + } + } + found = true + break } } - pv.etypes = append(pv.etypes, ftid) + if !found { + pv = append(pv, sfiIdx{xn, i}) + } + } - indexstack2 := make([]int, len(indexstack)+1) - copy(indexstack2, indexstack) - indexstack2[len(indexstack)] = af.idx - // indexstack2 := append(append(make([]int, 0, len(indexstack)+4), indexstack...), j) - x.rget(af.ft, ftid, indexstack2, pv, siInfo) + // remove all the nils + y = make([]*structFieldInfo, len(x)-n) + n = 0 + for _, v := range x { + if v == nil { + continue + } + y[n] = v + n++ } + + z = make([]*structFieldInfo, len(y)) + copy(z, y) + sort.Sort(sfiSortedByEncName(z)) + return } func panicToErr(err *error) { http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/b153d958/newtmgr/vendor/github.com/ugorji/go/codec/helper_internal.go ---------------------------------------------------------------------- diff --git a/newtmgr/vendor/github.com/ugorji/go/codec/helper_internal.go b/newtmgr/vendor/github.com/ugorji/go/codec/helper_internal.go index dea981f..5d0727f 100644 --- a/newtmgr/vendor/github.com/ugorji/go/codec/helper_internal.go +++ b/newtmgr/vendor/github.com/ugorji/go/codec/helper_internal.go @@ -70,8 +70,8 @@ func hIsEmptyValue(v reflect.Value, deref, checkStruct bool) bool { return false } -func isEmptyValue(v reflect.Value) bool { - return hIsEmptyValue(v, derefForIsEmptyValue, checkStructForEmptyValue) +func isEmptyValue(v reflect.Value, deref, checkStruct bool) bool { + return hIsEmptyValue(v, deref, checkStruct) } func pruneSignExt(v []byte, pos bool) (n int) { http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/b153d958/newtmgr/vendor/github.com/ugorji/go/codec/helper_not_unsafe.go ---------------------------------------------------------------------- diff --git a/newtmgr/vendor/github.com/ugorji/go/codec/helper_not_unsafe.go b/newtmgr/vendor/github.com/ugorji/go/codec/helper_not_unsafe.go index 7c2ffc0..8b06a00 100644 --- a/newtmgr/vendor/github.com/ugorji/go/codec/helper_not_unsafe.go +++ b/newtmgr/vendor/github.com/ugorji/go/codec/helper_not_unsafe.go @@ -1,4 +1,4 @@ -//+build !unsafe +// +build !unsafe // Copyright (c) 2012-2015 Ugorji Nwoke. All rights reserved. // Use of this source code is governed by a MIT license found in the LICENSE file. http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/b153d958/newtmgr/vendor/github.com/ugorji/go/codec/helper_unsafe.go ---------------------------------------------------------------------- diff --git a/newtmgr/vendor/github.com/ugorji/go/codec/helper_unsafe.go b/newtmgr/vendor/github.com/ugorji/go/codec/helper_unsafe.go index 2928e4f..0f596c7 100644 --- a/newtmgr/vendor/github.com/ugorji/go/codec/helper_unsafe.go +++ b/newtmgr/vendor/github.com/ugorji/go/codec/helper_unsafe.go @@ -1,4 +1,4 @@ -//+build unsafe +// +build unsafe // Copyright (c) 2012-2015 Ugorji Nwoke. All rights reserved. // Use of this source code is governed by a MIT license found in the LICENSE file. http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/b153d958/newtmgr/vendor/github.com/ugorji/go/codec/json.go ---------------------------------------------------------------------- diff --git a/newtmgr/vendor/github.com/ugorji/go/codec/json.go b/newtmgr/vendor/github.com/ugorji/go/codec/json.go index a04dfcb..13af12b 100644 --- a/newtmgr/vendor/github.com/ugorji/go/codec/json.go +++ b/newtmgr/vendor/github.com/ugorji/go/codec/json.go @@ -197,12 +197,20 @@ func (e *jsonEncDriver) EncodeBool(b bool) { } func (e *jsonEncDriver) EncodeFloat32(f float32) { - e.w.writeb(strconv.AppendFloat(e.b[:0], float64(f), 'E', -1, 32)) + e.encodeFloat(float64(f), 32) } func (e *jsonEncDriver) EncodeFloat64(f float64) { // e.w.writestr(strconv.FormatFloat(f, 'E', -1, 64)) - e.w.writeb(strconv.AppendFloat(e.b[:0], f, 'E', -1, 64)) + e.encodeFloat(f, 64) +} + +func (e *jsonEncDriver) encodeFloat(f float64, numbits int) { + x := strconv.AppendFloat(e.b[:0], f, 'G', -1, numbits) + e.w.writeb(x) + if bytes.IndexByte(x, 'E') == -1 && bytes.IndexByte(x, '.') == -1 { + e.w.writen2('.', '0') + } } func (e *jsonEncDriver) EncodeInt(v int64) { http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/b153d958/newtmgr/vendor/github.com/ugorji/go/codec/msgpack.go ---------------------------------------------------------------------- diff --git a/newtmgr/vendor/github.com/ugorji/go/codec/msgpack.go b/newtmgr/vendor/github.com/ugorji/go/codec/msgpack.go index f9f8723..e79830b 100644 --- a/newtmgr/vendor/github.com/ugorji/go/codec/msgpack.go +++ b/newtmgr/vendor/github.com/ugorji/go/codec/msgpack.go @@ -561,6 +561,13 @@ func (d *msgpackDecDriver) readNextBd() { d.bdRead = true } +func (d *msgpackDecDriver) uncacheRead() { + if d.bdRead { + d.r.unreadn1() + d.bdRead = false + } +} + func (d *msgpackDecDriver) ContainerType() (vt valueType) { bd := d.bd if bd == mpNil { http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/b153d958/newtmgr/vendor/github.com/ugorji/go/codec/rpc.go ---------------------------------------------------------------------- diff --git a/newtmgr/vendor/github.com/ugorji/go/codec/rpc.go b/newtmgr/vendor/github.com/ugorji/go/codec/rpc.go index dad53d0..8062bed 100644 --- a/newtmgr/vendor/github.com/ugorji/go/codec/rpc.go +++ b/newtmgr/vendor/github.com/ugorji/go/codec/rpc.go @@ -25,7 +25,7 @@ type Rpc interface { } // RpcCodecBuffered allows access to the underlying bufio.Reader/Writer -// used by the rpc connection. It accomodates use-cases where the connection +// used by the rpc connection. It accommodates use-cases where the connection // should be used by rpc and non-rpc functions, e.g. streaming a file after // sending an rpc response. type RpcCodecBuffered interface { http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/b153d958/newtmgr/vendor/github.com/ugorji/go/codec/simple.go ---------------------------------------------------------------------- diff --git a/newtmgr/vendor/github.com/ugorji/go/codec/simple.go b/newtmgr/vendor/github.com/ugorji/go/codec/simple.go index 7c0ba7a..231d503 100644 --- a/newtmgr/vendor/github.com/ugorji/go/codec/simple.go +++ b/newtmgr/vendor/github.com/ugorji/go/codec/simple.go @@ -166,6 +166,13 @@ func (d *simpleDecDriver) readNextBd() { d.bdRead = true } +func (d *simpleDecDriver) uncacheRead() { + if d.bdRead { + d.r.unreadn1() + d.bdRead = false + } +} + func (d *simpleDecDriver) ContainerType() (vt valueType) { if d.bd == simpleVdNil { return valueTypeNil @@ -474,7 +481,7 @@ func (d *simpleDecDriver) DecodeNaked() { // SimpleHandle is a Handle for a very simple encoding format. // // simple is a simplistic codec similar to binc, but not as compact. -// - Encoding of a value is always preceeded by the descriptor byte (bd) +// - Encoding of a value is always preceded by the descriptor byte (bd) // - True, false, nil are encoded fully in 1 byte (the descriptor) // - Integers (intXXX, uintXXX) are encoded in 1, 2, 4 or 8 bytes (plus a descriptor byte). // There are positive (uintXXX and intXXX >= 0) and negative (intXXX < 0) integers. http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/b153d958/newtmgr/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go ---------------------------------------------------------------------- diff --git a/newtmgr/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go b/newtmgr/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go index 4b6ff2a..4a13639 100644 --- a/newtmgr/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go +++ b/newtmgr/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go @@ -6,8 +6,6 @@ package unix -const _SYS_dup = SYS_DUP3 - //sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) = SYS_EPOLL_PWAIT //sys Fchown(fd int, uid int, gid int) (err error) //sys Fstat(fd int, stat *Stat_t) (err error) http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/b153d958/newtmgr/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go ---------------------------------------------------------------------- diff --git a/newtmgr/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go b/newtmgr/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go index 440f54e..8119fde 100644 --- a/newtmgr/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go +++ b/newtmgr/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go @@ -7,13 +7,6 @@ package unix -// Linux introduced getdents64 syscall for N64 ABI only in 3.10 -// (May 21 2013, rev dec33abaafc89bcbd78f85fad0513170415a26d5), -// to support older kernels, we have to use getdents for mips64. -// Also note that struct dirent is different for these two. -// Lookup linux_dirent{,64} in kernel source code for details. -const _SYS_getdents = SYS_GETDENTS - //sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) //sys Fchown(fd int, uid int, gid int) (err error) //sys Fstatfs(fd int, buf *Statfs_t) (err error) http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/b153d958/newtmgr/vendor/gopkg.in/fsnotify.v1/.travis.yml ---------------------------------------------------------------------- diff --git a/newtmgr/vendor/gopkg.in/fsnotify.v1/.travis.yml b/newtmgr/vendor/gopkg.in/fsnotify.v1/.travis.yml index e6def9a..3a5c933 100644 --- a/newtmgr/vendor/gopkg.in/fsnotify.v1/.travis.yml +++ b/newtmgr/vendor/gopkg.in/fsnotify.v1/.travis.yml @@ -2,7 +2,6 @@ sudo: false language: go go: - - 1.5.4 - 1.6.3 - tip http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/b153d958/newtmgr/vendor/gopkg.in/fsnotify.v1/AUTHORS ---------------------------------------------------------------------- diff --git a/newtmgr/vendor/gopkg.in/fsnotify.v1/AUTHORS b/newtmgr/vendor/gopkg.in/fsnotify.v1/AUTHORS index 2e64e5c..0a5bf8f 100644 --- a/newtmgr/vendor/gopkg.in/fsnotify.v1/AUTHORS +++ b/newtmgr/vendor/gopkg.in/fsnotify.v1/AUTHORS @@ -26,6 +26,7 @@ Kelvin Fo <vmir...@gmail.com> Ken-ichirou MATSUZAWA <cha...@h4.dion.ne.jp> Matt Layher <mdlay...@gmail.com> Nathan Youngman <g...@nathany.com> +Patrick <patr...@dropbox.com> Paul Hammond <p...@paulhammond.org> Pawel Knap <pawelkna...@gmail.com> Pieter Droogendijk <pie...@binky.org.uk> http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/b153d958/newtmgr/vendor/gopkg.in/fsnotify.v1/CHANGELOG.md ---------------------------------------------------------------------- diff --git a/newtmgr/vendor/gopkg.in/fsnotify.v1/CHANGELOG.md b/newtmgr/vendor/gopkg.in/fsnotify.v1/CHANGELOG.md index 96e3b7d..7fe8794 100644 --- a/newtmgr/vendor/gopkg.in/fsnotify.v1/CHANGELOG.md +++ b/newtmgr/vendor/gopkg.in/fsnotify.v1/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## v1.4.1 / 2016-10-04 + +* Fix flaky inotify stress test on Linux [#177](https://github.com/fsnotify/fsnotify/pull/177) (thanks @pattyshack) + ## v1.4.0 / 2016-10-01 * add a String() method to Event.Op [#165](https://github.com/fsnotify/fsnotify/pull/165) (thanks @oozie) http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/b153d958/newtmgr/vendor/gopkg.in/fsnotify.v1/CONTRIBUTING.md ---------------------------------------------------------------------- diff --git a/newtmgr/vendor/gopkg.in/fsnotify.v1/CONTRIBUTING.md b/newtmgr/vendor/gopkg.in/fsnotify.v1/CONTRIBUTING.md index 617e45a..6a81ba4 100644 --- a/newtmgr/vendor/gopkg.in/fsnotify.v1/CONTRIBUTING.md +++ b/newtmgr/vendor/gopkg.in/fsnotify.v1/CONTRIBUTING.md @@ -40,7 +40,7 @@ Contribute upstream: 3. Push to the branch (`git push fork my-new-feature`) 4. Create a new Pull Request on GitHub -This workflow is [thoroughly explained by Katrina Owen](https://blog.splice.com/contributing-open-source-git-repositories-go/). +This workflow is [thoroughly explained by Katrina Owen](https://splice.com/blog/contributing-open-source-git-repositories-go/). ### Testing http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/b153d958/newtmgr/vendor/gopkg.in/fsnotify.v1/README.md ---------------------------------------------------------------------- diff --git a/newtmgr/vendor/gopkg.in/fsnotify.v1/README.md b/newtmgr/vendor/gopkg.in/fsnotify.v1/README.md index 5ebce86..3c891e3 100644 --- a/newtmgr/vendor/gopkg.in/fsnotify.v1/README.md +++ b/newtmgr/vendor/gopkg.in/fsnotify.v1/README.md @@ -1,6 +1,6 @@ # File system notifications for Go -[![GoDoc](https://godoc.org/github.com/fsnotify/fsnotify?status.svg)](https://godoc.org/github.com/fsnotify/fsnotify) [![Go Report Card](https://goreportcard.com/badge/github.com/fsnotify/fsnotify)](https://goreportcard.com/report/github.com/fsnotify/fsnotify) [![Coverage](http://gocover.io/_badge/github.com/fsnotify/fsnotify)](http://gocover.io/github.com/fsnotify/fsnotify) +[![GoDoc](https://godoc.org/github.com/fsnotify/fsnotify?status.svg)](https://godoc.org/github.com/fsnotify/fsnotify) [![Go Report Card](https://goreportcard.com/badge/github.com/fsnotify/fsnotify)](https://goreportcard.com/report/github.com/fsnotify/fsnotify) fsnotify utilizes [golang.org/x/sys](https://godoc.org/golang.org/x/sys) rather than `syscall` from the standard library. Ensure you have the latest version installed by running: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/b153d958/newtmgr/vendor/mynewt.apache.org/newt/DISCLAIMER ---------------------------------------------------------------------- diff --git a/newtmgr/vendor/mynewt.apache.org/newt/DISCLAIMER b/newtmgr/vendor/mynewt.apache.org/newt/DISCLAIMER new file mode 100644 index 0000000..1600825 --- /dev/null +++ b/newtmgr/vendor/mynewt.apache.org/newt/DISCLAIMER @@ -0,0 +1,8 @@ +Apache Mynewt is an effort undergoing incubation at The Apache Software +Foundation (ASF), sponsored by the Incubator PMC. Incubation is +required of all newly accepted projects until a further review indicates +that the infrastructure, communications, and decision making process +have stabilized in a manner consistent with other successful ASF +projects. While incubation status is not necessarily a reflection of the +completeness or stability of the code, it does indicate that the project +has yet to be fully endorsed by the ASF. http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/b153d958/newtmgr/vendor/mynewt.apache.org/newt/LICENSE ---------------------------------------------------------------------- diff --git a/newtmgr/vendor/mynewt.apache.org/newt/LICENSE b/newtmgr/vendor/mynewt.apache.org/newt/LICENSE new file mode 100644 index 0000000..88a6f68 --- /dev/null +++ b/newtmgr/vendor/mynewt.apache.org/newt/LICENSE @@ -0,0 +1,244 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +This product bundles pretty, which is available under the MIT license. For +details, see newt/vendor/github.com/kr/pretty/License + +This product bundles kr/text, which is available under the MIT license. For +details, see newt/vendor/github.com/kr/text/License + +This product bundles mapstructure, which is available under the MIT license. +For details, see newt/vendor/github.com/mitchellh/mapstructure/LICENSE + +This product bundles logrus, which is available under the MIT license. For +details, see newt/vendor/github.com/Sirupsen/logrus/LICENSE + +This product bundles Cast, which is available under the MIT license. For +details, see newt/vendor/github.com/spf13/cast/LICENSE + +This product bundles jWalterWeatherman, which is available under the MIT +license. For details, see +newt/vendor/github.com/spf13/jwalterweatherman/LICENSE + +This product bundles pflag, which is available under the "3-clause BSD" +license. For details, see newt/vendor/github.com/spf13/pflag/LICENSE + +This product bundles the unix Go package, which is available under the +"3-clause BSD" license. For details, see newt/vendor/golang.org/x/sys/LICENSE + +This product bundles fsnotify.v1, which is available under the "3-clause BSD" +license. For details, see newt/vendor/gopkg.in/fsnotify.v1/LICENSE + +This product bundles yaml.v2's Go port of libyaml, which is available under the +MIT license. For details, see: + * yaml/apic.go + * yaml/emitterc.go + * yaml/parserc.go + * yaml/readerc.go + * yaml/scannerc.go + * yaml/writerc.go + * yaml/yamlh.go + * yaml/yamlprivateh.go + +This product bundles viper, which is available under the MIT license. For +details, see: + * viper/LICENSE http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/b153d958/newtmgr/vendor/mynewt.apache.org/newt/NOTICE ---------------------------------------------------------------------- diff --git a/newtmgr/vendor/mynewt.apache.org/newt/NOTICE b/newtmgr/vendor/mynewt.apache.org/newt/NOTICE new file mode 100644 index 0000000..94bea73 --- /dev/null +++ b/newtmgr/vendor/mynewt.apache.org/newt/NOTICE @@ -0,0 +1,8 @@ +Apache Mynewt (incubating) +Copyright 2015-2016 The Apache Software Foundation + +This product includes software developed at +The Apache Software Foundation (http://www.apache.org/). + +Portions of this software were developed at +Runtime Inc, copyright 2015.