Skip to content

Commit

Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
fix: corrupted mismatch type error in jit
Browse files Browse the repository at this point in the history
liuq19 committed Aug 23, 2024

Verified

This commit was signed with the committer’s verified signature. The key has expired.
colombod Diego Colombo
1 parent bc420fc commit 7cca21d
Showing 5 changed files with 53 additions and 5 deletions.
6 changes: 3 additions & 3 deletions internal/decoder/jitdec/assembler_regabi_amd64.go
Original file line number Diff line number Diff line change
@@ -385,7 +385,7 @@ func (self *_Assembler) prologue() {

var (
_REG_go = []obj.Addr { _ST, _VP, _IP, _IL, _IC }
_REG_rt = []obj.Addr { _ST, _VP, _IP, _IL, _IC, _IL }
_REG_rt = []obj.Addr { _ST, _VP, _IP, _IL, _IC }
)

func (self *_Assembler) save(r ...obj.Addr) {
@@ -492,9 +492,9 @@ func (self *_Assembler) type_error() {
func (self *_Assembler) mismatch_error() {
self.Link(_LB_mismatch_error) // _type_error:
self.Emit("MOVQ", _VAR_et, _ET) // MOVQ _VAR_et, ET
self.Emit("MOVQ", _VAR_ic, _EP) // MOVQ _VAR_ic, EP
self.Emit("MOVQ", _I_json_MismatchTypeError, _CX) // MOVQ _I_json_MismatchType, CX
self.Emit("CMPQ", _ET, _CX) // CMPQ ET, CX
self.Emit("MOVQ", jit.Ptr(_ST, _EpOffset), _EP) // MOVQ st.Ep, EP
self.Sjmp("JE" , _LB_error) // JE _LB_error
self.Emit("MOVQ", _ARG_sp, _AX)
self.Emit("MOVQ", _ARG_sl, _BX)
@@ -1147,8 +1147,8 @@ func (self *_Assembler) decode_dynamic(vt obj.Addr, vp obj.Addr) {
self.Emit("MOVQ", _I_json_MismatchTypeError, _CX) // MOVQ _I_json_MismatchTypeError, CX
self.Emit("CMPQ", _ET, _CX) // CMPQ ET, CX
self.Sjmp("JNE", _LB_error) // JNE LB_error
self.Emit("MOVQ", _EP, _VAR_ic) // MOVQ EP, VAR_ic
self.Emit("MOVQ", _ET, _VAR_et) // MOVQ ET, VAR_et
self.WriteRecNotAX(14, _EP, jit.Ptr(_ST, _EpOffset), false, false) // MOVQ EP, (ST).Ep
self.Link("_decode_dynamic_end_{n}")
}

1 change: 0 additions & 1 deletion internal/decoder/jitdec/generic_regabi_amd64.go
Original file line number Diff line number Diff line change
@@ -186,7 +186,6 @@ var (
_T_slice = jit.Type(reflect.TypeOf(([]interface{})(nil)))
_T_string = jit.Type(reflect.TypeOf(""))
_T_number = jit.Type(reflect.TypeOf(json.Number("")))
_T_miserr = jit.Type(reflect.TypeOf(MismatchTypeError{}))
_T_float64 = jit.Type(reflect.TypeOf(float64(0)))
)

2 changes: 2 additions & 0 deletions internal/decoder/jitdec/pools.go
Original file line number Diff line number Diff line change
@@ -36,6 +36,7 @@ const (
_PtrBytes = _PTR_SIZE / 8
_FsmOffset = (_MaxStack + 1) * _PtrBytes
_DbufOffset = _FsmOffset + int64(unsafe.Sizeof(types.StateMachine{})) + types.MAX_RECURSE * _PtrBytes
_EpOffset = _DbufOffset + _MaxDigitNums
_StackSize = unsafe.Sizeof(_Stack{})
)

@@ -53,6 +54,7 @@ type _Stack struct {
mm types.StateMachine
vp [types.MAX_RECURSE]unsafe.Pointer
dp [_MaxDigitNums]byte
ep unsafe.Pointer
}

type _Decoder func(
47 changes: 47 additions & 0 deletions issue_test/issue692_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
// Copyright 2024 CloudWeGo Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package issue_test

import (
"encoding/json"
"testing"

"github.com/bytedance/sonic"
"github.com/stretchr/testify/assert"
)


type A1 struct {
A *A1 `json:"a"`
B int `json:"b"`
C int `json:"c"`
D D `json:"d"`
}

type D int

func (d *D) UnmarshalJSON(data []byte) error {
return nil
}

func TestMismatchErrorInRecusive(t *testing.T) {
data := `{"a":{"a": null, "b": "123"}, "c": 123, "d": {}}`
var obj1, obj2 A1
es := sonic.Unmarshal([]byte(data), &obj1)
ee := json.Unmarshal([]byte(data), &obj2)
assert.Equal(t, ee ==nil, es == nil, es)
assert.Equal(t, obj1, obj2)
println(es.Error())
}
2 changes: 1 addition & 1 deletion loader/loader_latest.go
Original file line number Diff line number Diff line change
@@ -71,7 +71,7 @@ func (self Loader) LoadOne(text []byte, funcName string, frameSize int, argSize
}

if localPtrs != nil {
locals := rt .StackMapBuilder{}
locals := rt.StackMapBuilder{}
for _, b := range localPtrs {
locals.AddField(b)
}

0 comments on commit 7cca21d

Please sign in to comment.