forked from mirror/go-json
Merge pull request #377 from orisano/fix/#376
Fix encoding of directed interface with typed nil
This commit is contained in:
commit
1468eefb01
|
@ -2406,3 +2406,21 @@ func TestIssue339(t *testing.T) {
|
||||||
t.Errorf("unexpected result: %v != %v", got, expected)
|
t.Errorf("unexpected result: %v != %v", got, expected)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestIssue376(t *testing.T) {
|
||||||
|
type Container struct {
|
||||||
|
V interface{} `json:"value"`
|
||||||
|
}
|
||||||
|
type MapOnly struct {
|
||||||
|
Map map[string]int64 `json:"map"`
|
||||||
|
}
|
||||||
|
b, err := json.Marshal(Container{MapOnly{}})
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
got := string(b)
|
||||||
|
expected := `{"value":{"map":null}}`
|
||||||
|
if got != expected {
|
||||||
|
t.Errorf("unexpected result: %v != %v", got, expected)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -3,6 +3,7 @@ package vm
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"math"
|
"math"
|
||||||
|
"reflect"
|
||||||
"sort"
|
"sort"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
|
|
||||||
|
@ -194,9 +195,12 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
|
||||||
typ = iface.typ
|
typ = iface.typ
|
||||||
}
|
}
|
||||||
if ifacePtr == nil {
|
if ifacePtr == nil {
|
||||||
b = appendNullComma(ctx, b)
|
isDirectedNil := typ != nil && typ.Kind() == reflect.Struct && !runtime.IfaceIndir(typ)
|
||||||
code = code.Next
|
if !isDirectedNil {
|
||||||
break
|
b = appendNullComma(ctx, b)
|
||||||
|
code = code.Next
|
||||||
|
break
|
||||||
|
}
|
||||||
}
|
}
|
||||||
ctx.KeepRefs = append(ctx.KeepRefs, up)
|
ctx.KeepRefs = append(ctx.KeepRefs, up)
|
||||||
ifaceCodeSet, err := encoder.CompileToGetCodeSet(ctx, uintptr(unsafe.Pointer(typ)))
|
ifaceCodeSet, err := encoder.CompileToGetCodeSet(ctx, uintptr(unsafe.Pointer(typ)))
|
||||||
|
|
|
@ -3,6 +3,7 @@ package vm
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"math"
|
"math"
|
||||||
|
"reflect"
|
||||||
"sort"
|
"sort"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
|
|
||||||
|
@ -194,9 +195,12 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
|
||||||
typ = iface.typ
|
typ = iface.typ
|
||||||
}
|
}
|
||||||
if ifacePtr == nil {
|
if ifacePtr == nil {
|
||||||
b = appendNullComma(ctx, b)
|
isDirectedNil := typ != nil && typ.Kind() == reflect.Struct && !runtime.IfaceIndir(typ)
|
||||||
code = code.Next
|
if !isDirectedNil {
|
||||||
break
|
b = appendNullComma(ctx, b)
|
||||||
|
code = code.Next
|
||||||
|
break
|
||||||
|
}
|
||||||
}
|
}
|
||||||
ctx.KeepRefs = append(ctx.KeepRefs, up)
|
ctx.KeepRefs = append(ctx.KeepRefs, up)
|
||||||
ifaceCodeSet, err := encoder.CompileToGetCodeSet(ctx, uintptr(unsafe.Pointer(typ)))
|
ifaceCodeSet, err := encoder.CompileToGetCodeSet(ctx, uintptr(unsafe.Pointer(typ)))
|
||||||
|
|
|
@ -3,6 +3,7 @@ package vm_color
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"math"
|
"math"
|
||||||
|
"reflect"
|
||||||
"sort"
|
"sort"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
|
|
||||||
|
@ -194,9 +195,12 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
|
||||||
typ = iface.typ
|
typ = iface.typ
|
||||||
}
|
}
|
||||||
if ifacePtr == nil {
|
if ifacePtr == nil {
|
||||||
b = appendNullComma(ctx, b)
|
isDirectedNil := typ != nil && typ.Kind() == reflect.Struct && !runtime.IfaceIndir(typ)
|
||||||
code = code.Next
|
if !isDirectedNil {
|
||||||
break
|
b = appendNullComma(ctx, b)
|
||||||
|
code = code.Next
|
||||||
|
break
|
||||||
|
}
|
||||||
}
|
}
|
||||||
ctx.KeepRefs = append(ctx.KeepRefs, up)
|
ctx.KeepRefs = append(ctx.KeepRefs, up)
|
||||||
ifaceCodeSet, err := encoder.CompileToGetCodeSet(ctx, uintptr(unsafe.Pointer(typ)))
|
ifaceCodeSet, err := encoder.CompileToGetCodeSet(ctx, uintptr(unsafe.Pointer(typ)))
|
||||||
|
|
|
@ -3,6 +3,7 @@ package vm_color_indent
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"math"
|
"math"
|
||||||
|
"reflect"
|
||||||
"sort"
|
"sort"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
|
|
||||||
|
@ -194,9 +195,12 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
|
||||||
typ = iface.typ
|
typ = iface.typ
|
||||||
}
|
}
|
||||||
if ifacePtr == nil {
|
if ifacePtr == nil {
|
||||||
b = appendNullComma(ctx, b)
|
isDirectedNil := typ != nil && typ.Kind() == reflect.Struct && !runtime.IfaceIndir(typ)
|
||||||
code = code.Next
|
if !isDirectedNil {
|
||||||
break
|
b = appendNullComma(ctx, b)
|
||||||
|
code = code.Next
|
||||||
|
break
|
||||||
|
}
|
||||||
}
|
}
|
||||||
ctx.KeepRefs = append(ctx.KeepRefs, up)
|
ctx.KeepRefs = append(ctx.KeepRefs, up)
|
||||||
ifaceCodeSet, err := encoder.CompileToGetCodeSet(ctx, uintptr(unsafe.Pointer(typ)))
|
ifaceCodeSet, err := encoder.CompileToGetCodeSet(ctx, uintptr(unsafe.Pointer(typ)))
|
||||||
|
|
|
@ -3,6 +3,7 @@ package vm_indent
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"math"
|
"math"
|
||||||
|
"reflect"
|
||||||
"sort"
|
"sort"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
|
|
||||||
|
@ -194,9 +195,12 @@ func Run(ctx *encoder.RuntimeContext, b []byte, codeSet *encoder.OpcodeSet) ([]b
|
||||||
typ = iface.typ
|
typ = iface.typ
|
||||||
}
|
}
|
||||||
if ifacePtr == nil {
|
if ifacePtr == nil {
|
||||||
b = appendNullComma(ctx, b)
|
isDirectedNil := typ != nil && typ.Kind() == reflect.Struct && !runtime.IfaceIndir(typ)
|
||||||
code = code.Next
|
if !isDirectedNil {
|
||||||
break
|
b = appendNullComma(ctx, b)
|
||||||
|
code = code.Next
|
||||||
|
break
|
||||||
|
}
|
||||||
}
|
}
|
||||||
ctx.KeepRefs = append(ctx.KeepRefs, up)
|
ctx.KeepRefs = append(ctx.KeepRefs, up)
|
||||||
ifaceCodeSet, err := encoder.CompileToGetCodeSet(ctx, uintptr(unsafe.Pointer(typ)))
|
ifaceCodeSet, err := encoder.CompileToGetCodeSet(ctx, uintptr(unsafe.Pointer(typ)))
|
||||||
|
|
Loading…
Reference in New Issue