Commit e9c901db authored by Rob Pike's avatar Rob Pike

json: don't indirect before testing for custom unmarshaler

Fixes #1260.

R=gri
CC=golang-dev
https://golang.org/cl/2994041
parent 9f19392f
...@@ -128,7 +128,9 @@ func (d *decodeState) unmarshal(v interface{}) (err os.Error) { ...@@ -128,7 +128,9 @@ func (d *decodeState) unmarshal(v interface{}) (err os.Error) {
} }
d.scan.reset() d.scan.reset()
d.value(pv.Elem()) // We decode rv not pv.Elem because the Unmarshaler interface
// test must be applied at the top level of the value.
d.value(rv)
return d.savedError return d.savedError
} }
......
...@@ -23,6 +23,24 @@ type tx struct { ...@@ -23,6 +23,24 @@ type tx struct {
var txType = reflect.Typeof((*tx)(nil)).(*reflect.PtrType).Elem().(*reflect.StructType) var txType = reflect.Typeof((*tx)(nil)).(*reflect.PtrType).Elem().(*reflect.StructType)
// A type that can unmarshal itself.
type unmarshaler struct {
T bool
}
func (u *unmarshaler) UnmarshalJSON(b []byte) os.Error {
*u = unmarshaler{true} // All we need to see that UnmarshalJson is called.
return nil
}
var (
um0, um1 unmarshaler // target2 of unmarshaling
ump = &um1
umtrue = unmarshaler{true}
)
type unmarshalTest struct { type unmarshalTest struct {
in string in string
ptr interface{} ptr interface{}
...@@ -56,6 +74,10 @@ var unmarshalTests = []unmarshalTest{ ...@@ -56,6 +74,10 @@ var unmarshalTests = []unmarshalTest{
{pallValueCompact, new(All), pallValue, nil}, {pallValueCompact, new(All), pallValue, nil},
{pallValueIndent, new(*All), &pallValue, nil}, {pallValueIndent, new(*All), &pallValue, nil},
{pallValueCompact, new(*All), &pallValue, nil}, {pallValueCompact, new(*All), &pallValue, nil},
// unmarshal interface test
{`{"T":false}`, &um0, umtrue, nil}, // use "false" so test will fail if custom unmarshaler is not called
{`{"T":false}`, &ump, &umtrue, nil},
} }
func TestMarshal(t *testing.T) { func TestMarshal(t *testing.T) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment