This is an automated email from the ASF dual-hosted git repository.

wongoo pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/dubbo-go-hessian2.git


The following commit(s) were added to refs/heads/master by this push:
     new 57240d6  convert pointer to encode (#289)
57240d6 is described below

commit 57240d6215bbf487b30cab2f6aa0bf351dc590c9
Author: binbin.zhang <[email protected]>
AuthorDate: Tue Nov 16 14:37:06 2021 +0800

    convert pointer to encode (#289)
    
    Co-authored-by: sanxun0325 <bbz17640380550.com>
---
 codec.go       |  7 +++++++
 codec_test.go  | 13 +++++++++++++
 encode.go      |  6 +++++-
 encode_test.go | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++
 serialize.go   |  4 ++--
 5 files changed, 77 insertions(+), 3 deletions(-)

diff --git a/codec.go b/codec.go
index 5087efa..425468c 100644
--- a/codec.go
+++ b/codec.go
@@ -476,3 +476,10 @@ func ConvertSliceValueType(destTyp reflect.Type, v 
reflect.Value) (reflect.Value
 
        return sl, nil
 }
+
+//PackPtrInterface pack struct interface to pointer interface
+func PackPtrInterface(s interface{}, value reflect.Value) interface{} {
+       vv := reflect.New(reflect.TypeOf(s))
+       vv.Elem().Set(value)
+       return vv.Interface()
+}
diff --git a/codec_test.go b/codec_test.go
index a4cdd1b..b2dd937 100644
--- a/codec_test.go
+++ b/codec_test.go
@@ -18,9 +18,14 @@
 package hessian
 
 import (
+       "reflect"
        "testing"
 )
 
+import (
+       "github.com/stretchr/testify/assert"
+)
+
 // go test -v -run TestPackUint16
 func TestPackUint16(t *testing.T) {
        // var arr []byte
@@ -57,3 +62,11 @@ func TestPackInt64(t *testing.T) {
                t.Fatalf("v:0X%d, pack-unpack value:0X%x\n", v, r)
        }
 }
+
+func TestPackPtrInterface(t *testing.T) {
+       v := "struct"
+       vv := reflect.ValueOf(v)
+       sPointer, ok := PackPtrInterface(v, vv).(*string)
+       assert.True(t, ok)
+       assert.True(t, *sPointer == "struct")
+}
diff --git a/encode.go b/encode.go
index c26832e..0daf3e0 100644
--- a/encode.go
+++ b/encode.go
@@ -160,7 +160,11 @@ func (e *Encoder) Encode(v interface{}) error {
                switch t.Kind() {
                case reflect.Struct:
                        vv := reflect.ValueOf(v)
-                       vv = UnpackPtr(vv)
+                       if vv.Kind() != reflect.Ptr {
+                               v = PackPtrInterface(v, vv)
+                       } else {
+                               vv = UnpackPtr(vv)
+                       }
                        if !vv.IsValid() {
                                e.buffer = EncNull(e.buffer)
                                return nil
diff --git a/encode_test.go b/encode_test.go
index 543452f..6db3a98 100644
--- a/encode_test.go
+++ b/encode_test.go
@@ -87,3 +87,53 @@ func testSimpleEncode(t *testing.T, v interface{}) {
        err := e.Encode(v)
        assert.Nil(t, err)
 }
+
+type BenchData struct {
+       name string
+}
+
+func (b *BenchData) JavaClassName() string {
+       return "test.bench.BenchData"
+}
+
+// Benchmark_Struct_Encode      2231869               506.8 ns/op           
560 B/op          7 allocs/op
+func Benchmark_Struct_Encode(b *testing.B) {
+       b.ReportAllocs()
+       b.ResetTimer()
+       for i := 0; i < b.N; i++ {
+               NewEncoder().Encode(BenchData{})
+       }
+}
+
+// Benchmark_Pointer_Encode     2565778               476.1 ns/op           
560 B/op          7 allocs/op
+func Benchmark_Pointer_Encode(b *testing.B) {
+       b.ReportAllocs()
+       b.ResetTimer()
+       for i := 0; i < b.N; i++ {
+               NewEncoder().Encode(&BenchData{})
+       }
+}
+
+// Benchmark_Struct_Encode_8            2307214               519.4 ns/op      
     560 B/op          7 allocs/op
+func Benchmark_Struct_Encode_8(b *testing.B) {
+       b.ReportAllocs()
+       b.ResetTimer()
+       b.SetParallelism(8)
+       b.RunParallel(func(pb *testing.PB) {
+               for pb.Next() {
+                       NewEncoder().Encode(BenchData{})
+               }
+       })
+}
+
+// Benchmark_Pointer_Encode_8           2460842               476.7 ns/op      
     560 B/op          7 allocs/op
+func Benchmark_Pointer_Encode_8(b *testing.B) {
+       b.ReportAllocs()
+       b.ResetTimer()
+       b.SetParallelism(8)
+       b.RunParallel(func(pb *testing.PB) {
+               for pb.Next() {
+                       NewEncoder().Encode(&BenchData{})
+               }
+       })
+}
diff --git a/serialize.go b/serialize.go
index b57702b..ca738ea 100644
--- a/serialize.go
+++ b/serialize.go
@@ -69,7 +69,7 @@ func (IntegerSerializer) DecObject(d *Decoder, typ 
reflect.Type, cls *classInfo)
 }
 
 func (IntegerSerializer) EncObject(e *Encoder, v POJO) error {
-       bigInt, ok := v.(bigInteger)
+       bigInt, ok := v.(*bigInteger)
        if !ok {
                return e.encObject(v)
        }
@@ -80,7 +80,7 @@ func (IntegerSerializer) EncObject(e *Encoder, v POJO) error {
 type DecimalSerializer struct{}
 
 func (DecimalSerializer) EncObject(e *Encoder, v POJO) error {
-       decimal, ok := v.(big.Decimal)
+       decimal, ok := v.(*big.Decimal)
        if !ok {
                return e.encObject(v)
        }

Reply via email to