From 5b3e6a4e1ca7d557524100ffb348321298a60c44 Mon Sep 17 00:00:00 2001 From: icarus-ai <82353054+icarus-ai@users.noreply.github.com> Date: Sat, 11 Apr 2026 18:15:45 +0800 Subject: [PATCH] fix: map nil --- cmd/protoc-gen-golite/main.go | 1 + go.mod | 13 ++++++----- go.sum | 40 ++++++++++++++++++++------------- internal/runtime_reflect/map.go | 12 ++++++++++ proto/map.go | 24 +++++++++++++------- 5 files changed, 61 insertions(+), 29 deletions(-) diff --git a/cmd/protoc-gen-golite/main.go b/cmd/protoc-gen-golite/main.go index fd852d2..5b38d85 100644 --- a/cmd/protoc-gen-golite/main.go +++ b/cmd/protoc-gen-golite/main.go @@ -34,6 +34,7 @@ // both proto2 and proto3 versions of the protocol buffer language. // // For more information about the usage of this plugin, see: +// // https://developers.google.com/protocol-buffers/docs/reference/go-generated package main diff --git a/go.mod b/go.mod index 8dfd29b..54d4079 100644 --- a/go.mod +++ b/go.mod @@ -1,15 +1,18 @@ module github.com/RomiChan/protobuf -go 1.18 +go 1.26 require ( github.com/RomiChan/syncx v0.0.0-20240418144900-b7402ffdebc7 - github.com/stretchr/testify v1.7.0 - google.golang.org/protobuf v1.27.1 + github.com/stretchr/testify v1.11.1 + google.golang.org/protobuf v1.36.11 ) require ( - github.com/davecgh/go-spew v1.1.0 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/kr/pretty v0.3.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c // indirect + github.com/rogpeppe/go-internal v1.14.1 // indirect + gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 56f1340..a38fd33 100644 --- a/go.sum +++ b/go.sum @@ -1,21 +1,29 @@ github.com/RomiChan/syncx v0.0.0-20240418144900-b7402ffdebc7 h1:S/ferNiehVjNaBMNNBxUjLtVmP/YWD6Yh79RfPv4ehU= github.com/RomiChan/syncx v0.0.0-20240418144900-b7402ffdebc7/go.mod h1:vD7Ra3Q9onRtojoY5sMCLQ7JBgjUsrXDnDKyFxqpf9w= -github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -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= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= +google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/internal/runtime_reflect/map.go b/internal/runtime_reflect/map.go index b682acc..9384174 100644 --- a/internal/runtime_reflect/map.go +++ b/internal/runtime_reflect/map.go @@ -73,12 +73,24 @@ type hiter struct { checkBucket uintptr } +// ***** ***** king add 20260331 ****** ***** + +// 传入map的地址 不能为*map +func GetSize(m unsafe.Pointer) int { return reflect_maplen(m) } + +//go:noescape +//go:linkname reflect_maplen reflect.maplen +func reflect_maplen(m unsafe.Pointer) int + +// ***** ***** king add 20260331 ****** ***** + //go:noescape //go:linkname makemap reflect.makemap func makemap(t unsafe.Pointer, cap int) unsafe.Pointer // m escapes into the return value, but the caller of mapiterinit // doesn't let the return value escape. +// //go:noescape //go:linkname mapiterinit runtime.mapiterinit func mapiterinit(t unsafe.Pointer, m unsafe.Pointer, it *hiter) diff --git a/proto/map.go b/proto/map.go index 38e3b8b..2d1b675 100644 --- a/proto/map.go +++ b/proto/map.go @@ -27,6 +27,8 @@ func (w *walker) mapCodec(t reflect.Type, f *mapField) *codec { return m } +// ??? map len + func mapSizeFuncOf(t reflect.Type, f *mapField) sizeFunc { mapTagSize := sizeOfVarint(f.wiretag) keyCodec := f.keyField.codec @@ -36,11 +38,14 @@ func mapSizeFuncOf(t reflect.Type, f *mapField) sizeFunc { if p == nil { return 0 } + if p = *(*unsafe.Pointer)(p); p == nil { + return 0 + } // king add 20260331 // *map => map // map == nil + if GetSize(p) == 0 { + return 0 + } // king add 20260331 // map.len == 0, - p = *(*unsafe.Pointer)(p) - - n := 0 - m := MapIter{} + n, m := 0, MapIter{} defer m.Done() for m.Init(pointer(t), p); m.HasNext(); m.Next() { @@ -65,11 +70,14 @@ func mapEncodeFuncOf(t reflect.Type, f *mapField) encodeFunc { if p == nil { return b } - p = *(*unsafe.Pointer)(p) - - origLen := len(b) + if p = *(*unsafe.Pointer)(p); p == nil { + return b + } // king add 20260331 // *map => map // map == nil + if GetSize(p) == 0 { + return b + } // king add 20260331 // map.len == 0 不写入buf - m := MapIter{} + origLen, m := len(b), MapIter{} defer m.Done() for m.Init(pointer(t), p); m.HasNext(); m.Next() {