mirror of https://github.com/goccy/go-json.git
Use pre allocated pointer if exists it
This commit is contained in:
parent
72cdc2a1d5
commit
e09027425c
|
@ -44,8 +44,13 @@ func (d *ptrDecoder) decodeStream(s *stream, p unsafe.Pointer) error {
|
||||||
*(*unsafe.Pointer)(p) = nil
|
*(*unsafe.Pointer)(p) = nil
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
newptr := unsafe_New(d.typ)
|
var newptr unsafe.Pointer
|
||||||
|
if *(*unsafe.Pointer)(p) == nil {
|
||||||
|
newptr = unsafe_New(d.typ)
|
||||||
*(*unsafe.Pointer)(p) = newptr
|
*(*unsafe.Pointer)(p) = newptr
|
||||||
|
} else {
|
||||||
|
newptr = *(*unsafe.Pointer)(p)
|
||||||
|
}
|
||||||
if err := d.dec.decodeStream(s, newptr); err != nil {
|
if err := d.dec.decodeStream(s, newptr); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -74,8 +79,13 @@ func (d *ptrDecoder) decode(buf []byte, cursor int64, p unsafe.Pointer) (int64,
|
||||||
cursor += 4
|
cursor += 4
|
||||||
return cursor, nil
|
return cursor, nil
|
||||||
}
|
}
|
||||||
newptr := unsafe_New(d.typ)
|
var newptr unsafe.Pointer
|
||||||
|
if *(*unsafe.Pointer)(p) == nil {
|
||||||
|
newptr = unsafe_New(d.typ)
|
||||||
*(*unsafe.Pointer)(p) = newptr
|
*(*unsafe.Pointer)(p) = newptr
|
||||||
|
} else {
|
||||||
|
newptr = *(*unsafe.Pointer)(p)
|
||||||
|
}
|
||||||
c, err := d.dec.decode(buf, cursor, newptr)
|
c, err := d.dec.decode(buf, cursor, newptr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
|
|
|
@ -1864,7 +1864,6 @@ func TestUnmarshal(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
func TestUnmarshalMarshal(t *testing.T) {
|
func TestUnmarshalMarshal(t *testing.T) {
|
||||||
initBig()
|
initBig()
|
||||||
var v interface{}
|
var v interface{}
|
||||||
|
@ -1881,7 +1880,6 @@ func TestUnmarshalMarshal(t *testing.T) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|
||||||
var numberTests = []struct {
|
var numberTests = []struct {
|
||||||
in string
|
in string
|
||||||
|
@ -1938,7 +1936,6 @@ type Xint struct {
|
||||||
X int
|
X int
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
func TestUnmarshalInterface(t *testing.T) {
|
func TestUnmarshalInterface(t *testing.T) {
|
||||||
var xint Xint
|
var xint Xint
|
||||||
var i interface{} = &xint
|
var i interface{} = &xint
|
||||||
|
@ -1949,8 +1946,7 @@ func TestUnmarshalInterface(t *testing.T) {
|
||||||
t.Fatalf("Did not write to xint")
|
t.Fatalf("Did not write to xint")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
/*
|
|
||||||
func TestUnmarshalPtrPtr(t *testing.T) {
|
func TestUnmarshalPtrPtr(t *testing.T) {
|
||||||
var xint Xint
|
var xint Xint
|
||||||
pxint := &xint
|
pxint := &xint
|
||||||
|
@ -1961,7 +1957,6 @@ func TestUnmarshalPtrPtr(t *testing.T) {
|
||||||
t.Fatalf("Did not write to xint")
|
t.Fatalf("Did not write to xint")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|
||||||
func TestEscape(t *testing.T) {
|
func TestEscape(t *testing.T) {
|
||||||
const input = `"foobar"<html>` + " [\u2028 \u2029]"
|
const input = `"foobar"<html>` + " [\u2028 \u2029]"
|
||||||
|
|
Loading…
Reference in New Issue