From 0470d7c778a0ee5e3a6e39a7af1d2f4870ccf977 Mon Sep 17 00:00:00 2001 From: DEV Date: Thu, 1 Feb 2024 21:04:09 +0100 Subject: [PATCH] redefiniendo el builder --- app/main.go | 2 +- packs/js/type_map_packer.go | 13 +++++-------- packs/packer_state.go | 23 ++++++++++------------- 3 files changed, 16 insertions(+), 22 deletions(-) diff --git a/app/main.go b/app/main.go index 0b8bd35..e7e429d 100644 --- a/app/main.go +++ b/app/main.go @@ -66,7 +66,7 @@ func main() { */ //a := map[int]string {1:"344343",3:"4343434",5:"frtrtrtr"} - a := map[any]int {"{basd1/>":344343,"{casd2/>":4343434,"{asd41/>":67} + a := map[string]int {"{basd1/>":344343,"{casd2/>":4343434,"{asd41/>":67} js.RPacker(st,a,0) errs.Test(st.Error,true) fmt.Printf("Pack \n%s\n",st.Bytes()) diff --git a/packs/js/type_map_packer.go b/packs/js/type_map_packer.go index 3b4f608..813336b 100644 --- a/packs/js/type_map_packer.go +++ b/packs/js/type_map_packer.go @@ -27,7 +27,6 @@ import ( "activething.com/go/gogo/packs" "encoding" "reflect" - "sort" "strconv" ) @@ -68,27 +67,25 @@ func (m typeMapPacker) pack (s *packs.State, v reflect.Value, _ Flags) { ls := make([]typeMapEntry,v.Len()) if s.Level > startDetectingCyclesAfter { - pt := v.UnsafePointer() - if _,hs := s.Checks[pt]; hs { + if fn,ok := s.CheckCycle(v.UnsafePointer()); ok { + defer fn() + } else { s.SetError(packs.G.ErrRedundantPack) + return } - s.Checks[pt]=struct{}{} - defer delete(s.Checks,pt) } - for i:=0; mi.Next(); i++ { ls[i] = typeMapEntry{ val: mi.Value(), } - if er := m.keyStringer(&ls[i], mi.Key()); er != nil { s.SetError(er) return } } - sort.Slice(ls, func(i, j int) bool { return ls[i].key < ls[j].key }) + //sort.Slice(ls, func(i, j int) bool { return ls[i].key < ls[j].key }) s.Open ('{') for i:=0; i 0 { - for k,_ := range state.Checks { - delete(state.Checks,k) + if len(state.checks) > 0 { + for k,_ := range state.checks { + delete(state.checks,k) } } if atomic.LoadUint32(&G.poolsSem) == 1 { @@ -93,18 +93,15 @@ func (s *State) SetError(err error) bool { -func (s *State) AddCheck(ptr any) bool { - if _,hs := s.Checks[ptr]; hs { +func (s *State) CheckCycle (ptr any) (func(),bool) { + if _,hs := s.checks[ptr]; hs { s.SetError(G.ErrRedundantPack) - return false + return nil,false } - s.Checks[ptr]=struct{}{} - return true + s.checks[ptr]=struct{}{} + return func(){ delete(s.checks,ptr) },true } -func (s *State) DelCheck(ptr any) { - delete(s.Checks,ptr) -} func (s *State) Open(opener byte) {