Skip to content

Commit 4c0c2ee

Browse files
committed
implement reflect.Select (fixes #420)
1 parent c48c2f7 commit 4c0c2ee

File tree

2 files changed

+22
-4
lines changed

2 files changed

+22
-4
lines changed

compiler/natives/reflect/reflect.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1177,6 +1177,28 @@ func chansend(t *rtype, ch unsafe.Pointer, val unsafe.Pointer, nb bool) bool {
11771177
return true
11781178
}
11791179

1180+
func rselect(rselects []runtimeSelect) (chosen int, recvOK bool) {
1181+
comms := make([][]interface{}, len(rselects))
1182+
for i, s := range rselects {
1183+
switch ChanDir(s.dir) {
1184+
case 0:
1185+
comms[i] = []interface{}{}
1186+
case RecvDir:
1187+
comms[i] = []interface{}{js.InternalObject(s.ch)}
1188+
case SendDir:
1189+
comms[i] = []interface{}{js.InternalObject(s.ch), js.InternalObject(s.val).Call("$get")}
1190+
}
1191+
}
1192+
selectRes := selectHelper(comms)
1193+
c := selectRes.Index(0).Int()
1194+
if ChanDir(rselects[c].dir) == RecvDir {
1195+
recvRes := selectRes.Index(1)
1196+
js.InternalObject(rselects[c].val).Call("$set", recvRes.Index(0))
1197+
return c, recvRes.Index(1).Bool()
1198+
}
1199+
return c, false
1200+
}
1201+
11801202
func DeepEqual(a1, a2 interface{}) bool {
11811203
i1 := js.InternalObject(a1)
11821204
i2 := js.InternalObject(a2)

compiler/natives/reflect/reflect_test.go

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,6 @@ func TestAlignment(t *testing.T) {
1010
t.Skip()
1111
}
1212

13-
func TestSelect(t *testing.T) {
14-
t.Skip()
15-
}
16-
1713
func TestSliceOverflow(t *testing.T) {
1814
t.Skip()
1915
}

0 commit comments

Comments
 (0)