Commit Graph

20 Commits

Author SHA1 Message Date
Dave Collins 2df174808e Add support for limited mode without unsafe pkg.
This commit adds support for compiling spew without the unsafe package.
When compiled without the unsafe package, some of the more advanced
features such as invoking stringers on pointers from non-pointer
variables and unexported struct fields are not available.

By default, spew will be compiled in the limited mode for Google App
Engine since the unsafe package is not available there.  Additionally,
spew can be compiled without the unsafe package manually by specifying
the "disableunsafe" build tag.

Finally, a new package-level constant named "UnsafeDisabled" has been
exposed which can be used to programmatically determine if spew was
compiled with access to the unsafe package.
2015-06-19 15:29:34 -05:00
Tim Hockin 3e6e67c4dc Enable methods to sort map keys and spew itself as last resort
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.
2015-04-10 08:46:42 -07:00
Anaminus a4b53deb9b Add support for sorting keys that are arrays. 2015-02-23 15:16:52 -06:00
Dave Collins 83f84dc933 Improve unsafe reflect value handling.
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.
2014-11-15 20:01:10 -06:00
Dave Collins 128854244a Add logic to deal with reflect pkg changes on tip.
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.
2014-10-24 18:49:38 -05:00
Josh Rickmar 3fdaf5cea8 Dump non-zero len and cap for applicable types.
Closes #16.
2014-05-05 22:39:05 -05:00
Dave Collins 65ca732a33 Add logic to deal with reflect pkg changes on tip.
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.
2014-01-08 02:01:15 -06:00
Dave Collins 3b4a2055ce Correct valuesSorter.Less function for uintptr.
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.
2013-11-14 22:03:41 -06:00
Dave Collins 67c401cf12 Reorder Less function cases to consistent order. 2013-11-14 21:53:06 -06:00
Dave Collins de6d1a24a0 Reorganize the new map key sorting functionality.
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.
2013-11-14 21:39:21 -06:00
Dave Collins 70d81533ec Dump byte arrays and slices like hexdump -C.
This commit modifies the Dump family functions to output byte arrays and
slices like hexdump -C as specified in issue #9.
2013-03-08 22:15:12 -06:00
Dave Collins 471552e81e Modify printInt and printUint to accept base.
This paves the way to improve how byte arrays are output as well as
increases the flexibily of the functions.
2013-03-08 19:55:04 -06:00
Dave Collins 9dfc238865 Cleanup documentation on new ContinueOnMethod code.
This commit expands on TShadwell's work attached to issue #8.  It
rounds out the documentation for the new option.
2013-03-03 12:59:13 -06:00
Thomas NJ Shadwell f948516369 revert previous mis-commits, add ability to allow deeper pretty-printing after an error or Stringer interface is encountered. 2013-02-26 19:43:45 +00:00
Dave Collins 6024e0c79e Invoke String/Error methods on addressable vals.
If a type implements a Stringer or error interface with a pointer receiver
and the value being formatted is addressable, the interface should be
invoked even when the DisablePointerMethods option is set.
DisablePointerMethods is only intended to prevent the potentially unsafe
action of stepping around type-safety restriction to invoke a Stringer or
error interface with a pointer to an unaddressable value.
2013-01-20 17:37:24 -06:00
Dave Collins 1f81f22357 Implement support for %#v and %#+v in Formatter.
This commit implements feature request #3.  In particular, it allows the
formatter to respond to %#v and %#+v.  The # flag (%#v) adds type
information to the output and the combination of the # and + flags (%#+v)
adds both type information and pointer information.  This allows the
consumer a choice between displaying types, pointer information, or both.
2013-01-17 18:43:51 -06:00
Dave Collins c5fba05307 Fix a comment and a apply few gofmt changes. 2013-01-16 23:30:06 -06:00
Dave Collins bd6dd81322 Use writer directly in formatter.
Write directly to the fmt.State output writer to avoid the overhead
of a buffer in the formatter code.
2013-01-14 00:23:18 -06:00
Dave Collins 184d118062 Add config pointers to format and dump states.
This paves the way to support individual configuration options through a
separate type while still providing the simple global config and package
level methods.
2013-01-10 20:39:05 -06:00
Dave Collins 1a599b7b25 Initial implementation. 2013-01-08 23:38:16 -06:00