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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy