/*
 * Copyright (c) 2013, Regents of the University of California
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met: 
 * 
 * 1. Redistributions of source code must retain the above copyright notice, this
 *    list of conditions and the following disclaimer. 
 * 2. Redistributions in binary form must reproduce the above copyright notice,
 *    this list of conditions and the following disclaimer in the documentation
 *    and/or other materials provided with the distribution. 
 * 
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
package edu.uci.python.nodes.generator;

import com.oracle.truffle.api.frame.*;
import com.oracle.truffle.api.nodes.*;

import edu.uci.python.nodes.*;
import edu.uci.python.nodes.statements.*;
import edu.uci.python.runtime.datatypes.*;
import edu.uci.python.runtime.exception.*;

public class GeneratorBlockNode extends BlockNode {

    protected int index;

    public GeneratorBlockNode(PNode[] statements) {
        super(statements);
    }

    @ExplodeLoop
    @Override
    public Object execute(VirtualFrame frame) {
        try {
            while (index < statements.length) {
                statements[index].executeVoid(frame);
                index++;
            }
        } catch (StopIterationException e) {
            index = 0;
            throw e;
        }

        index = 0;
        return PNone.NONE;
    }

    public static final class InnerGeneratorBlockNode extends GeneratorBlockNode {

        public InnerGeneratorBlockNode(PNode[] statements) {
            super(statements);
        }

        @ExplodeLoop
        @Override
        public Object execute(VirtualFrame frame) {
            while (index < statements.length) {
                statements[index++].executeVoid(frame);
            }

            index = 0;
            return PNone.NONE;
        }
    }

}

@@ -1939,36 +1939,41 @@
             
-while (index
+for (int i = 0; i
  %3C statement
@@ -1972,35 +1972,122 @@
 tatements.length
-) %7B
+; i++) %7B%0A                if (i %3C index) %7B%0A                    continue;%0A                %7D%0A
 %0A               
@@ -2099,20 +2099,16 @@
 ements%5Bi
-ndex
 %5D.execut
@@ -2607,20 +2607,25 @@
     
-while (index
+for (int i = 0; i
  %3C s
@@ -2640,20 +2640,132 @@
 s.length
+; i++
 ) %7B%0A
+                if (i %3C index) %7B%0A                    continue;%0A                %7D%0A%0A                index++;%0A
         
@@ -2784,22 +2784,16 @@
 ements%5Bi
-ndex++
 %5D.execut

Fix Frame escapes error when compiling GeneratorBlockNodes