If enabled by flags, try to use methods to stringify map keys and sort on that.
If we can't use primitive sorting and we can't use methods, we can still fall
back on spew itself. If SpewKeys is enabled, use Sprintf("%#v") to generate a
string and sort by that.
This will allow the command to update the package if an old one happens to
be present while still fetching it if it's missing.
Suggested by @shurcooL in #28.
This commit modifies the unsafeReflectValue function to recognize
reference types even when the indirection flag is not set for the series
of golang commits after ecccf07e7f9d and before 82f48826c6c7 which
introduced the additional scalar field in the reflect.Value struct. That
additional field has since been removed, but the intention of this code is
to work properly across all Go versions and other packages make use of the
logic.
Thanks to @shurcooL for providing example code which wasn't working
properly with the function when it was exported and therefore being called
in ways which spew itself does not.
This commit adds logic to gracefully handle the new internal reflect.Value
structure on tip as of golang commit 82f48826c6c7 as well as the internal
reflect.Value flag bit changes as of golang commit 90a7c3c86944.
It accomplishes this by doing some inspection at init time and choosing
the appropriate offsets and flag positions accordingly. There was some
previous logic which dealt with a similar issue for golang commit
ecccf07e7f9d. However, since the more recent commits essentially reverted
the change and also modify the flag bit positions, it made more sense to
rework the detection logic. In particular, the new logic examines the
size of the reflect.Value struct to determine the difference and extracts
the kind from the flags to determine if the flags have been changed.
As a result, this commit allows spew to work properly with tip all the
back to Go 1.0.
This commit adds logic to gracefully handle the new internal reflect.Value
structure on tip as of golang commit ecccf07e7f9d. It accomplishes this
by doing some inspection at init time and choosing the appropriate offsets
as well as modifying which offset is used for the value accordingly. As a
result, this allows spew to work properly with both the current release
version of Go as well as tip.
Fixes#15.
reflect.DeepEqual fails when comparing reflect.Value containing float64. I
think it cannot make sense of reflect.Value pointer tricks and directly
compare reflect.Value.val fields which contain the float value in 64 bits,
but a pointer to the float in 32 bits.
Fortunately, interface{} which have a similar memory layout, compare correctly,
so we just turn the []reflect.Value into []interface{}.
The function sort be sorting the uintptr itself, not the address of it.
Also, the previous code could easily panic on an unaddressable
reflect.Value since it was trying to take an address.
This commit moves the TestSortValues function from dump_test.go to
common_test.go to mirror the new implementation location. It also
slightly formats the tests to be consistent with the rest of the package.
This commit moves the new code related to sorting reflect.Value items into
common.go since it is accessed by both the formatter and the dumper. It
also adds comments to the new functions and unexports SortValues since it
should be an internal function only.
The previous version of SortKeys was sorting only native types. Now, if
the type is unknown it defaults to its reflect.Value.String()
representation which at least guarantees display stability.
If ConfigState.SortKeys is true, then dump and format will sort map keys
before displaying them. Only native types (bool, ints, uint, uintptr,
string) are supported, other slices are left unchanged.
The motivation is to have more diffable output, mostly for test purpose.
This commit updates the test coverage report in include the latest
tests for the recent cgo handling updates for char, unsigned char,
and uint8_t arrays.
This commit adds a script which can be used to generate the test coverage
report. It detects whether or not gcc is installed and adds the necessary
build tag to enable the new cgo tests when gcc is available.
This commit adds tests for the recent cgo handling of char, unsigned char,
and uint8_t arrays.
In addition, it adds an architecture for the cgo specific testing based on
build constraints. This was done because spew itself does not require
cgo, but in order to test its handling of the cgo types it needs to be fed
cgo data. Rather than force all users to have a system which supports cgo
and an external compiler just to run the tests, the cgo test support must
explicitly be turned on via a build tag.
This commit adds support for dumping a few cgo types like hexdump -C as
requested in issue #11. In particular, it now handles char [#], unsigned
char [#], and uint8_t [#].
This commit modifies the code to detect nil slices and display them as
<nil> (as opposed to simply empty slices). For most instances a nil slice
can be treated the same as an empty slice, but there is a difference and
things like reflect.DeepEqual notice. This change makes it clear whether
the type in question is a nil slice or an empty slice.
This commit adds a function named Sdump which works exactly like Dump and
Fdump except it returns the formatted output as a string. This serves the
same purpose as the the Sprint* family of functions.