text: /*
   * Copyright (c) 2017, 2020, Oracle and/or its affiliates.
   * Copyright (c) 2014, 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 HOLDER 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 com.oracle.graal.python.nodes.control;
  
  import com.oracle.graal.python.nodes.object.IsBuiltinClassProfile;
  import com.oracle.graal.python.nodes.statement.StatementNode;
  import com.oracle.graal.python.runtime.exception.PException;
  import com.oracle.truffle.api.frame.VirtualFrame;
  
  public final class StopIterationTargetNode extends StatementNode {
  
      @Child private StatementNode tryPart;
      @Child private StatementNode catchPart;
  
      @Child private IsBuiltinClassProfile errorProfile = IsBuiltinClassProfile.create();
  
      public StopIterationTargetNode(StatementNode tryPart, StatementNode catchPart) {
          this.tryPart = tryPart;
          this.catchPart = catchPart;
      }
  
      public StatementNode getTryPart() {
          return tryPart;
      }
  
      public StatementNode getCatchPart() {
          return catchPart;
      }
  
      @Override
      public void executeVoid(VirtualFrame frame) {
          try {
              tryPart.executeVoid(frame);
          } catch (PException ex) {
              ex.expectStopIteration(errorProfile);
              catchPart.executeVoid(frame);
          }
      }
  }
  