Skip to content

Commit fd987bf

Browse files
committed
stfpy: Fixed wrong __next__ implementation
Iterator was falsely advanced every time before accessed. So the first record will be always ignored. Moreover, segmentation fault will be raised if the container is empty.
1 parent a348e45 commit fd987bf

File tree

4 files changed

+29
-29
lines changed

4 files changed

+29
-29
lines changed

stfpy/stfpy/stf_branch_reader.pyx

+4-4
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,11 @@ include "stfpy/stf_lib/stf_reader_constants.pxi"
99

1010
cdef class STFBranchReaderIterator:
1111
def __next__(self):
12-
preincrement(self.c_it)
13-
if self.c_it != self.c_end_it:
14-
return STFBranch._construct(dereference(self.c_it))
15-
else:
12+
if self.c_it == self.c_end_it:
1613
raise StopIteration
14+
value = STFBranch._construct(dereference(self.c_it))
15+
preincrement(self.c_it)
16+
return value
1717

1818
cdef class STFBranchReader:
1919
def __cinit__(self,

stfpy/stfpy/stf_inst.pxd

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# distutils: language = c++
22

3-
from cython.operator cimport dereference, preincrement
3+
from cython.operator cimport dereference
44
from stfpy.stf_lib.stf_record_types cimport VectorValueType as _VectorValueType, VectorValueTypeIterator as _VectorValueTypeIterator
55
from stfpy.stf_lib.stf_inst cimport EventDataVector as _EventDataVector, EventDataVectorIterator as _EventDataVectorIterator, EventVectorIterator as _EventVectorIterator, OperandVectorIterator as _OperandVectorIterator, MemAccessVectorIterator as _MemAccessVectorIterator, Event as _Event, Operand as _Operand, MemAccess as _MemAccess, STFInst as _STFInst
66

stfpy/stfpy/stf_inst.pyx

+20-20
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@ from stfpy.stf_record_map import STFRecordMap, STFRecordMapSmallVector
88

99
cdef class EventDataVectorIterator:
1010
def __next__(self):
11-
preincrement(self.c_it)
12-
if self.c_it != self.c_end_it:
13-
return dereference(self.c_it)
14-
else:
11+
if self.c_it == self.c_end_it:
1512
raise StopIteration
13+
value = dereference(self.c_it)
14+
preincrement(self.c_it)
15+
return value
1616

1717
cdef class EventDataVector:
1818
def __iter__(self):
@@ -54,11 +54,11 @@ cdef class Event:
5454

5555
cdef class EventVectorIterator:
5656
def __next__(self):
57-
preincrement(self.c_it)
58-
if self.c_it != self.c_end_it:
59-
return Event._construct(dereference(self.c_it))
60-
else:
57+
if self.c_it == self.c_end_it:
6158
raise StopIteration
59+
value = Event._construct(dereference(self.c_it))
60+
preincrement(self.c_it)
61+
return value
6262

6363
cdef class EventVector:
6464
def __iter__(self):
@@ -75,11 +75,11 @@ cdef class EventVector:
7575

7676
cdef class VectorValueTypeIterator:
7777
def __next__(self):
78-
preincrement(self.c_it)
79-
if self.c_it != self.c_end_it:
80-
return dereference(self.c_it)
81-
else:
78+
if self.c_it == self.c_end_it:
8279
raise StopIteration
80+
value = dereference(self.c_it)
81+
preincrement(self.c_it)
82+
return value
8383

8484
cdef class VectorValueType:
8585
def __iter__(self):
@@ -115,11 +115,11 @@ cdef class Operand:
115115

116116
cdef class OperandVectorIterator:
117117
def __next__(self):
118-
preincrement(self.c_it)
119-
if self.c_it != self.c_end_it:
120-
return Operand._construct(dereference(self.c_it))
121-
else:
118+
if self.c_it == self.c_end_it:
122119
raise StopIteration
120+
value = Operand._construct(dereference(self.c_it))
121+
preincrement(self.c_it)
122+
return value
123123

124124
cdef class OperandVector:
125125
def __iter__(self):
@@ -152,11 +152,11 @@ cdef class MemAccess:
152152

153153
cdef class MemAccessVectorIterator:
154154
def __next__(self):
155-
preincrement(self.c_it)
156-
if self.c_it != self.c_end_it:
157-
return MemAccess._construct(dereference(self.c_it))
158-
else:
155+
if self.c_it == self.c_end_it:
159156
raise StopIteration
157+
value = MemAccess._construct(dereference(self.c_it))
158+
preincrement(self.c_it)
159+
return value
160160

161161
cdef class MemAccessVector:
162162
def __iter__(self):

stfpy/stfpy/stf_inst_reader.pyx

+4-4
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,11 @@ include "stfpy/stf_lib/stf_reader_constants.pxi"
99

1010
cdef class STFInstReaderIterator:
1111
def __next__(self):
12-
preincrement(self.c_it)
13-
if self.c_it != self.c_end_it:
14-
return STFInst._construct(dereference(self.c_it))
15-
else:
12+
if self.c_it == self.c_end_it:
1613
raise StopIteration
14+
value = STFInst._construct(dereference(self.c_it))
15+
preincrement(self.c_it)
16+
return value
1717

1818
cdef class STFInstReader:
1919
def __cinit__(self,

0 commit comments

Comments
 (0)