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

alexstocks 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 4055e70  notify all ref holder at the end of decoding
     new 542bcf0  Merge pull request #324 from wongoo/fix-issue-323
4055e70 is described below

commit 4055e70d154cfc1a2392e29ce4a2edf891fadd29
Author: wongoo <[email protected]>
AuthorDate: Wed Oct 19 19:35:34 2022 +0800

    notify all ref holder at the end of decoding
---
 decode.go      | 16 +++++++++++++---
 decode_test.go | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 ref.go         |  2 ++
 3 files changed, 69 insertions(+), 3 deletions(-)

diff --git a/decode.go b/decode.go
index d0b67a8..0e7932e 100644
--- a/decode.go
+++ b/decode.go
@@ -30,8 +30,9 @@ import (
 
 // Decoder struct
 type Decoder struct {
-       reader *bufio.Reader
-       refs   []interface{}
+       reader     *bufio.Reader
+       refs       []interface{}
+       refHolders []*_refHolder
        // record type refs, both list and map need it
        typeRefs      *TypeRefs
        classInfoList []*ClassInfo
@@ -236,7 +237,16 @@ func (d *Decoder) decMapType() (reflect.Type, error) {
 
 // Decode parse hessian data, and ensure the reflection value unpacked
 func (d *Decoder) Decode() (interface{}, error) {
-       return EnsureInterface(d.DecodeValue())
+       v, err := d.DecodeValue()
+       if err != nil {
+               return nil, err
+       }
+
+       for _, holder := range d.refHolders {
+               holder.notify()
+       }
+
+       return EnsureRawAny(v), nil
 }
 
 func (d *Decoder) Buffered() int { return d.reader.Buffered() }
diff --git a/decode_test.go b/decode_test.go
index 99db40b..ccdd092 100644
--- a/decode_test.go
+++ b/decode_test.go
@@ -30,6 +30,7 @@ import (
        "os/exec"
        "reflect"
        "testing"
+       "unsafe"
 )
 
 import (
@@ -257,3 +258,56 @@ func TestIssue299HessianDecode(t *testing.T) {
                return
        }
 }
+
+type Issue323B struct {
+       Num int
+}
+
+func (b *Issue323B) JavaClassName() string {
+       return "B"
+}
+
+type Issue323BB struct {
+       List1 []*Issue323B
+       List2 []*Issue323B
+}
+
+func (bb *Issue323BB) JavaClassName() string {
+       return "BB"
+}
+
+func TestIssue323(t *testing.T) {
+       RegisterPOJO(&Issue323B{})
+       RegisterPOJO(&Issue323BB{})
+       a1 := &Issue323B{
+               Num: 1,
+       }
+       a2 := &Issue323B{
+               Num: 2,
+       }
+       list := []*Issue323B{a1, a2}
+       b := &Issue323BB{
+               List1: list,
+               List2: list,
+       }
+       e := NewEncoder()
+       err := e.Encode(b)
+       assert.Nil(t, err)
+       fmt.Println(b)
+
+       d := NewDecoder(e.Buffer())
+       res, err := d.Decode()
+       assert.Nil(t, err)
+       fmt.Println(res)
+       assert.True(t, reflect.DeepEqual(b, res))
+
+       decodB, ok := res.(*Issue323BB)
+       if !ok {
+               t.Log("res is not Issue323BB")
+               t.FailNow()
+       }
+
+       // list1 and list2 should be reference to the same one.
+       assert.Equal(t, unsafe.Pointer(reflect.ValueOf(decodB.List1).Pointer()),
+               unsafe.Pointer(reflect.ValueOf(decodB.List2).Pointer()))
+}
diff --git a/ref.go b/ref.go
index 09cd380..e23d688 100644
--- a/ref.go
+++ b/ref.go
@@ -78,6 +78,8 @@ func (d *Decoder) appendRefs(v interface{}) *_refHolder {
                }
                // pack holder value
                v = reflect.ValueOf(holder)
+
+               d.refHolders = append(d.refHolders, holder)
        }
 
        d.refs = append(d.refs, v)

Reply via email to