Skip to content

Commit

Permalink
opt: make more panic msg
Browse files Browse the repository at this point in the history
  • Loading branch information
AsterDY committed Jul 30, 2024
1 parent 081bee6 commit b8450a5
Show file tree
Hide file tree
Showing 7 changed files with 156 additions and 29 deletions.
81 changes: 62 additions & 19 deletions conv/j2t/conv_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,32 @@ func TestConvJSON2Thrift(t *testing.T) {
require.Equal(t, exp, act)
}

func TestPanicRecover(t *testing.T) {
desc := getExampleDesc()
data := getExampleData()
exp := example3.NewExampleReq()
err := json.Unmarshal(data, exp)
require.Nil(t, err)
req := getExampleReq(exp, true, data)
cv := NewBinaryConv(conv.Options{
EnableHttpMapping: true,
})
ctx := context.Background()
ctx = context.WithValue(ctx, conv.CtxKeyHTTPRequest, req)
buf := make([]byte, 0, 1)
mock := MockConv{
panic:2,
}
defer func() {
if v := recover(); v == nil {
t.Fatal("not panic")
} else {
t.Log(v)
}
}()
_ = mock.do(&cv, ctx, data, desc, &buf, req, true)
}

func TestConvHTTP2Thrift(t *testing.T) {
desc := getExampleDesc()
data := getExampleData()
Expand Down Expand Up @@ -683,7 +709,6 @@ func TestError(t *testing.T) {
sp: types.MAX_RECURSE + 1,
reqsCache: 1,
keyCache: 1,
dcap: 800,
}
err := mock.do(&cv, ctx, src, desc, &buf, nil, true)
require.Error(t, err)
Expand Down Expand Up @@ -724,8 +749,8 @@ type MockConv struct {
sp int
reqsCache int
keyCache int
dcap int
fc int
fieldCache int
panic int
}

func (mock *MockConv) Do(self *BinaryConv, ctx context.Context, desc *thrift.TypeDescriptor, jbytes []byte) (tbytes []byte, err error) {
Expand Down Expand Up @@ -759,26 +784,46 @@ func (mock *MockConv) Do(self *BinaryConv, ctx context.Context, desc *thrift.Typ
func (mock MockConv) do(self *BinaryConv, ctx context.Context, src []byte, desc *thrift.TypeDescriptor, buf *[]byte, req http.RequestGetter, top bool) (err error) {
flags := toFlags(self.opts)
jp := rt.Mem2Str(src)
tmp := make([]byte, 0, mock.dcap)
fsm := &types.J2TStateMachine{
SP: mock.sp,
JT: types.JsonState{
Dbuf: *(**byte)(unsafe.Pointer(&tmp)),
Dcap: mock.dcap,
},
ReqsCache: make([]byte, 0, mock.reqsCache),
KeyCache: make([]byte, 0, mock.keyCache),
SM: types.StateMachine{},
VT: [types.MAX_RECURSE]types.J2TState{},
FieldCache: make([]int32, 0, mock.fc),
// tmp := make([]byte, 0, mock.dcap)
fsm := types.NewJ2TStateMachine()
if mock.reqsCache != 0 {
fsm.ReqsCache = make([]byte, 0, mock.reqsCache)
}
if mock.keyCache != 0 {
fsm.KeyCache = make([]byte, 0, mock.keyCache)
}
if mock.fieldCache != 0 {
fsm.FieldCache = make([]int32, 0, mock.fieldCache)
}
// fsm := &types.J2TStateMachine{
// SP: mock.sp,
// JT: types.JsonState{
// Dbuf: *(**byte)(unsafe.Pointer(&tmp)),
// Dcap: mock.dcap,
// },
// ReqsCache: make([]byte, 0, mock.reqsCache),
// KeyCache: make([]byte, 0, mock.keyCache),
// SM: types.StateMachine{},
// VT: [types.MAX_RECURSE]types.J2TState{},
// FieldCache: make([]int32, 0, mock.fc),
// }
fsm.Init(0, unsafe.Pointer(desc))
if mock.sp != 0 {
fsm.SP = mock.sp
}
var ret uint64
defer func() {
if msg := recover(); msg != nil {
panic(makePanicMsg(msg, src, desc, buf, req, self.flags, fsm, ret))
}
}()

exec:
ret := native.J2T_FSM(fsm, buf, &jp, flags)
mock.panic -= 1
if mock.panic == 0 {
panic("test!")
}
ret = native.J2T_FSM(fsm, buf, &jp, flags)
if ret != 0 {
cont, e := self.handleError(ctx, fsm, buf, src, req, ret, top)
if cont && e == nil {
Expand Down Expand Up @@ -807,7 +852,6 @@ func TestStateMachineOOM(t *testing.T) {
sp: 0,
reqsCache: 1,
keyCache: 1,
dcap: 800,
}
err := mock.do(&cv, ctx, src, desc, &buf, nil, true)
require.Nil(t, err)
Expand Down Expand Up @@ -844,8 +888,7 @@ func TestStateMachineOOM(t *testing.T) {
sp: 1,
reqsCache: 1,
keyCache: 1,
dcap: 800,
fc: 0,
fieldCache: 0,
}
cv := NewBinaryConv(conv.Options{
EnableHttpMapping: true,
Expand Down
19 changes: 19 additions & 0 deletions conv/j2t/error.go
Original file line number Diff line number Diff line change
Expand Up @@ -192,3 +192,22 @@ func locateInput(in []byte, ip int) string {
}
return je.Locate()
}

func makePanicMsg(msg interface{}, src []byte, desc *thrift.TypeDescriptor, buf *[]byte, req http.RequestGetter, flags uint64, fsm *types.J2TStateMachine, ret uint64) string {
var re string
if rt, ok := req.(*http.HTTPRequest); ok {
re = fmt.Sprintf("%v", rt)
}
return fmt.Sprintf(`%v
Flags: %b
JSON: %s
Buf: %v
<FSM>
%s
</FSM>
Desc: %s
<Request>
%s
</Request>
Ret: %x`, msg, flags, string(src), *buf, fsm.String(), desc.Name(), re, ret)
}
13 changes: 5 additions & 8 deletions conv/j2t/impl.go
Original file line number Diff line number Diff line change
Expand Up @@ -91,14 +91,11 @@ func (self *BinaryConv) do(ctx context.Context, src []byte, desc *thrift.TypeDes
}

func (self *BinaryConv) doNative(ctx context.Context, src []byte, desc *thrift.TypeDescriptor, buf *[]byte, req http.RequestGetter, top bool) (err error) {
var ret uint64
fsm := types.NewJ2TStateMachine()

var ret uint64
defer func() {
if v := recover(); v != nil {
e, p, v := getErrCode(ret), getPos(ret), getValue(ret)
msg := fmt.Sprintf("panic %v:\n Error: %v(%v).\nJSON: %s\n. Flags: %b.\n FSM: \n%s", e, v, locateInput(src, p), self.flags, fsm.String())
panic(msg)
if msg := recover(); msg != nil {
panic(makePanicMsg(msg, src, desc, buf, req, self.flags, fsm, ret))
}
}()

Expand All @@ -113,10 +110,10 @@ exec:
goto exec
}
err = e
goto ret
goto final
}

ret:
final:
types.FreeJ2TStateMachine(fsm)
runtime.KeepAlive(desc)
runtime.KeepAlive(src)
Expand Down
1 change: 1 addition & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ require (
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
golang.org/x/arch v0.0.0-20210923205945-b76863e36670 // indirect
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f // indirect
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)
13 changes: 12 additions & 1 deletion go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.m
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=
github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
Expand All @@ -52,6 +53,7 @@ github.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHL
github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=
github.com/jhump/protoreflect v1.8.2 h1:k2xE7wcUomeqwY0LDCYA16y4WWfyTcMx5mKhk0d4ua0=
github.com/jhump/protoreflect v1.8.2/go.mod h1:7GcYQDdMU/O/BBrl/cX6PNHpXh6cenjd8pneu5yW7Tg=
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk=
Expand Down Expand Up @@ -80,6 +82,7 @@ github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS
github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
golang.org/x/arch v0.0.0-20210923205945-b76863e36670 h1:18EFjUmQOcUvxNYSkA6jO9VAiXCnxFY6NyDX0bHDmkU=
golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
Expand All @@ -104,6 +107,7 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20220722155237-a158d28d115b h1:PxfKdU9lEEDYjdIzOtC4qFWgkU2rGHdKlKowJSMN9h0=
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
Expand All @@ -113,11 +117,13 @@ golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJ
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
Expand All @@ -139,12 +145,15 @@ golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBn
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
Expand All @@ -165,6 +174,7 @@ google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2
google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
google.golang.org/protobuf v1.25.1-0.20200805231151-a709e31e5d12/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w=
google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
Expand All @@ -178,3 +188,4 @@ honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWh
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=
rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=
8 changes: 8 additions & 0 deletions http/http.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ package http

import (
"bytes"
"fmt"
"io"
"io/ioutil"
"net/http"
Expand Down Expand Up @@ -91,6 +92,13 @@ type HTTPRequest struct {
BodyMap interface{}
}

func (h *HTTPRequest) String() string {
return fmt.Sprintf(`URL: %s
Headers: %v
Body: %s
BodyMap: %v`, h.URL.String(), h.Header, string(h.rawBody), h.BodyMap)
}

// NewHTTPRequest creates a new HTTPRequest.
func NewHTTPRequest() *HTTPRequest {
return &HTTPRequest{}
Expand Down
50 changes: 49 additions & 1 deletion internal/native/types/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ import (
"fmt"
"sync"
"unsafe"

)

const (
Expand Down Expand Up @@ -174,6 +173,10 @@ type JsonState struct {
Dcap int
}

func (s JsonState) String() string {
return fmt.Sprintf(`{Vt: %d, Dv: %f, Iv: %d, Ep: %d}`, s.Vt, s.Dv, s.Iv, s.Ep)
}

type StateMachine struct {
Sp int
Vt [MAX_RECURSE]int64
Expand Down Expand Up @@ -204,6 +207,26 @@ type J2TState struct {
Extra J2TExtra
}

func (s J2TState) String() string {
name := ""
typ := 0
desc := (*tTypeDesc)(unsafe.Pointer(s.TypeDesc))
if desc != nil {
name = desc.name
typ = int(desc.ttype)
}
return fmt.Sprintf("{State: %x, JsonPos: %d, TypeDesc: %s(%d), Extra:%v}", s.State, s.JsonPos, name, typ, s.Extra)
}

type tTypeDesc struct
{
ttype uint8;
name string;
key *tTypeDesc;
elem *tTypeDesc;
st unsafe.Pointer;
};

func (self *J2TState) TdPointer() uintptr {
return uintptr(self.TypeDesc)
}
Expand Down Expand Up @@ -255,6 +278,31 @@ type J2TStateMachine struct {
FieldValueCache FieldValue
}

func (fsm *J2TStateMachine) String() string {
var vt1 *J2TState
if fsm.SP > 0 {
vt1 = &fsm.VT[fsm.SP-1]
}
var vt2 *J2TState
if fsm.SP > 1 {
vt2 = &fsm.VT[fsm.SP-2]
}
var svt int64
if fsm.SM.Sp > 0 {
svt = fsm.SM.Vt[fsm.SM.Sp-1]
}
return fmt.Sprintf(`SP: %d
JsonState: %v
VT[SP-1]: %v
VT[SP-2]: %v
SM.SP: %d
SM.VT[SP-1]: %x
ReqsCache: %v
KeyCache: %s
FieldCache: %v
FieldValue: %#v`, fsm.SP, fsm.JT, vt1, vt2, fsm.SM.Sp, svt, fsm.ReqsCache, fsm.KeyCache, fsm.FieldCache, fsm.FieldValueCache)
}

type FieldValue struct {
FieldID int32
ValBegin uint32
Expand Down

0 comments on commit b8450a5

Please sign in to comment.