Skip to content

Commit 250c084

Browse files
committed
compiler/natives/src/reflect: Fix failure tests
1 parent 3a29d97 commit 250c084

File tree

4 files changed

+51
-24
lines changed

4 files changed

+51
-24
lines changed

compiler/gopherjspkg/fs_vfsdata.go

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

compiler/natives/fs_vfsdata.go

Lines changed: 8 additions & 14 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

compiler/natives/src/reflect/reflect.go

Lines changed: 38 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -550,33 +550,62 @@ type mapIter struct {
550550
m *js.Object
551551
keys *js.Object
552552
i int
553+
last *js.Object
553554
}
554555

555556
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})
557558
}
558559

559560
func mapiterkey(it unsafe.Pointer) unsafe.Pointer {
560561
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
564575
}
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())
566577
}
567578

568579
func mapitervalue(it unsafe.Pointer) unsafe.Pointer {
569580
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
573591
}
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())
575593
}
576594

577595
func mapiternext(it unsafe.Pointer) {
578596
iter := (*mapIter)(it)
597+
iter.last = nil
579598
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+
}
580609
}
581610

582611
func maplen(m unsafe.Pointer) int {

compiler/natives/src/reflect/reflect_test.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,10 @@ func TestStructOfWithInterface(t *testing.T) {
9191
t.Skip("StructOf")
9292
}
9393

94+
func TestStructOfTooManyFields(t *testing.T) {
95+
t.Skip("StructOf")
96+
}
97+
9498
var deepEqualTests = []DeepEqualTest{
9599
// Equalities
96100
{nil, nil, true},

0 commit comments

Comments
 (0)