@@ -620,21 +620,24 @@ func makechan(typ *rtype, size int) (ch unsafe.Pointer) {
620620}
621621
622622func makemap (t * rtype , cap int ) (m unsafe.Pointer ) {
623- return unsafe .Pointer (js .Global .Get ("Object " ).New ().Unsafe ())
623+ return unsafe .Pointer (js .Global .Get ("Map " ).New ().Unsafe ())
624624}
625625
626- func keyFor (t * rtype , key unsafe.Pointer ) (* js.Object , string ) {
626+ func keyFor (t * rtype , key unsafe.Pointer ) (* js.Object , * js. Object ) {
627627 kv := js .InternalObject (key )
628628 if kv .Get ("$get" ) != js .Undefined {
629629 kv = kv .Call ("$get" )
630630 }
631- k := jsType (t .Key ()).Call ("keyFor" , kv ). String ()
631+ k := jsType (t .Key ()).Call ("keyFor" , kv )
632632 return kv , k
633633}
634634
635635func mapaccess (t * rtype , m , key unsafe.Pointer ) unsafe.Pointer {
636+ if ! js .InternalObject (m ).Bool () {
637+ return nil // nil map
638+ }
636639 _ , k := keyFor (t , key )
637- entry := js .InternalObject (m ).Get ( k )
640+ entry := js .InternalObject (m ).Call ( "get" , k )
638641 if entry == js .Undefined {
639642 return nil
640643 }
@@ -653,12 +656,15 @@ func mapassign(t *rtype, m, key, val unsafe.Pointer) {
653656 entry := js .Global .Get ("Object" ).New ()
654657 entry .Set ("k" , kv )
655658 entry .Set ("v" , jsVal )
656- js .InternalObject (m ).Set ( k , entry )
659+ js .InternalObject (m ).Call ( "set" , k , entry )
657660}
658661
659662func mapdelete (t * rtype , m unsafe.Pointer , key unsafe.Pointer ) {
660663 _ , k := keyFor (t , key )
661- js .InternalObject (m ).Delete (k )
664+ if ! js .InternalObject (m ).Bool () {
665+ return // nil map
666+ }
667+ js .InternalObject (m ).Call ("delete" , k )
662668}
663669
664670// TODO(nevkonatkte): The following three "faststr" implementations are meant to
@@ -696,7 +702,8 @@ type hiter struct {
696702func (iter * hiter ) skipUntilValidKey () {
697703 for iter .i < iter .keys .Length () {
698704 k := iter .keys .Index (iter .i )
699- if iter .m .Get (k .String ()) != js .Undefined {
705+ entry := iter .m .Call ("get" , k )
706+ if entry != js .Undefined {
700707 break
701708 }
702709 // The key is already deleted. Move on the next item.
@@ -705,10 +712,19 @@ func (iter *hiter) skipUntilValidKey() {
705712}
706713
707714func mapiterinit (t * rtype , m unsafe.Pointer , it * hiter ) {
715+ mapObj := js .InternalObject (m )
716+ keys := js .Global .Get ("Array" ).New ()
717+ if mapObj .Get ("keys" ) != js .Undefined {
718+ keysIter := mapObj .Call ("keys" )
719+ if mapObj .Get ("keys" ) != js .Undefined {
720+ keys = js .Global .Get ("Array" ).Call ("from" , keysIter )
721+ }
722+ }
723+
708724 * it = hiter {
709725 t : t ,
710- m : js . InternalObject ( m ) ,
711- keys : js . Global . Call ( "$ keys" , js . InternalObject ( m )) ,
726+ m : mapObj ,
727+ keys : keys ,
712728 i : 0 ,
713729 last : nil ,
714730 }
@@ -724,7 +740,7 @@ func mapiterkey(it *hiter) unsafe.Pointer {
724740 return nil
725741 }
726742 k := it .keys .Index (it .i )
727- kv = it .m .Get ( k . String () )
743+ kv = it .m .Call ( "get" , k )
728744
729745 // Record the key-value pair for later accesses.
730746 it .last = kv
@@ -742,7 +758,7 @@ func mapiterelem(it *hiter) unsafe.Pointer {
742758 return nil
743759 }
744760 k := it .keys .Index (it .i )
745- kv = it .m .Get ( k . String () )
761+ kv = it .m .Call ( "get" , k )
746762 it .last = kv
747763 }
748764 return unsafe .Pointer (js .Global .Call ("$newDataPointer" , kv .Get ("v" ), jsType (PtrTo (it .t .Elem ()))).Unsafe ())
@@ -754,7 +770,7 @@ func mapiternext(it *hiter) {
754770}
755771
756772func maplen (m unsafe.Pointer ) int {
757- return js .Global . Call ( "$keys" , js . InternalObject ( m )). Length ()
773+ return js .InternalObject ( m ). Get ( "size" ). Int ()
758774}
759775
760776func cvtDirect (v Value , typ Type ) Value {
@@ -1379,7 +1395,7 @@ func (v Value) Len() int {
13791395 case Chan :
13801396 return v .object ().Get ("$buffer" ).Get ("length" ).Int ()
13811397 case Map :
1382- return js . Global . Call ( "$keys" , v . object ()). Length ()
1398+ return v . object (). Get ( "size" ). Int ()
13831399 default :
13841400 panic (& ValueError {"reflect.Value.Len" , k })
13851401 }
0 commit comments