diff --git a/src/frame.cpp b/src/frame.cpp index 2144c687..09a8cde2 100644 --- a/src/frame.cpp +++ b/src/frame.cpp @@ -42,12 +42,14 @@ namespace pkpy{ int Frame::_exit_block(ValueStack* _s, int i){ auto type = co->blocks[i].type; - if(type==CodeBlockType::FOR_LOOP){ + if(type == CodeBlockType::FOR_LOOP){ _s->pop(); // pop the iterator // pop possible stack memory slots if(_s->top().type == kTpStackMemoryIndex){ int count = _s->top().as().count; - _s->_sp -= (count + 2); + PK_DEBUG_ASSERT(count < 0); + _s->_sp += count; + _s->_sp -= 2; // pop header and tail } }else if(type==CodeBlockType::CONTEXT_MANAGER){ _s->pop(); diff --git a/tests/99_bugs.py b/tests/99_bugs.py index 2ebe30b9..4c34213c 100644 --- a/tests/99_bugs.py +++ b/tests/99_bugs.py @@ -1,3 +1,11 @@ +# multi loop bug +out = [] +a = [1, 2] +for i in a: + for j in a: + out.append((i, j)) +assert (out == [(1, 1), (1, 2), (2, 1), (2, 2)]), out + # https://github.com/pocketpy/pocketpy/issues/37 mp = map(lambda x: x**2, [1, 2, 3, 4, 5] )