1 /*
   2  * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 package jdk.nashorn.internal.ir;
  27 
  28 import java.util.Objects;
  29 import jdk.nashorn.internal.codegen.Label;
  30 import jdk.nashorn.internal.ir.annotations.Immutable;
  31 import jdk.nashorn.internal.ir.visitor.NodeVisitor;
  32 
  33 /**
  34  * IR representation for synthetic jump into an inlined finally statement.
  35  */
  36 @Immutable
  37 public final class JumpToInlinedFinally extends JumpStatement {
  38     private static final long serialVersionUID = 1L;
  39 
  40     /**
  41      * Constructor
  42      *
  43      * @param labelName  label name for inlined finally block
  44      */
  45     public JumpToInlinedFinally(final String labelName) {
  46         super(NO_LINE_NUMBER, NO_TOKEN, NO_FINISH, Objects.requireNonNull(labelName));
  47     }
  48 
  49     private JumpToInlinedFinally(final JumpToInlinedFinally breakNode, final LocalVariableConversion conversion) {
  50         super(breakNode, conversion);
  51     }
  52 
  53     @Override
  54     public Node accept(final NodeVisitor<? extends LexicalContext> visitor) {
  55         if (visitor.enterJumpToInlinedFinally(this)) {
  56             return visitor.leaveJumpToInlinedFinally(this);
  57         }
  58 
  59         return this;
  60     }
  61 
  62     @Override
  63     JumpStatement createNewJumpStatement(final LocalVariableConversion conversion) {
  64         return new JumpToInlinedFinally(this, conversion);
  65     }
  66 
  67     @Override
  68     String getStatementName() {
  69         return ":jumpToInlinedFinally";
  70     }
  71 
  72     @Override
  73     public Block getTarget(final LexicalContext lc) {
  74         return lc.getInlinedFinally(getLabelName());
  75     }
  76 
  77     @Override
  78     public TryNode getPopScopeLimit(final LexicalContext lc) {
  79         // Returns the try node to which this jump's target belongs. This will make scope popping also pop the scope
  80         // for the body of the try block, if it needs scope.
  81         return lc.getTryNodeForInlinedFinally(getLabelName());
  82     }
  83 
  84     @Override
  85     Label getTargetLabel(final BreakableNode target) {
  86         assert target != null;
  87         // We're jumping to the entry of the inlined finally block
  88         return ((Block)target).getEntryLabel();
  89     }
  90 }