1
0
blueloveTH 1 жил өмнө
parent
commit
8f34024833
2 өөрчлөгдсөн 12 нэмэгдсэн , 2 устгасан
  1. 4 2
      src/frame.cpp
  2. 8 0
      tests/99_bugs.py

+ 4 - 2
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<StackMemory>().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();

+ 8 - 0
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]  )