8000 vm: implement in, not in; py: changed args to Iterate · go-python/gpython@a20d443 · GitHub
[go: up one dir, main page]

Skip to content

Commit a20d443

Browse files
committed
vm: implement in, not in; py: changed args to Iterate
1 parent acaa5df commit a20d443

File tree

5 files changed

+48
-19
lines changed

5 files changed

+48
-19
lines changed

py/bytes.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,12 +104,13 @@ func BytesFromObject(x Object) Bytes {
104104
}
105105
// Otherwise iterate through the whatever converting it into ints
106106
b := Bytes{}
107-
Iterate(x, func(item Object) {
107+
Iterate(x, func(item Object) bool {
108108
value := IndexInt(item)
109109
if value < 0 || value >= 256 {
110110
panic(ExceptionNewf(ValueError, "bytes must be in range(0, 256)"))
111111
}
112112
b = append(b, byte(value))
113+
return false
113114
})
114115
return b
115116
}

py/list.go

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,14 @@ func (l *List) Extend(items []Object) {
7676
l.Items = append(l.Items, items...)
7777
}
7878

79+
// Extends the list with the sequence passed in
80+
func (l *List) ExtendSequence(seq Object) {
81+
Iterate(seq, func(item Object) bool {
82+
l.Append(item)
83+
return false
84+
})
85+
}
86+
7987
// Len of list
8088
func (l *List) Len() int {
8189
return len(l.Items)
@@ -115,9 +123,7 @@ func (l *List) M__setitem__(key, value Object) Object {
115123
tail := make([]Object, len(tailSlice))
116124
copy(tail, tailSlice)
117125
l.Items = l.Items[:start]
118-
Iterate(value, func(item Object) {
119-
l.Append(item)
120-
})
126+
l.ExtendSequence(value)
121127
l.Items = append(l.Items, tail...)
122128
} else {
123129
newItems := SequenceTuple(value)

py/sequence.go

Lines changed: 33 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,9 @@ func SequenceTuple(v Object) Tuple {
1111
return Tuple(x.Items).Copy()
1212
default:
1313
t := Tuple{}
14-
Iterate(v, func(item Object) {
14+
Iterate(v, func(item Object) bool {
1515
t = append(t, item)
16+
return false
1617
})
1718
return t
1819
}
@@ -27,9 +28,7 @@ func SequenceList(v Object) *List {
2728
return x.Copy()
2829
default:
2930
l := NewList()
30-
Iterate(v, func(item Object) {
31-
l.Append(item)
32-
})
31+
l.ExtendSequence(v)
3332
return l
3433
}
3534
}
@@ -61,25 +60,34 @@ func Next(self Object) (obj Object, finished Object) {
6160
}
6261

6362
// Create an iterator from obj and iterate the iterator until finished
64-
// calling the function passed in on each object
65-
func Iterate(obj Object, fn func(Object)) {
63+
// calling the function passed in on each object. The iteration is
64+
// finished if the function returns true
65+
func Iterate(obj Object, fn func(Object) bool) {
6666
// Some easy cases
6767
switch x := obj.(type) {
6868
case Tuple:
6969
for _, item := range x {
70-
fn(item)
70+
if fn(item) {
71+
break
72+
}
7173
}
7274
case *List:
7375
for _, item := range x.Items {
74-
fn(item)
76+
if fn(item) {
77+
break
78+
}
7579
}
7680
case String:
7781
for _, item := range x {
78-
fn(String(item))
82+
if fn(String(item)) {
83+
break
84+
}
7985
}
8086
case Bytes:
8187
for _, item := range x {
82-
fn(Int(item))
88+
if fn(Int(item)) {
89+
break
90+
}
8391
}
8492
default:
8593
iterator := Iter(obj)
@@ -88,7 +96,9 @@ func Iterate(obj Object, fn func(Object)) {
8896
if finished != nil {
8997
break
9098
}
91-
fn(item)
99+
if fn(item) {
100+
break
101+
}
92102
}
93103
}
94104
}
@@ -103,3 +113,15 @@ func Send(self, value Object) Object {
103113

104114
panic(ExceptionNewf(TypeError, "'%s' object doesn't have send method", self.Type().Name))
105115
}
116+
117+
// SequenceContains returns True if obj is in seq
118+
func SequenceContains(seq, obj Object) (found bool) {
119+
Iterate(seq, func(item Object) bool {
120+
if Eq(item, obj) == True {
121+
found = true
122+
return true
123+
}
124+
return false
125+
})
126+
return
127+
}

vm/eval.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -943,9 +943,9 @@ func do_COMPARE_OP(vm *Vm, opname int32) {
943943
case PyCmp_GE:
944944
r = py.Ge(a, b)
945945
case PyCmp_IN:
946-
vm.NotImplemented("COMPARE_OP PyCmp_IN", opname)
946+
r = py.NewBool(py.SequenceContains(b, a))
947947
case PyCmp_NOT_IN:
948-
vm.NotImplemented("COMPARE_OP PyCmp_NOT_IN", opname)
948+
r = py.NewBool(!py.SequenceContains(b, a))
949949
case PyCmp_IS:
950950
r = py.NewBool(a == b)
951951
case PyCmp_IS_NOT:

vm/tests/ops.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,8 @@
8787
assert _10 > _2
8888
assert _10 >= _2
8989
assert _2 >= _2
90-
# FIXME in
91-
# FIXME not in
90+
assert _2 in (1,2,3)
91+
assert _100 not in (1,2,3)
9292
assert True is True
9393
assert True is not False
9494
# FIXME EXC_MATCH

0 commit comments

Comments
 (0)
0