@@ -550,33 +550,62 @@ type mapIter struct {
550
550
m * js.Object
551
551
keys * js.Object
552
552
i int
553
+ last * js.Object
553
554
}
554
555
555
556
func mapiterinit (t * rtype , m unsafe.Pointer ) unsafe.Pointer {
556
- return unsafe .Pointer (& mapIter {t , js .InternalObject (m ), js .Global .Call ("$keys" , js .InternalObject (m )), 0 })
557
+ return unsafe .Pointer (& mapIter {t , js .InternalObject (m ), js .Global .Call ("$keys" , js .InternalObject (m )), 0 , nil })
557
558
}
558
559
559
560
func mapiterkey (it unsafe.Pointer ) unsafe.Pointer {
560
561
iter := (* mapIter )(it )
561
- k := iter .keys .Index (iter .i )
562
- if k == js .Undefined {
563
- return nil
562
+ var kv * js.Object
563
+ if iter .last != nil {
564
+ kv = iter .last
565
+ } else {
566
+ // Compare the index and the size of the actual key set, and check if the iterator is already exhausted.
567
+ if iter .i >= js .Global .Call ("$keys" , iter .m ).Length () {
568
+ return nil
569
+ }
570
+ k := iter .keys .Index (iter .i )
571
+ kv = iter .m .Get (k .String ())
572
+
573
+ // Record the key-value pair for later accesses.
574
+ iter .last = kv
564
575
}
565
- return unsafe .Pointer (js .Global .Call ("$newDataPointer" , iter . m . Get ( k . String ()) .Get ("k" ), jsType (PtrTo (iter .t .Key ()))).Unsafe ())
576
+ return unsafe .Pointer (js .Global .Call ("$newDataPointer" , kv .Get ("k" ), jsType (PtrTo (iter .t .Key ()))).Unsafe ())
566
577
}
567
578
568
579
func mapitervalue (it unsafe.Pointer ) unsafe.Pointer {
569
580
iter := (* mapIter )(it )
570
- k := iter .keys .Index (iter .i )
571
- if k == js .Undefined {
572
- return nil
581
+ var kv * js.Object
582
+ if iter .last != nil {
583
+ kv = iter .last
584
+ } else {
585
+ if iter .i >= js .Global .Call ("$keys" , iter .m ).Length () {
586
+ return nil
587
+ }
588
+ k := iter .keys .Index (iter .i )
589
+ kv = iter .m .Get (k .String ())
590
+ iter .last = kv
573
591
}
574
- return unsafe .Pointer (js .Global .Call ("$newDataPointer" , iter . m . Get ( k . String ()) .Get ("v" ), jsType (PtrTo (iter .t .Elem ()))).Unsafe ())
592
+ return unsafe .Pointer (js .Global .Call ("$newDataPointer" , kv .Get ("v" ), jsType (PtrTo (iter .t .Elem ()))).Unsafe ())
575
593
}
576
594
577
595
func mapiternext (it unsafe.Pointer ) {
578
596
iter := (* mapIter )(it )
597
+ iter .last = nil
579
598
iter .i ++
599
+
600
+ // Skip iter until the key gets valid.
601
+ for iter .i < iter .keys .Length () {
602
+ k := iter .keys .Index (iter .i )
603
+ if iter .m .Get (k .String ()) != js .Undefined {
604
+ break
605
+ }
606
+ // The key is already deleted.
607
+ iter .i ++
608
+ }
580
609
}
581
610
582
611
func maplen (m unsafe.Pointer ) int {
0 commit comments